Я относительно новичок в ANTLR, так что медведь со мной PLS.ANTLR4 вопрос анализатора грамматики
У меня есть следующая имитация грамматики для разбора очень простых первого порядка логических формул:
grammar graph;
/*------------------------------------------------------------------
* PARSER RULES
*------------------------------------------------------------------*/
input
:
TRUE | FALSE | formula | EOF
;
formula
:
(element)+ ST condition
;
element
:
quantifier IN domain
;
condition
:
atom EQUALS (assignment | atom)
;
atom
:
variable DOT property
;
quantifier
:
(FOREACH | EXISTS) variable
;
domain
:
(GRAPH_A | GRAPH_B)
;
variable
:
(NODE | EDGE)
;
property
:
(COLOR | VALUE)
;
assignment
:
(COLORTYPE | NUMBER)
;
/*------------------------------------------------------------------
* LEXER RULES
*------------------------------------------------------------------*/
COLORTYPE : ('a'..'z')+ ;
NUMBER : ('0'..'9')+ (DOT ('0'..'9')+)? ;
WS : [ \t\r\n]+ -> skip ;
EXISTS : 'Exists' ;
FOREACH : 'Foreach' ;
TRUE : 'True' ;
FALSE : 'False' ;
ST : '->' ;
NODE : 'node' ;
EDGE : 'edge' ;
IN : 'in' ;
GRAPH_A : 'GraphA' ;
GRAPH_B : 'GraphB' ;
COLOR : 'color' ;
VALUE : 'value' ;
EQUALS : '=' ;
DOT : '.' ;
грамматика довольно проста. Я был в состоянии произвести лексические и синтаксический анализ классы с
java org.antlr.v4.Tool graph.g4
, но когда я пытаюсь разобрать следующее выражение
Exists node in GraphA -> node.color = 'red'
я заканчиваю со следующей ошибкой:
линии 1:38 маркер ошибки распознавания в: '' '
линии 1:42 маркера ошибки распознавания в: '''
Нет метода для правила r или аргументов
В чем смысл правила «r»? Как я могу понять, в чем проблема? Любая помощь будет высоко ценится!
Обратите внимание, что ошибки указывают на '' '' ', то есть на одну цитату на вашем входе. У вас нет ничего в правилах lexer/parser для обработки строки с кавычками, т. Е. ''Red''. Это было бы ответом, за исключением того, что я не знаю достаточно об ANTLR4, чтобы рассказать вам, как решить проблему. Вы можете изменить ввод на «Exists node» в GraphA -> node.color = red' без кавычек вокруг «красного», и это должно разобрать ОК. –
хорошо у меня есть COLORTYPE: ('a' .. 'z') +; который должен иметь возможность анализировать «красный» – Wosh
Неправда. Он будет анализировать «красный», но не «красный». Кавычками в правиле являются метасимволы ANTLR. –