3

Latex に似た単純な言語用のパーサーを Java で作成しようとしています。つまり、その間にいくつかの \commands[with]{some}{parameters} を含む多くの非構造化テキストが含まれています。\\ のようなエスケープ シーケンスも考慮する必要があります。

私は JavaCC でそのためのパーサーを生成しようとしましたが、JavaCC のようなコンパイラ-コンパイラは高度に構造化されたコード (汎用プログラミング言語に典型的) にのみ適しており、乱雑な Latex のようなマークアップには適していないようです。これまでのところ、低レベルに進んで独自の有限状態マシンを作成する必要があるようです。

だから私の質問は、ほとんど構造化されていない入力を解析する最も簡単な方法は何ですか?

編集: 有限状態マシンで低レベルに移行することは困難です。これは、Latex コマンドをネストできるためです。

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 に答える