Я попытался реализовать грамматику, подобную LaTeX, которая могла бы позволить мне разобрать предложение такого типа:
\title{Un pré é"'§è" \VAR state \draw( 200\if{expression kjlkjé} ) bis tèr }
Как видите, \ title {} может содержать несколько видов элементов:
строка в utf8 без кавычек и с пробелами, которые я хотел бы
хранить в одном жетоне
вызов переменной как: \ variable_name
некоторые \ ключевые слова следуют в скобках или другие с фигурными скобками: например, \ draw (utf8 \ var \ if {} ...) или \ if {idem}.
Эти элементы могут быть вложенными.
Я получаю вдохновение от анализатора XML, представленного в книге 4 ANTLR, и пытаюсь использовать режим. Я сталкиваюсь с проблемой, касающейся распознавания закрывающих скобок закрывающих скобок. Я также сталкиваюсь с проблемой с некоторыми пробелами, например с тем, который следует за \ variable_name (я получаю: посторонний ввод '').
Вот мой грамматический код лексера:
lexer grammar OEFLexer;
// Default mode rules (the SEA)
SEA_WS : (' '|'\t'|'\r'? '\n')+ ;
TITLE : '\\title';
OB : '{';
OP : '(';
BSLASH : '\\' -> mode(CALLREFERENCE) ;
TEXT : ~[\\({]+; // clump all text together
// ----------------- Everything Callreference ---------------------
mode CALLREFERENCE;
CLOSECALLVAR : ' ' -> mode(DEFAULT_MODE) ; // back to SEA mode
CB : '}' -> mode(DEFAULT_MODE) ; // back to SEA mode
CP : ')' -> mode(DEFAULT_MODE) ; // back to SEA mode
DRAW : 'draw' OP;
IF : 'if' OB;
ID : [a-zA-Z]+ ; // match/send ID in tag to parser
Вот моя грамматика парсера
parser grammar OEFParser;
options { tokenVocab=OEFLexer; }
document: TITLE OB ( callreference | string )* CB;
string : TEXT;
var : ID;
commandDraw : DRAW ( callreference | string )* CP ;
commandIf : IF ( callreference | string )* CB ;
callreference : BSLASH ID | BSLASH commandDraw CP | BSLASH commandIf CP;
Когда я пытался проанализировать код заголовка, упомянутый в начале, я получаю:
line 1:25 extraneous input ' ' expecting {'\', TEXT, '}'}
line 1:37 extraneous input ' ' expecting {'\', TEXT, ')'}
line 1:45 mismatched input 'expression' expecting {'\', TEXT, '}'}
line 1:75 extraneous input '<EOF>' expecting {'\', TEXT, ')'}
С этим сгенерированным деревом, сгенерированным Grun
Спасибо за вашу помощь, чтобы помочь мне решить эту проблему.
Chris