我正在使用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} "&>".为了简单起见,我省略了一些产品。
这是我实际实现的语法。主要的错误是,如果块中的代码包含'>‘或'&’中的一个符号,它就会失败。
发布于 2011-03-03 00:15:18
尼克,派对迟到了..。
有几种方法可以做到这一点:
为<&和&>定义标记,以便词法分析器知道它们。
您可以使用COMMENTS指令
从<&到&>的评论-正如CoCo所期望的那样引用。
或者在scanner.frame文件中创建hack NextToken()。这样做(伪代码):
if (Peek() == CODE_START)
{
while (NextToken() != CODE_END)
{
// eat tokens
}
}或者可以覆盖缓冲区中的Read()方法并在最低级别上eat。
HTH
https://stackoverflow.com/questions/3677514
复制相似问题