1

最初のルールは機能しません。'ID1.ID2.ID3.ID4.ID5'のようなものを処理する必要があります。しかし、他のルールは期待どおりに機能します。何が問題なのですか?

grammar testInt;

data_source:
     (ID '.' ID '.' ID ('.' ID)+)=>program_ref
    | (ID '.' ID '.' ID)=>var_ref
    | (ID '.' ID)=>program_ref
    | resource;

program_ref: ID ('.' ID)+;
var_ref:    ID '.' ID '.' ID;
resource:   ID;

ID:  (LETTER | ('_'(LETTER | DIGIT))) ('_'? (LETTER | DIGIT))*;
WSFULL:(' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;};

fragment LETTER: (('a'..'z') | ('A'..'Z'));
fragment DIGIT: '0'..'9';
4

1 に答える 1

1

ANTLRが最初に一致しようとするのは、後者が2var_refprogram_ref一致する可能性があり、3IDvar_ref一致し、パーサーがトークンに貪欲に一致するためです。

これは単なるダミー(あなたの一部)の文法だと思います:あなたが解決しようとしている現実の問題はありますか?

于 2012-05-11T17:59:41.373 に答える