我试图在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 ;
其中SC
是标记之间的分隔符(分号),而hour_l
是小时列表的非终结符号。此解决方案存在一个问题:HOUR
可能不存在,因为epsilon可以减少到hour_l
。有一个聪明的解决方案,而不是指定所有可能性或使用CUP的语义功能(即,计算部分中存在多少次HOUR
)?我宁愿不使用语义来实现这一目标;事实上,在我看来它与语法有关。
答案 0 :(得分:0)
我的解决方案,由朋友建议OOB,是使用有限状态机:
section ::= c ;
a ::= CODE SC ;
b ::= a CODE SC ;
c ::= c HOUR SC | b HOUR SC | e CODE SC ;
d ::= HOUR SC | d HOUR SC ;
e ::= e HOUR SC | a HOUR SC | d CODE SC ;
c
是此机器接受的最终状态。我画了一个确定性有限自动机
并将其转换为Right Regular Grammar。
希望它有所帮助。感谢