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
存在するかのカウンターを置く)? これを達成するためにセマンティクスを使用しないことをお勧めします。実際、構文に関連しているように思えます。