Я пытаюсь создать лексер с несколькими режимами, используя Antlr 4.7. Мой лексер в настоящее время:
ACTIONONLY : 'AO';
BELIEFS : ':Initial Beliefs:' -> mode(INITIAL_BELIEFS);
NAME : ':name:';
WORD: ('a'..'z'|'A'..'Z'|'0'..'9'|'_')+;
COMMENT : '/*' .*? '*/' -> skip ;
LINE_COMMENT : '//' ~[\n]* -> skip ;
NEWLINE:'\r'? '\n' -> skip ;
WS : (' '|'\t') -> skip ;
mode INITIAL_BELIEFS;
GOAL_IB : ':Initial Goal:' -> mode(GOALS);
IB_COMMENT : '/*' .*? '*/' -> skip ;
IB_LINE_COMMENT : '//' ~[\n]* -> skip ;
IB_NEWLINE:'\r'? '\n' -> skip ;
IB_WS : (' '|'\t') -> skip ;
BELIEF_BLOCK: ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'('|')'|','|'.')+;
mode REASONING_RULES;
R1: 'a';
R2: 'b';
mode GOALS;
GL_COMMENT : '/*' .*? '*/' -> skip ;
GL_LINE_COMMENT : '//' ~[\n]* -> skip ;
GL_NEWLINE:'\r'? '\n' -> skip ;
GL_WS : (' '|'\t') -> skip ;
GOAL_BLOCK: ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'('|')'|','|'.')+;
Обратите внимание, что в настоящее время нет возможности перейти в режим REASONING_RULES (так что это не должно, насколько я понимаю, влиять на работу лексера). Очевидно, я хочу использовать этот режим, но это минимальная версия лексера, которая, кажется, отображает мою проблему.
Мой парсер:
grammar ActionOnly;
options { tokenVocab = ActionOnlyLexer; }
// Mas involving ActionOnly Agents
mas : aoagents;
aoagents: ACTIONONLY (aoagent)+;
// Agent stuff
aoagent :
(ACTIONONLY?)
NAME w=WORD
BELIEFS (bs=BELIEF_BLOCK )?
GOAL_IB gs=GOAL_BLOCK;
и я пытаюсь разобрать:
AO
:name: robot
:Initial Beliefs:
abelief
:Initial Goal:
at(4, 2)
Это не с ошибкой
строка 35: 0 несоответствующий ввод 'в (4,' ожидает GOAL_BLOCK
что, как я предполагаю, связано с тем, что токенизация не выполняется правильно.
Если я опущу правило R2 в режиме REASONING_RULES, оно будет правильно проанализировано (в общем, мне кажется, что у меня есть одно правило в REASONING_RULES, и оно будет работать, но более одного правила, и оно не соответствует GOAL_BLOCK)
Я действительно изо всех сил пытаюсь понять, что я здесь делаю неправильно, но это первый раз, когда я пробовал использовать режимы лексера с Antlr.