gpt4 book ai didi

java - 使用 EBNF 表达式解析代码块

转载 作者:行者123 更新时间:2023-11-30 11:57:41 25 4
gpt4 key购买 nike

我正在使用 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} "&>".

为了简单起见,我省略了一些产生式。
这是我对语法的实际实现。主要错误是,如果 block 中的代码包含符号“>”或“&”之一,它将失败。

最佳答案

尼克,这里的聚会迟到了......

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

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

您可以使用 COMMENTS 指令

来自 <& 的评论收件人 &> - 按照 CoCo 的预期引用。

或者在你的 scanner.frame 文件中修改 NextToken() 。做这样的事情(伪代码):

if (Peek() == CODE_START)
{
while (NextToken() != CODE_END)
{
// eat tokens
}
}

或者可以重写Buffer中的Read()方法,在最底层吃。

HTH

关于java - 使用 EBNF 表达式解析代码块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3677514/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com