0

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

4

1 回答 1

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

并将其转换为正确的正则语法。

希望能帮助到你。谢谢

于 2013-02-21T20:55:00.723 回答