2015-06-04 3 views
1

Я пишу грамматику ANTLRv4, чтобы реализовать простой механизм правил для синтаксического анализа сообщений FIX и указать действие, которое необходимо предпринять, когда это правило нарушено.Механизм правил на основе ANTLR в java

Это где моя грамматика в настоящее время составляет:

grammar RuleDefinition; 

ruleset: rule+; 

rule : 'tag(' INT ')' numberOp (INT | FLOAT| STRING) (ACTION_DIRECTOR action)?; 

ID  : [a-zA-Z]+ ;  // match identifiers 
INT  : [0-9]+;   // match integers 
FLOAT : '0'..'9'+('.'('0'..'9')*)? ;   // match float 
NEWLINE :'\r'? '\n' ;   // return newlines to parser (end-statement signal) 
WS  : [ \t\n\r]+ -> skip ; // toss out whitespace 
NUMBER_OP  : EQ|GR|GE|LS|LE|NE; 
numberOp  : EQ|GR|GE|LS|LE|NE; 
EQ  : '='; 
GR: '>'; 
GE: '>='; 
LS: '<'; 
LE: '<='; 
NE: '!='; 
ACTION_DIRECTOR : '->'; 
action: 'WARN' | 'ERROR'; 
STRING : '"' (' '..'~')* '"'; 

Проблемы в том, что сгенерированный код не может корректно разобрать, когда правило содержит ACTION_DIRECTOR (->), то ошибка, я получаю «несоответствующий вход 'ОШИБКА' ожидает ACTION»

Синтаксических успешен для:

tag(9)>0 

Синтаксических терпит неудачу для:

tag(9)>0 -> ERROR 

Любые указатели на то, как исправить это, очень ценятся.

ответ

0

Посмотрите на эти три линии:

WARN: 'WARN'; 
ERROR: 'ERROR'; 
ACTION: WARN|ERROR; 

Эти правила лексера (верхний регистр начального символа). Лексер несет ответственность за разделение вашего ввода на токены определенного типа. «ОШИБКА» может иметь только один тип токена, и ANTLR решает, что он равен ERROR (два правила: ERROR и ACTION, и ERROR).

Чтобы решить эту проблему превратить некоторые правила LeXeR для парсера правила (нижний регистр стартовый символ):

rule : 'tag' '(' INT ')' numberOp (INT | FLOAT| STRING) (ACTION_DIRECTOR action)*; 

.... 

action : WARN | ERROR; 
numberOp : EQ|GR|GE|LS|LE|NE; 
stringOp : EQ|NE; 

... 

правила Parser составляют лексемы вместо того, чтобы присоединиться к ним. Это означает, что действие может быть WARN или ERROR.

+0

Hi CoronA, спасибо за ваш ответ. К сожалению, я не могу заставить это работать. Я изменил свою грамматику в соответствии с рекомендациями, но я получаю «несоответствующий вход» = «ожидающий {'=', '>', '> =', '<', '<=', '! ='}". – Mahesh

+0

Обновите определение грамматики и строку примера, из-за которой синтаксический анализатор завершится с ошибкой. – CoronA

+0

Привет, CoronA, я обновил грамматик с вашими предложениями. Анализ синтаксического анализа завершился неудачей с «тегом (9)> 0», который был успешно проанализирован ранее. – Mahesh

Смежные вопросы