下面的代码片段上可以找到:http://zaach.github.io/jison/demos/calc/,也是jison文档页面。阅读 jison、lex 和 flex 文档后 - 我仍然不完全理解 %lex 和 /lex 语法。它特定于 jison 扫描仪生成器吗?意思是它提供稍后在文档中显示的 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
Run Code Online (Sandbox Code Playgroud)
和%lex标记/lex仅界定与扫描仪生成器相关的语法部分。标记%lex标记开始并/lex标记结束。
使用bisonand时flex,您可以将词法分析器的定义(Jison 术语中的“扫描仪生成器”)放在一个.l文件中,并将语法放在一个.y文件中。我认为不存在使用bison和flex(或yacc/lex)来组合这两个文件的方法。(已经很久没用了bison,flex有不知道的东西也不是不可能。)
事实是,尽管 Jison 的灵感来自bison和flex,但它确实是一个独立的工具。bison因此它确实包含或中没有等效项的功能flex。