1

最後のセミコロンをオプションのままにして、特定のルールでセミコロンをオプションにしようとしています。現在、次のようなものがあります

A: 'A';
B: 'B';
C: 'B';
SEMICOLON: ';';

exprs : expr (SEMICOLON expr)* SEMICOLON?;

expr : A | B | C

次のような入力の解析用

A;
C;
B

ただし、「A」のセミコロンをオプションにする必要があります。これは、次のようなものを解析することを意味します

A
C;
B

私が問題を抱えている部分は、最後のセミコロンをオプションにすることを許可しながら、セミコロンを A のオプションにすることです。これを行う良い方法はありますか、それとも最後のセミコロンを必須にするだけですか?

(適当なタイトルが思いつかなかったので自由に変えてください)

4

1 に答える 1

2

SEMICOLON シンボルを expr に移動します (意味的にはそれに属します)。

expr:
    A SEMICOLON?
    | (B | C) {LA(1) != EOF}? SEMICOLON
;

exprs:
    expr+
;

更新: 先読みを使用して決定するように B および C ブランチを変更しました。

于 2013-06-18T07:17:53.883 に答える