gpt4 book ai didi

antlr - 如何在解析规则中获取 token 行?

转载 作者:行者123 更新时间:2023-12-05 06:11:18 25 4
gpt4 key购买 nike

我到处找,找不到解决办法。我是 ANTLR 的新手,对于一项任务,当我的解析器遇到带有行号和标记的未识别标记时,我需要打印出(使用下面的类似语法)一条错误消息。 documentation for antlr4说 line 是 Token 对象的一个​​属性,它给出了“[t]出现 token 的行号,从 1 开始计数;转换为对 getLine 的调用。示例:$ID.line 。”

我试图在以下代码块中实现这一点:

not_valid : not_digit { System.out.println("Line " + $not_digit.line + " Contains  Unrecognized  Token " $not_digit.text)}; 
not_digit : ~( DIGIT );

但是我一直报错

$not_digit.line 中规则 not_digit 的未知属性行

我的第一个想法是,我正在将词法分析器 token 的属性应用于解析器 rule,因为文档将 Token 和 Rule 属性分成两个不同的表。所以我将代码更改为:

not_valid : NOT_DIGIT { System.out.println("Line " + $NOT_DIGIT.line + " Contains  Unrecognized  Token " $NOT_DIGIT.text)}; 
NOT_DIGIT : ~ ( DIGIT ) ;

还有

not_valid : NOT_DIGIT { System.out.println("Line " + $NOT_DIGIT.line + " Contains  Unrecognized  Token " $NOT_DIGIT.text)}; 
NOT_DIGIT : ~DIGIT ;

就像文档中的例子一样,但两次我都得到了错误

集合中当前不支持规则引用 DIGIT

我不确定我错过了什么。我的所有搜索结果都是如何在解析器之外的 Java 中执行此操作,但我需要在解析器中处理操作代码(我认为这就是它的名称)。

最佳答案

{ ... } 这样的 block 称为 action。您在其中嵌入目标特定代码。因此,如果您正在使用 Java,那么您需要在 {}

之间编写 Java

快速演示:

grammar T;

parse
: not_valid EOF
;

not_valid
: r=not_digit
{
System.out.printf("line=%s, charPositionInLine=%s, text=%s\n",
$r.start.getLine(),
$r.start.getCharPositionInLine(),
$r.start.getText()
);
}
;

not_digit
: ~DIGIT
;

DIGIT
: [0-9]
;

OTHER
: ~[0-9]
;

用代码测试一下:

String source = "a";
TLexer lexer = new TLexer(CharStreams.fromString(source));
TParser parser = new TParser(new CommonTokenStream(lexer));
parser.parse();

将打印:

line=1, charPositionInLine=0, text=a

关于antlr - 如何在解析规则中获取 token 行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64049896/

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