RE: [CEDET-devel] problem parsing legal c++ declaration
Brought to you by:
zappo
From: Berndl, K. <kla...@sd...> - 2003-04-04 14:58:19
|
Hi guys, here is the first try of a test-function which enables regression-tests for grammar/parser changes: (defun klaus-semantic-test (file &optional with-overlay-info) "Runs `semantic-prin1-nonterminal' on every token in current buffer and writes the output to FILE. This gives a regression-able test of a grammar/parser because you can run this function on a testfile F before grammar-changes and after grammar-changes and compare the two output-files with diff. Normally the position-informations in form of the #<overlay from X to Y> are filtered out by this function so the parsing check is independent from changing whitespace or comments in the testfiles. But if WITH-OVERLAY-INFO is not nil the overlay-informations are preserved also in the outputfile." (interactive "FInsert file-name for test-output: \nP") (goto-char (point-min)) (let ((senator-step-at-token-ids nil) (senator-step-at-start-end-token-ids nil) (buf (get-buffer-create "*Semantic regression test*")) tok par str) (save-excursion (set-buffer buf) (erase-buffer)) (semantic-bovinate-toplevel) (while (senator-next-token) (setq tok (semantic-current-nonterminal)) (setq par (or (semantic-current-nonterminal-parent) (if (semantic-token-function-parent tok) (semantic-find-nonterminal-by-name (semantic-token-function-parent tok) (current-buffer))) )) (setq str (semantic-prin1-nonterminal tok par t)) (save-excursion (set-buffer buf) (goto-char (point-max)) (insert str) (insert "\n"))) (save-excursion (set-buffer buf) (when (not with-overlay-info) (goto-char (point-min)) (while (re-search-forward "#<overlay from [0-9]+ to [0-9]+ in [^>]+>" nil t) (replace-match "#<overlay ...>"))) (write-region (point-min) (point-max) file)) ;; (kill-buffer buf) (goto-char (point-min)))) Maybe somehow a little bit clumsy but it seems to work and can be a starting- point.... Maybe we could add an automatic diff-run against a customizable reference-output?! Maybe we could change it so the function runs only on a region in current buffer, could be useful too?! tested with semantic-1.4.3 and GNU Emacs 21.2 and the file test.cpp. Suggestions? Ciao Klaus -----Original Message----- From: David PONCE [mailto:dav...@wa...] Sent: Friday, April 04, 2003 3:26 PM To: Berndl, Klaus Cc: cedet-devel Subject: Re: [CEDET-devel] problem parsing legal c++ declaration Hi Klaus, [...] >>Is it a bug in the parser? > > > Yes, but now its a fixed bug :-) > > I have just checked in a new c.bnf and semantic-c.el in the branch v1p4 > which fixes parsing bugs like these. Thanks for the fix! I sync'd the trunk with your changes. [...] > Suggestion: > What about a function which runs for every token in a file > semantic-test-all-token->text-functions and puts the whole output for > this file in file which then can be used a reference. > > After grammar changes we just run the new grammar/parser against the > test-files, call the new output-generate-function and do then a diff > between the new output of the new parser and the old reference-output- > file ---> would be an easy, fast and save way to ensure that changes > do not damage something what was working ok before the changes. Sounds like a good idea! > IMHO regression-able tests are very valueable!! Agree. > Should not be hard to write such a function....... Maybe could you provide a first implementation ;-) David |