Разбор латексоподобного языка в Java - PullRequest
3 голосов
/ 16 августа 2010

Я пытаюсь написать синтаксический анализатор на Java для простого языка, похожего на Latex, то есть он содержит много неструктурированного текста с парой \ команд [с] {некоторыми} {параметрами} между ними.Необходимо также учитывать escape-последовательности, такие как \\.

Я пытался сгенерировать для этого парсер с JavaCC, но похоже, что компиляторы компиляторов, такие как JavaCC, подходят только для высокоструктурированного кода (типично для языков программирования общего назначения), а не для грязной латексоподобной разметки.Пока что мне кажется, что мне нужно перейти на низкий уровень и написать свой собственный конечный автомат.

Итак, мой вопрос, какой самый простой способ для анализа ввода, который в основном неструктурирован, с помощью всего лишь нескольких латексоподобных командмежду?

РЕДАКТИРОВАТЬ: Переход на низкий уровень с конечным автоматом затруднен, потому что латексные команды могут быть вложенными, например, \ cmd1 {\ cmd2 {\ cmd3 {...}}}

1 Ответ

4 голосов
/ 19 августа 2010

Вы можете определить грамматику для приема латексного ввода, используя всего символов в качестве токенов в худшем броске. 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 = '!' | ... | '^' ;
...