规则空缺右侧的符号

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.

Chr*_*odd 5

我通常只是使用评论:

a: /*epsilon*/ { $$ = new_list(); }
 | a 'a'  { $$ = $1; $$->append($1); }
 ;
Run Code Online (Sandbox Code Playgroud)

工作正常,没有任何变化,使意图明确....

国际海事组织,这标题为"如果没有破产,请不要修理"


Dav*_*ine 2

我自己使用过epsilon,以及marker空产品的变体,我在大括号中附加了一些代码。

野牛语法中的保留符号会很有用;我喜欢建议的 $ 前缀,以避免与用户命名的符号发生冲突。