Разбор латексоподобного языка в Java
Я пытаюсь написать синтаксический анализатор на Java для простого языка, похожего на Latex, то есть он содержит много неструктурированного текста с парой \ команд [с]{некоторыми}{параметрами} между ними. Последовательности Escape, такие как \\, также должны быть приняты во внимание.
Я попытался сгенерировать парсер для этого с помощью JavaCC, но похоже, что компиляторы-компиляторы, такие как JavaCC, подходят только для высокоструктурированного кода (типично для языков программирования общего назначения), а не для грязной латексоподобной разметки. Пока что мне кажется, что я должен перейти на низкий уровень и написать свой собственный конечный автомат.
Поэтому мой вопрос заключается в том, как проще всего анализировать ввод, который в основном неструктурирован, с промежуточными командами, похожими на латекс?
РЕДАКТИРОВАТЬ: Переход на низком уровне с конечным автоматом трудно, потому что латексные команды могут быть вложенными, например, \cmd1{\cmd2{\cmd3{...}}}
1 ответ
Вы можете определить грамматику для приема латексных входных данных, используя только символы в качестве лексем в худшем броске. JavaCC должно быть просто отлично для этой цели.
Хорошая вещь о грамматике и генераторе синтаксического анализатора состоит в том, что он может анализировать вещи, с которыми проблемы FSA, особенно вложенные структуры.
Первое сокращение в вашей грамматике может быть (я не уверен, что это допустимый JavaCC, но это разумный EBNF):
Latex = item* ;
item = command | rawtext ;
command = command arguments ;
command = '\' letter ( letter | digit )* ; -- might pick this up as lexeme
letter = 'a' | 'b' | ... | 'z' ;
digit= '0' | ... | '9' ;
arguments = epsilon | '{' item* '}' ;
rawtext = ( letter | digit | whitespace | punctuationminusbackslash )+ ; -- might pick this up as lexeme
whitespace = ' ' | '\t' | '\n' | '\:0D' ;
punctuationminusbackslash = '!' | ... | '^' ;