1

私は少しantlrの問題に取り組んでいます。私の小さなカスタムDSLでは、フィールド間の比較アクションを実行できるようにしたいと考えています。3つのフィールドタイプ(String、Int、Identifier)があります。Identifierは変数名です。私は大きな仕様を作成しましたが、問題を小さな文法に減らしました。

問題は、antlrworksを使用して文法に追加できる文字列文法表記を使用しようとすると、文字列が識別子として表示されることです。これが私の文法です:

grammar test;

x
    : 'FROM' field_value EOF
    ;

field_value
    : STRING
    | INT
    | identifier
    ;

identifier
    : ID (('.' '`' ID '`')|('.' ID))?
    | '`' ID '`' (('.' '`' ID '`')|('.' ID))?
    ;

ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
    ;

INT :   '0'..'9'+
    ;

STRING
    :  '"' ( ESC_SEQ | ~('\\'|'"') )* '"'
    ;

fragment
HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ;

fragment
ESC_SEQ
    :   '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
    |   UNICODE_ESC
    |   OCTAL_ESC
    ;

fragment
OCTAL_ESC
    :   '\\' ('0'..'3') ('0'..'7') ('0'..'7')
    |   '\\' ('0'..'7') ('0'..'7')
    |   '\\' ('0'..'7')
    ;

fragment
UNICODE_ESC
    :   '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT
    ;

次の文字列を解析しようとすると、次のFROM "Hello!"ような解析ツリーが返されます

       <grammar test>
             |
             x
             |
----------------------------
 |           |             |
FROM    field_value        !
             |
         identifier
             |
          "Hello

それは、私の識別子がダブルクォーツについて何も言っていないので、それが一致しないはずだと思った識別子への文字列であるべきだと思うものを解析します。

さらに、antlrworksが文字列を生成したとしても、文字列の定義が間違っていると思います。なぜこれが起こるのか誰かが知っていますか?

乾杯!

4

1 に答える 1

1

文法に問題はありません。あなたのためにそれを台無しにしているのは、おそらくあなたがANTLRWorksのインタプリタを使用しているという事実です。しないでください。通訳はうまくいきません。

代わりにANTLRWorksのデバッガーを使用してください(文法では、CTRL+を押してくださいD)。これは魅力のように機能します。これは、デバッガーが解析後に表示するものFROM "Hello!"です。

ここに画像の説明を入力してください

于 2012-08-10T08:49:47.847 に答える