2010-08-16 47 views
3

我正在嘗試在Java中編寫一個類似於Latex的簡單語言的解析器,即它包含大量的非結構化文本,並帶有一些\ commands {with} {some} {parameters}在之間。 \ \等逃逸序列也必須考慮在內。在Java中解析latex-like語言

我試着爲JavaCC生成一個解析器,但它看起來好像JavaCC這樣的編譯器編譯器只適用於高度結構化的代碼(典型用於通用編程語言),而不適用於凌亂的乳膠樣標記。到目前爲止,似乎我必須走低層次,編寫自己的有限狀態機。

所以我的問題是,什麼是最簡單的方法來解析大多數非結構化的輸入,只有少數類似Latex的命令?

編輯:由於Latex命令可以嵌套,例如使用有限狀態機,所以很困難。 \ cmd1 {\ cmd2 {\ cmd3 {...}}}

+1

的規範資源[學習寫一個編譯器(HTTP: //stackoverflow.com/questions/1669/learning-to-write-a-compiler)。你的問題可能很小,以至於手工遞歸下降方法是有意義的。另外,我認爲你可能會混淆lexing和解析,這可能會使它看起來比它更難。 – dmckee 2010-08-16 16:33:35

回答

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 = '!' | ... | '^' ; 
+0

是的,這看起來像一個有效的解決方案。但我想知道是否將文本拆分爲單字符標記是不好的表現方式...... – 2010-08-20 06:48:51

+0

@python dude:除非您的latex文件很大,否則我懷疑這一點很重要。你要求的是「最簡單」的方式來做到這一點,就是這樣!如果你想讓它更快,你可以實現一些非終結者(rawtext等)作爲更傳統的詞位。我已經稍微修改了語法以使其更容易。 – 2010-08-20 12:17:23