私は少し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が文字列を生成したとしても、文字列の定義が間違っていると思います。なぜこれが起こるのか誰かが知っていますか?
乾杯!