我正在尝试在 LALR(1) 语法(使用 CUP 解析器)中定义一个非终结符号。要求
the <code> token must appear exactly two times,
while <hour> token must appear at least one time.
最后我想出了这个定义:
section ::= hour_l CODE SC hour_l CODE SC hour_l ;
hour_l ::= /* epsilon */
| hour_l HOUR SC ;
whereSC
是标记之间的分隔符(分号),并且hour_l
是小时列表的非终端符号。这个解决方案有一个问题:HOUR
不能存在,因为 epsilon 可以减少到hour_l
. 除了指定所有可能性或使用 CUP 的语义功能(即在部分中放置多少次的计数器)之外,还有一个聪明的解决方案HOUR
吗?我宁愿不使用语义来实现这一点;事实上,在我看来它与语法有关。