你的输入
$.name
无法按规则分析:
dnot : ROOT expr ('.' expr)
| EOF
;
名字
生成2个令牌:
-
ROOT
-
ID
但是你的第一个选择,
ROOT expr ('.' expr)
,需要2个表达式,用
.
. 也许您打算让第二个expr成为可选的,如下所示:
dnot : ROOT expr ('.' expr)*
| EOF
;
以及
EOF
通常在开始规则的末尾添加,以强制解析器使用所有令牌。正如您现在所做的,解析器成功地解析了
ROOT expr
,但未能进一步分析,并生成您看到的警告(应为“.”)。
自从
objectPath
似乎是你的开始规则,我认为这是你想要做的:
objectPath : dnot EOF;
dnot : ROOT expr ('.' expr)?
;
另外,像这样的代币
[]
,
'[?('
等等,看起来可疑。我不太熟悉对象路径,但是通过将这些字符粘在一起,像这样输入
[ ]
(
[
和
]
以空格分隔)将不匹配
[]
. 所以如果
foo[ ]
有效,我改为这样写:
select : ID '[' ']' #selectAll
| ...
并跳过lexer中的空格:
SPACES : [ \t\r\n]+ -> skip;