【发布时间】:2021-06-25 10:31:40
【问题描述】:
我正在努力在 ANTLR4 中定义一个语法,其中分别包含单词和数字。
描述了数字:
NUM
: INTEGER+ ('.' INTEGER+)?
;
fragment INTEGER
: ('0' .. '9')
;
还有文字描述:
WORD
: VALID_CHAR +
;
fragment VALID_CHAR
: ('a' .. 'z') | ('A' .. 'Z')
;
下面的简化语法描述了单词或字母之间的加法(需要像这样递归定义):
expression
: left = expression '+' right = expression #addition
| value = WORD #word
| value = NUM #num
;
问题是当我在解析器中输入“d3”时,我得到了一个返回的单词“d”实例。同样,输入 3f 返回数值 3。有没有办法确保 'd3' 或任何类似字符串从语法返回错误消息?
我查看了“~”符号,但这似乎是“除此之外的所有内容”,而不是“仅”。
总而言之,我正在寻找一种方法来确保只能将一系列字母解析为单词,并且不包含其他符号。目前,该语法似乎忽略了任何其他不允许的字符。
类似于输入“3+”时收到的消息:
simpleGrammar::compileUnit:1:2: mismatched input '<EOF>' expecting {WORD, NUM}
目前出现以下情况:
d --> (d) (word) (correct)
22.3 --> (22.2) number (correct)
d3 --> d (word) (incorrect)
22f.4 --> 22 (number) (incorrect)
但理想情况下会发生以下情况:
d --> (d) (word) (correct)
22.3 --> (22.2) number (correct)
d3 --> (error)
22f.4 --> (error)
【问题讨论】:
-
一个额外的开始规则:
S : expression ENDOFTEXT;将在 "3f" 中的 "3" 之后期望和结束文本。
标签: java regex parsing antlr antlr4