Ваш ввод $.name
не может быть проанализирован по вашему правилу:
dnot : ROOT expr ('.' expr)
| EOF
;
$.name
производит 2 токена:
ROOT
ID
Но ваша первая альтернатива, ROOT expr ('.' expr)
, ожидает 2 выражения, разделенных .
. Возможно, вы хотели сделать второй expr необязательным, например:
dnot : ROOT expr ('.' expr)*
| EOF
;
И EOF
обычно добавляется в конце вашего правила запуска, чтобы заставить анализатор использовать все токены. Как вы и сделали, анализатор успешно проанализировал ROOT expr
, но затем не смог выполнить дальнейший анализ и выдает предупреждение, которое вы видели (ожидая '.').
Так как objectPath
кажется вашим правилом старта, я думаю, это то, что вы хотите сделать:
objectPath : dnot EOF;
dnot : ROOT expr ('.' expr)?
;
Кроме того, подобные токены []
, '[?('
и т. Д. Выглядят подозрительно. Я не очень знаком с Object Path, но, склеивая эти символы друг с другом, ввод, подобный этому [ ]
([
и ]
, разделенные пробелом), не будет совпадать с []
. Так что, если foo[ ]
действительно, я бы написал это так:
select : ID '[' ']' #selectAll
| ...
и пропустить пробелы в лексере:
SPACES : [ \t\r\n]+ -> skip;