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 ;

はトークンSC間の区切り記号 (セミコロン) でありhour_l、時間のリストの非終端記号です。このソリューションには問題があります。HOURイプシロンは に還元できるため、 が存在しない可能性がありますhour_l。すべての可能性を指定するか、CUP のセマンティック機能を使用するよりも賢い解決策があります (つまり、セクションに何回HOUR存在するかのカウンターを置く)? これを達成するためにセマンティクスを使用しないことをお勧めします。実際、構文に関連しているように思えます。

4

1 に答える 1

0

友人が OOB を提案した私の解決策は、Finite State Machine を使用することです。

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 に答える