CocoR を使用して Java のようなスキャナー/パーサーを生成しています。コード
ブロックに一致する EBNF 式を作成する際に問題が発生しています。
コード ブロックが 2 つのよく知られたトークン <& と &> で囲まれていると想定しています。例:
public method(int a, int b) <&
various code
&>
非終端記号を定義すると
codeblock = "<&" {ANY} "&>"
2 つのシンボル内のコードに「<」文字が含まれている場合、生成されたコンパイラはそれを処理しないため、構文エラーが発生します。
ヒントはありますか?
編集:
COMPILER JavaLike
CHARACTERS
nonZeroDigit = "123456789".
digit = '0' + nonZeroDigit .
letter = 'A' .. 'Z' + 'a' .. 'z' + '_' + '$'.
TOKENS
ident = letter { letter | digit }.
PRODUCTIONS
JavaLike = {ClassDeclaration}.
ClassDeclaration ="class" ident ["extends" ident] "{" {VarDeclaration} {MethodDeclaration }"}" .
MethodDeclaration ="public" Type ident "("ParamList")" CodeBlock.
Codeblock = "<&" {ANY} "&>".
簡単にするために、いくつかの演出を省略しました。
これは文法の私の実際の実装です。主なバグは、ブロック内のコードに記号 '>' または '&' のいずれかが含まれている場合に失敗することです。