aki*_*kim 7 yacc bison parser-generator
当使用带有空右侧的规则编写("理论")语法时,总是使用诸如ε(或1)之类的符号来使这个空白显式:
A ? ? | a A
Run Code Online (Sandbox Code Playgroud)
Yacc和其他人的这种语法看起来就像
a: | 'a' a
Run Code Online (Sandbox Code Playgroud)
或"更糟"
a: { $$ = new_list(); }
| a 'a' { $$ = $1; $$->append($1); }
;
Run Code Online (Sandbox Code Playgroud)
事实上,在"真实世界语法"(Yacc,Bison等)规则的这个空的右侧部分没有明确标记为空的麻烦我:很容易错过rhs空的事实,或者更糟糕的是:忘记插入|并实际使用中规则操作:
a: { $$ = new_list(); }
a 'a' { $$ = $1; $$->append($1); }
;
Run Code Online (Sandbox Code Playgroud)
1)我不知道有任何工具可以提供显式空rhs的方法.有吗?
Bison的未来版本可能支持专用符号,在非空rhs中使用时会出现错误,而在留下隐式空rhs时会出现警告.
2)人们认为这有用吗?
3)你建议的符号是什么?
目前,候选人是$empty:
a: $empty { $$ = new_list(); }
| a 'a' { $$ = $1; $$->append($1); }
;
Run Code Online (Sandbox Code Playgroud)
选择的语法是%empty:
a: %empty { $$ = new_list(); }
| a 'a' { $$ = $1; $$->append($1); }
;
Run Code Online (Sandbox Code Playgroud)
确实$empty看起来像一个伪符号,例如$acceptBison为初始规则生成的$@n伪符号,或者用于中规则动作的伪符号,或者$eof用于文件结尾.但它绝对不是一个符号,它恰恰是缺少符号.
另一方面,%清楚地表示指令(某种属性/元数据),如%pred.
所以这是语法的一个细微差别,但它与整体语法更加一致.归功于Joel E. Denny.
我通常只是使用评论:
a: /*epsilon*/ { $$ = new_list(); }
| a 'a' { $$ = $1; $$->append($1); }
;
Run Code Online (Sandbox Code Playgroud)
工作正常,没有任何变化,使意图明确....
国际海事组织,这标题为"如果没有破产,请不要修理"
| 归档时间: |
|
| 查看次数: |
9038 次 |
| 最近记录: |