【发布时间】:2020-10-13 07:01:01
【问题描述】:
我有下面这个语法来实现一个IN 运算符,它获取一个数字或字符串的列表。
grammar listFilterExpr;
listFilterExpr: entityIdNumberListFilter | entityIdStringListFilter;
entityIdNumberProperty
: 'a.Id'
| 'c.Id'
| 'e.Id'
;
entityIdStringProperty
: 'f.phone'
;
listFilterExpr
: entityIdNumberListFilter
| entityIdStringListFilter
;
listOperator
: '$in:'
;
entityIdNumberListFilter
: entityIdNumberProperty listOperator numberList
;
entityIdStringListFilter
: entityIdStringProperty listOperator stringList
;
numberList: '[' ID (',' ID)* ']';
fragment ID: [1-9][0-9]*;
stringList: '[' STRING (',' STRING)* ']';
STRING
: '"'(ESC | SAFECODEPOINT)*'"'
;
fragment ESC
: '\\' (["\\/bfnrt] | UNICODE)
;
fragment SAFECODEPOINT
: ~ ["\\\u0000-\u001F]
;
如果我尝试解析以下输入:
c.Id $in: [1,1]
然后我在解析器中得到以下错误:
mismatched input '1' expecting ID
请帮我改正这个语法。
更新
我在我的项目的巨大语法文件中发现了以下规则方式,它可能在匹配到 ID 之前匹配“1”:
NUMBER
: '-'? INT ('.' [0-9] +)?
;
fragment INT
: '0' | [1-9] [0-9]*
;
但是,如果我在NUMBER 之前写我的ID 规则,那么其他事情就会失败,因为它们已经匹配了ID,而ID 应该匹配了NUMBER
我该怎么办?
【问题讨论】:
-
我认为你不希望
ID成为fragment。 -
即使我删除
fragment,它也会给我同样的错误。 -
@teenup 那么您可能没有重新生成词法分析器和解析器,因为它在删除
fragment时有效。另一种选择是您删除了太多刚刚发布的规则,并且您有一些冲突的词法分析器规则,您没有在原始问题中使用。始终发布一个独立的示例,以便其他人看到您所看到的。
标签: parsing antlr grammar lexer