0

数値が 0^n 1^n の形式であるかどうかを確認する Yacc プログラムがあります。

%start S
%%
    S:'0' S '1' {printf("Success\n");}|;
%%

(すべてのトークンは lex ファイルで定義されます)

私が得る出力は次のとおりです

0011
Success
Success
syntax error

1100
syntax error

Success が 2 回出力される理由は理解できますが、最初の出力で構文エラーが発生しているのは何ですか?

bisonさらに、 LALR(1) パーサー ジェネレーターはこのタスクをどのように行うのでしょうか?

4

2 に答える 2

1

問題は、文法が無限の文字列にのみ一致することです。文法で記述された言語には有限の文字列はありません。

その文字列またはそれから構築された文字列を受け入れることができるように、有限文字列で「基本ケース」を追加する必要があります。明らかなケースは空の文字列です (n = 0 の場合):

S : /* empty */
  | '0' S '1'
  ;
于 2013-10-20T19:23:35.077 に答える