1

次の文法のインタープリターで「___sad」を実行しようとすると

grammar identTest;
options       

{   
    language = Java;
    output=AST;
}


goal: identifier;

fragment Letter: (('a'..'z') | ('A'..'Z'));
fragment Digit : '0' .. '9';
identifier :IDENTIFIER;


IDENTIFIER: Letter+;
WS:(' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;};

インタープリター出力: 通訳者 デバッガー出力: デバッガ

インタープリターにはアンダースコア文字が含まれており、デバッガーはそれを無視しているようです! この場合、ある種の例外が発生することが予想されます (文法では「A」から「z」の文字のみが定義されているため)。私の文法の何が問題なのですか?

4

1 に答える 1

2

インタプリタは使用しないでください。バグがあります。

デバッガーを使用すると、Outputボタン(左下隅)を押した後にパーサーが生成する警告/エラー/例外を表示できます。そうすると、次のように表示されます。

.../__Test___input.txt line 1:0 no viable alternative at character '_'
.../__Test___input.txt line 1:1 no viable alternative at character '_'
.../__Test___input.txt line 1:2 no viable alternative at character '_'

パーサーは単にアンダースコアから回復し、解析を続行します。

レクサーをそのような実行可能な代替警告から回復させたくない場合は、フォールスルーレクサールール(と呼ばれるOTHER)を作成し、そこから例外をスローします。

grammar identTest;

options       
{   
    language = Java;
    output=AST;
}


goal       : identifier;
identifier : IDENTIFIER;

IDENTIFIER : Letter+;
WS         : (' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;};
OTHER      : . {throw new RuntimeException("unknown char: '" + $text + "'");};

fragment Letter : (('a'..'z') | ('A'..'Z'));
fragment Digit  : '0' .. '9';
于 2012-04-23T11:31:52.917 に答える