3

我正在尝试用Java 编写一个类似于Latex 的简单语言的解析器,即它包含许多非结构化文本,其中有几个\commands[with]{some}{parameters}。像 \\ 这样的转义序列也必须考虑在内。

我尝试使用 JavaCC 为其生成解析器,但看起来像 JavaCC 这样的编译器编译器只适用于高度结构化的代码(通常用于通用编程语言),而不适用于凌乱的类似 Latex 的标记。到目前为止,似乎我必须走低级并编写自己的有限状态机。

所以我的问题是,解析大部分非结构化输入的最简单方法是什么,中间只有几个类似 Latex 的命令?

编辑:使用有限状态机进行低级处理很困难,因为 Latex 命令可以嵌套,例如 \cmd1{\cmd2{\cmd3{...}}}

4

1 回答 1

4

您可以定义一个语法来接受 Latex 输入,使用字符作为最差转换中的标记。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 = '!' | ... | '^' ;
于 2010-08-19T16:37:46.370 回答