我正在处理一个小蚂蚁问题。在我的小型自定义 DSL 中,我希望能够在字段之间进行比较操作。我有三个字段类型(字符串、整数、标识符)标识符是一个变量名。我做了一个很大的规范,但我已经将我的问题减少到一个更小的语法。
问题是,当我尝试使用字符串语法符号时,您可以使用 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 为我生成了它。有人知道为什么会这样吗?
干杯!