0

私は得ています:

行 n:m 必須 (...)+ ループは、文字 u'#' で何にも一致しませんでした

しかし、パーサーは で終了し0 = parser.getNumberOfSyntaxErrors()、正しい AST を生成します。antlr3.exceptions.EarlyExitExceptionさらにチェックすると、パーサーに何らかの形で到達しないをスローするレクサーによってエラー メッセージが出力されていることが確認されます。

その時点で一致する必要がある語彙規則は次のとおりです。

LOCALVAR
    :
    '#' NAME_CHAR+ 
    ;

そして、入力の障害点は#I).

字句解析と解析が成功するのはなぜですか? 有効な入力でメッセージが表示されるのはなぜですか?

4

1 に答える 1

0

同様の問題に対する私の解決策:

DOT : '.' ;

INTEGER
    :
    DIGITS
    ;

FLOAT
    :
    (DIGITS DOT DIGITS)=> DIGITS DOT DIGITS
    ;

次のフレーズを解析する場合:

#J := #X(75.W)

レクサーは次のように抗議します。

行 n:m 必須 (...)+ ループは文字 u'W' で何にも一致しませんでした

ルールを次のように変更します。

FLOAT
    :
    DIGITS 
    (
       (DOT DIGIT)=>  DOT DIGITS 
    |
        () { $type=INTEGER }
    )
    ;

問題を修正しました。

問題の一部は、ANTLR lexer が RE ではなく LL であることです。

于 2012-12-13T03:58:09.300 に答える