Разбор латексоподобного языка в 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 = '!' | ... | '^' ;
Другие вопросы по тегам