如何在CUP解析器语法中的两个标记之间定义至少一个字符串

时间:2013-02-20 10:45:00

标签: parsing grammar formal-languages cup

我试图在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)?我宁愿不使用语义来实现这一目标;事实上,在我看来它与语法有关。

1 个答案:

答案 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是此机器接受的最终状态。我画了一个确定性有限自动机

DFA

并将其转换为Right Regular Grammar。

希望它有所帮助。感谢