下面的代码片段可以在:http://zaach.github.io/jison/demos/calc/和jison文档页面上找到。在阅读了jison、lex和flex文档之后,我仍然不能完全理解%lex和/lex语法。是监狱扫描仪发生器特有的吗?意思是它的唯一功能是提供json输出稍后在文档中显示?我之所以这么问,是因为jison文档没有明确解释它的用途,而且flex/lex规则似乎不允许这种语法。
/* description: Parses end executes mathematical expressions. */
/* lexical grammar */
%lex
%%
s+ /* skip whitespace */
[0-9]+("."[0-9]+)?b return 'NUMBER';
"*" return '*';
"/" return '/';
"-" return '-';
"+" return '+';
"^" return '^';
"(" return '(';
")" return ')';
"PI" return 'PI';
"E" return 'E';
<<EOF>> return 'EOF';
/lex
%lex
和/lex
标记只分隔属于扫描器生成器的语法部分。%lex
标志开始,/lex
标志结束。
当使用bison
和flex
时,您将词法分析器的定义(Jison术语中的"扫描仪生成器")放在.l
文件中,并将语法放在.y
文件中。我不认为有一种方法使用bison
和flex
(或yacc/lex
)来组合这两个文件。(我已经很长时间没有使用bison
和flex
了,所以不可能有什么我不知道的。)
事实是,尽管Jison的灵感来自bison
和flex
,但它实际上是一个独立的工具。因此,它确实包含了bison
或flex
中没有对应的功能。