Thread: [cedet-semantic] wisent-compile-grammar at runtime?
Brought to you by:
zappo
From: Oliver S. <alk...@gm...> - 2003-12-14 10:53:09
|
I compile a parser automaton in a `eval-when-compile' statement, so that my packages requires wisent-comp only at compile time: (defconst xpath-tables (eval-when-compile (wisent-compile-grammar '((NCNAME LITERAL NUMBER VARIABLEREFERENCE [...] I seem to recall that I have either read this somewhere or that it worked previously (I am now using cedet beta, downloaded a few weeks ago.) But when I load the *compiled* file in a fresh Emacs (i.e. no call to wisent-compile-grammar' ever) and try to run my parser, then I get this backtrace (shortened): Debugger entered--Lisp error: (void-function AxisName:3) AxisName:3([0 ("child" 1 . 6) 11 nil ... ]) wisent-parse([[(... ... ] 3]) "AxisName" is one of my non-terminals. The automaton works flawlessly if I eval the `wisent-compile-grammar' form. Is this a bug or am I missing something? Oliver -- 24 Frimaire an 212 de la Révolution Liberté, Egalité, Fraternité! |
From: David P. <dav...@wa...> - 2003-12-14 11:33:11
|
Hi Oliver, > I compile a parser automaton in a `eval-when-compile' statement, so > that my packages requires wisent-comp only at compile time: > > (defconst xpath-tables > (eval-when-compile > (wisent-compile-grammar > '((NCNAME LITERAL NUMBER VARIABLEREFERENCE > [...] > > I seem to recall that I have either read this somewhere or that it > worked previously (I am now using cedet beta, downloaded a few weeks > ago.) > > But when I load the *compiled* file in a fresh Emacs (i.e. no call to > wisent-compile-grammar' ever) and try to run my parser, then I get > this backtrace (shortened): > > Debugger entered--Lisp error: (void-function AxisName:3) > AxisName:3([0 ("child" 1 . 6) 11 nil ... ]) > wisent-parse([[(... ... ] 3]) > > > "AxisName" is one of my non-terminals. > > The automaton works flawlessly if I eval the `wisent-compile-grammar' > form. > > Is this a bug or am I missing something? To produce correct byte-compiled code the grammar compiler must have been loaded before actually entering `wisent-compile-grammar', to correctly setup the Emacs byte-compiler environment. You can use the following form: (defconst xpath-tables (progn (eval-when-compile (require 'wisent-comp)) (wisent-compile-grammar '((NCNAME LITERAL NUMBER VARIABLEREFERENCE [...] Good luck! David |
From: Oliver S. <epa...@gm...> - 2003-12-14 12:08:47
|
Thanks for your quick reply. David Ponce <dav...@wa...> writes: [...] > To produce correct byte-compiled code the grammar compiler must have > been loaded before actually entering `wisent-compile-grammar', to > correctly setup the Emacs byte-compiler environment. > > You can use the following form: > > (defconst xpath-tables > (progn > (eval-when-compile > (require 'wisent-comp)) > (wisent-compile-grammar > '((NCNAME LITERAL NUMBER VARIABLEREFERENCE > [...] *hahaha* I was not aware that `wisent-comp' takes special care to byte-compile the automaton correctly. My thoughts were: (1) `wisent-compile-grammar' is a function not macro, (2) the automaton is a vector, so (3) I have to make sure that the automaton is inserted as a constant in the byte-compiled code. [I had (eval-when-compile (require 'wisent-comp)) in the top-level.] :-) FYI: Now I get another error when loading the *.elc file: (defconst xpath-tables defconst-tmp-var) eval((defconst xpath-tables defconst-tmp-var)) byte-code( ... ) load-file("d:/egoge/akt/lisp/xml/xpath-parser.elc") Maybe this is a bug in the loader or in the byte-compiler. It happens both with Emacs 21.3.50 (quite old by now) and Emacs 22.0.0.1. I'll investigate whether this happens with 21.3 and report either here or on ema...@gn.... Oliver -- Oliver Scholz 24 Frimaire an 212 de la Révolution Taunusstr. 25 Liberté, Egalité, Fraternité! 60329 Frankfurt a. M. http://www.jungdemokratenhessen.de Tel. (069) 97 40 99 42 http://www.jdjl.org |
From: David P. <dav...@wa...> - 2003-12-14 12:53:10
|
> *hahaha* I was not aware that `wisent-comp' takes special care to > byte-compile the automaton correctly. My thoughts were: (1) > `wisent-compile-grammar' is a function not macro, (2) the automaton > is a vector, so (3) I have to make sure that the automaton is > inserted as a constant in the byte-compiled code. > [I had (eval-when-compile (require 'wisent-comp)) in the top-level.] It is necessary to take special care to byte-compile the automaton because it includes an internal obarray used to quickly dispatch semantic actions (in fact, [byte-compiled] lambda expressions). > FYI: Now I get another error when loading the *.elc file: > > (defconst xpath-tables defconst-tmp-var) > eval((defconst xpath-tables defconst-tmp-var)) > byte-code( ... ) > load-file("d:/egoge/akt/lisp/xml/xpath-parser.elc") What is actually the error? I can't see it from the backtrace above. > > Maybe this is a bug in the loader or in the byte-compiler. It > happens both with Emacs 21.3.50 (quite old by now) and Emacs > 22.0.0.1. I'll investigate whether this happens with 21.3 and report > either here or on ema...@gn.... FYI, it works well for me using GNU Emacs 21.3.50 (latest CVS) and official 21.3.1, and XEmacs 21.4.14. David |
From: Oliver S. <epa...@gm...> - 2003-12-14 13:15:37
|
David Ponce <dav...@wa...> writes: [...] >> FYI: Now I get another error when loading the *.elc file: >> (defconst xpath-tables defconst-tmp-var) >> eval((defconst xpath-tables defconst-tmp-var)) >> byte-code( ... ) >> load-file("d:/egoge/akt/lisp/xml/xpath-parser.elc") > > What is actually the error? I can't see it from the backtrace above. Oops! The pitfalls of copy&paste ... The error is: Debugger entered--Lisp error: (void-variable defconst-tmp-var) (defconst xpath-tables defconst-tmp-var) [...] [...] > FYI, it works well for me using GNU Emacs 21.3.50 (latest CVS) and > official 21.3.1, and XEmacs 21.4.14. Weird then. Maybe it is something particular with my grammar. Any recommendations on how to debug this? I am going to update from the CVS later today, though, just to be sure. Oliver -- Oliver Scholz 24 Frimaire an 212 de la Révolution Taunusstr. 25 Liberté, Egalité, Fraternité! 60329 Frankfurt a. M. http://www.jungdemokratenhessen.de Tel. (069) 97 40 99 42 http://www.jdjl.org |
From: David P. <dav...@wa...> - 2003-12-14 13:37:17
|
> Debugger entered--Lisp error: (void-variable defconst-tmp-var) > (defconst xpath-tables defconst-tmp-var) Is defconst-tmp-var a constant where you actually define your automaton? Is it defined before its reference in (defconst xpath-tables defconst-tmp-var)? Anyway this error looks strange... Maybe could you send me your grammar to test it on my configuration? David |
From: David P. <dav...@wa...> - 2003-12-14 17:21:29
|
Oliver, > I have reduced the grammar to the bare minimum necessary to reproduce > the error. It seem that if I comment out just one single line now, > then it compiles and loads flawlessly. > > I don't know whether it is worth anything, but I also noticed the > following pecularity: > > With the attached file test.el: If I do > M-x emacs-lisp-byte-compile-and-load RET I get this backtrace: > > Debugger entered--Lisp error: (void-variable defconst-tmp-var) > (defconst xpath-tables defconst-tmp-var) > eval((defconst xpath-tables defconst-tmp-var)) > ^^^^^^^^^^^^ > > If I change `(defconst xpath-tables [...]' to > `(defvar xpath-tables [...]': > > Debugger entered--Lisp error: (void-variable defconst-tmp-var) > (defconst lirum-larum defconst-tmp-var) > eval((defconst lirum-larum defconst-tmp-var)) > ^^^^^^^^^^^ > > Then if I comment the `(defconst lirum-larum [...]' out, so that > there is only the `(defvar xpath-tables [...]', then the file > compiles and loads properly. I compiled your example with GNU Emacs 21.3.50 (latest CVS) and the byte-code failed to load with the same error you got :-( To be sure I byte-compiled it with both GNU Emacs 21.3.1 and XEmacs 21.4.14, and in both cases the compiled code loaded without any problem! This looks like a serious bug in the development version of the byte-compiler. As a workaround, with doc strings there is no problem! David |
From: Oliver S. <epa...@gm...> - 2003-12-14 17:54:28
|
David Ponce <dav...@wa...> writes: [...] > This looks like a serious bug in the development version of the > byte-compiler. Thanks for confirmation. I have sent a bug report. > As a workaround, with doc strings there is no problem! [...] *hehehe* This is probably Emacs' subtle way to tell me that I should document my code! This info helps a lot. Thank you. Oliver -- Oliver Scholz 24 Frimaire an 212 de la Révolution Taunusstr. 25 Liberté, Egalité, Fraternité! 60329 Frankfurt a. M. http://www.jungdemokratenhessen.de Tel. (069) 97 40 99 42 http://www.jdjl.org |