首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用EBNF表达式解析代码块

使用EBNF表达式解析代码块
EN

Stack Overflow用户
提问于 2010-09-09 22:25:36
回答 1查看 1.9K关注 0票数 2

我正在使用CocoR生成一个类似java的扫描器/解析器:

我在创建EBNF表达式以匹配码块时遇到了一些问题:

我假设代码块周围有两个众所周知的标记:<&和&>示例:

代码语言:javascript
复制
public method(int a, int b) <&  
various code  
&>  

如果我定义了一个非终端符号

代码语言:javascript
复制
codeblock = "<&" {ANY} "&>"  

如果两个符号内的代码包含'<‘字符,则生成的编译器将不会处理它,从而产生语法错误。

有什么提示吗?

编辑:

代码语言:javascript
复制
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} "&>".

为了简单起见,我省略了一些产品。

这是我实际实现的语法。主要的错误是,如果块中的代码包含'>‘或'&’中的一个符号,它就会失败。

EN

回答 1

Stack Overflow用户

发布于 2011-03-03 00:15:18

尼克,派对迟到了..。

有几种方法可以做到这一点:

<&&>定义标记,以便词法分析器知道它们。

您可以使用COMMENTS指令

<&&>的评论-正如CoCo所期望的那样引用。

或者在scanner.frame文件中创建hack NextToken()。这样做(伪代码):

代码语言:javascript
复制
if (Peek() == CODE_START)
{
     while (NextToken() != CODE_END)
     {
        // eat tokens
     }
}

或者可以覆盖缓冲区中的Read()方法并在最低级别上eat。

HTH

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3677514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档