2014-01-31 3 views
1

Я относительно новичок в 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»? Как я могу понять, в чем проблема? Любая помощь будет высоко ценится!

+0

Обратите внимание, что ошибки указывают на '' '' ', то есть на одну цитату на вашем входе. У вас нет ничего в правилах lexer/parser для обработки строки с кавычками, т. Е. ''Red''. Это было бы ответом, за исключением того, что я не знаю достаточно об ANTLR4, чтобы рассказать вам, как решить проблему. Вы можете изменить ввод на «Exists node» в GraphA -> node.color = red' без кавычек вокруг «красного», и это должно разобрать ОК. –

+0

хорошо у меня есть COLORTYPE: ('a' .. 'z') +; который должен иметь возможность анализировать «красный» – Wosh

+0

Неправда. Он будет анализировать «красный», но не «красный». Кавычками в правиле являются метасимволы ANTLR. –

ответ

2

Проблема COLORTYPE соответствует введенным red, но вы на самом деле указали 'red'. Вам необходимо сделать одно из следующего:

  1. Удалите котировки вокруг red на вашем входе.
  2. Добавить цитаты к вашему COLORTYPE правилу:

    COLORTYPE : '\'' [a-z]+ '\''; 
    
2

Переместить COLORTYPE last; он также соответствует ключевым словам. ANTLR устраняет двусмысленности в отношении упомянутого выше правила.

+0

Я сделал это и по-прежнему получил ту же ошибку – Wosh

+0

ну, вам нужно переместить его, но вам также нужно осознать вы нигде не соглашаетесь ни на одну цитату. Наверное, этого не захочет? См. Запись Сэма. –

1

Когда я сделать следующие изменения в грамматике, это работает для меня:

  1. Move ColorType до конца, так как как отмечали другие, он соответствует вашим ключевым словам.

  2. Изменение 'условие' правило:

    атом РАВНО ЦИТАТА? (присваивание | атом) QUOTE?

  3. Добавьте это в конце:

    цитирую: '\'»;

0

я немного поздно я думаю, но

"No method for rule r or it has arguments"

это получается, потому что вы вызываете что-то вроде этого

C:\>grun graph r -gui 

вы должны использовать

C:\>grun graph input -gui 
Смежные вопросы