2

Antlr 3 から Antlr 4 にアップグレードしたとき、文法のすべての構文述語を削除しました。しかし、それを変更すると、タイトルに記載されているようにエラーが発生します。

変更後のコードです

NUMBER 
    :(
      '0'..'9' ('.' '0'..'9'+)?
    | '.' '0'..'9'+
    )
    (
        E
        (
              M     { $type = EMS;          }
            | X     { $type = EXS;          }
        )
    |   P
        (
              X     
            | T
            | C
        )
                    { $type = LENGTH;       }   
    |   C M         { $type = LENGTH;       }
    |   M
        (
              M     { $type = LENGTH;       }

            | S     { $type = TIME;         }
        )
    |   I N         { $type = LENGTH;       }

    |   D E G       { $type = ANGLE;        }
    |   R A D       { $type = ANGLE;        }

    |   S           { $type = TIME;         }

    |   K? H    Z   { $type = FREQ;         }

    | IDENT         { $type = DIMENSION;    }

    | '%'           { $type = PERCENTAGE;   }

    | // Just a number
    )
;

これは私が得ているエラーです。 ここに画像の説明を入力

この質問に対する回答を見ましたhere。しかし、私はそれが何を意味するのか理解できませんでした。どなたかご指南ください。

編集:

同じエラーがここの文法に表示されます。

    fragment    INVALID :;
     STRING          : '\'' ( ~('\n'|'\r'|'\f'|'\'') )* 
                    (

                            '\''
                            | { $type = INVALID;   }
                    )

                | '"' ( ~('\n'|'\r'|'\f'|'"') )*
                    (
                         '"'
                        | { $type = INVALID;   }
                    )
                ;

これを ANTLR 4 に変更できませんでした。このコードの新機能は何ですか? これを早急に解決してください。

4

1 に答える 1

2

あなたのNUMBERルールは手動で大幅に左因数分解されています。実際には、9 種類のトークンを生成する単一のレクサー ルールです。左因数分解は、ANTLR 3 レクサーが再帰降下パーサーで予測を使用する方法が原因で実行された可能性があります。ANTLR 4 は、DFA に基づくまったく異なるレクサー アルゴリズムを使用します。表示されるエラーは、この変更の結果です。ANTLR 4 レクサーは再帰降下パーサーではなくなったため、任意のポイントでアクション コードを実行する機能がなくなりました。

ANTLR 4 で上記のルールを記述する最も効果的な方法は、ANTLR 3 の「非効率的な」構文を使用することです。ANTLR 4 では、遅くはありません。

EMS
    : NUMBER E M
    ;
EXS
    : NUMBER E X
    ;
LENGTH
    : NUMBER P X
    | NUMBER P T
    | NUMBER P C
    | NUMBER C M
    | NUMBER M M
    | NUMBER I N
    ;
TIME
    : NUMBER M S
    | NUMBER S
    ;
ANGLE
    : NUMBER D E G
    | NUMBER R A D
    ;
FREQ
    : NUMBER K? H Z
    ;
DIMENSION
    : NUMBER IDENT
    ;
PERCENTAGE
    : NUMBER '%'
    ;
NUMBER
    : [0-9] ('.' [0-9]+)?
    | '.' [0-9]+
    ;
于 2013-08-27T04:13:24.170 に答える