gpt4 book ai didi

java - ANTLR 生成空条件

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

我正在尝试学习使用 ANTLR,但我无法弄清楚在这种情况下我的代码有什么问题。我希望这对任何有经验的人来说真的很容易。这是语法(真的很短)。

grammar SmallTest;

@header {
package parseTest;
import java.util.ArrayList;
}

prog returns [ArrayList<ArrayList<String>> all]
:(stat { if ($all == null)
$all = new ArrayList<ArrayList<String>>();
$all.add($stat.res);
} )+
;

stat returns [ArrayList<String> res]
:(element { if ($res == null)
$res = new ArrayList<String>();
$res.add($element.text);
} )+ NEWLINE
| NEWLINE
;

element: ('a'..'z'|'A'..'Z')+ ;
NEWLINE:'\r'? '\n' ;

问题是当我生成 Java 代码时有一些空的 if 条件,并且编译器因此显示错误,我可以手动编辑它,但那可能会更糟。我猜这里有问题。

抱歉问了,这一定很愚蠢,但我的例子与网站上的例子非常相似,我无法想象有什么方法可以进一步消除差异。

非常感谢。

最佳答案

您应该将列表的初始化放在规则的 @init { ... } block 中,该 block 在匹配规则中的任何内容之前执行。

此外,您的 element 规则不应该是解析器规则,而应该是词法分析器规则(它应该以大写字母开头!)。

并且你的解析器的入口点,prog 规则,应该以 EOF 标记结束,否则解析器可能会在所有标记被正确处理之前停止。

最后,@header { ... } 部分仅适用于解析器(它是 @parser::header { ... } 的缩写>),您还需要将包声明添加到词法分析器中。

一个工作演示:

SmallTest.g

grammar SmallTest;

@header {
package parseTest;
import java.util.ArrayList;
}

@lexer::header {
package parseTest;
}

prog returns [ArrayList<ArrayList<String>> all]
@init {$all = new ArrayList<ArrayList<String>>();}
: (stat {$all.add($stat.res);})+ EOF
;

stat returns [ArrayList<String> res]
@init {$res = new ArrayList<String>();}
: (ELEMENT {$res.add($ELEMENT.text);})* NEWLINE
;

ELEMENT : ('a'..'z'|'A'..'Z')+ ;
NEWLINE : '\r'? '\n' ;
SPACE : ' ' {skip();};

主程序.java

package parseTest;

import org.antlr.runtime.*;

public class Main {
public static void main(String[] args) throws Exception {
SmallTestLexer lexer = new SmallTestLexer(new ANTLRStringStream("a bb ccc\ndddd eeeee\n"));
SmallTestParser parser = new SmallTestParser(new CommonTokenStream(lexer));
System.out.println(parser.prog());
}
}

要运行它,请执行以下操作:

java -cp antlr-3.3.jar org.antlr.Tool parseTest/SmallTest.g javac -cp .:antlr-3.3.jar parseTest/*.javajava -cp .:antlr-3.3.jar parseTest.Main

产生:

[[a, bb, ccc], [dddd, eeeee]]

关于java - ANTLR 生成空条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6526131/

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