jison 中的 %lex 和 /lex 行是什么?

aaa*_*aaa 5 jison

下面的代码片段上可以找到: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)

Lou*_*uis 5

%lex标记/lex仅界定与扫描仪生成器相关的语法部分。标记%lex标记开始并/lex标记结束。

使用bisonand时flex,您可以将词法分析器的定义(Jison 术语中的“扫描仪生成器”)放在一个.l文件中,并将语法放在一个.y文件中。我认为不存在使用bisonflex(或yacc/lex)来组合这两个文件的方法。(已经很久没用了bisonflex有不知道的东西也不是不可能。)

事实是,尽管 Jison 的灵感来自bisonflex,但它确实是一个独立的工具。bison因此它确实包含或中没有等效项的功能flex