我正在使用 CocoR 生成类似 java 的扫描仪/解析器:
我在创建 EBNF 表达式以匹配代码块时遇到了一些麻烦:
我假设一个代码块被两个众所周知的标记包围: <& 和 &> 示例:
public method(int a, int b) <&
various code
&>
如果我定义一个非终结符
codeblock = "<&" {ANY} "&>"
如果两个符号内的代码包含“<”字符,则生成的编译器将不会处理它,从而产生语法错误。
有什么提示吗?
编辑:
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} "&>".
为了简单起见,我省略了一些产品。
这是我对语法的实际实现。主要错误是,如果块中的代码包含符号“>”或“&”之一,它会失败。