如何解决如何在解析规则中获取令牌行?
我到处搜索,找不到解决方案。我是ANTLR的新手,要进行分配,当我的解析器遇到带有行号和令牌的身份不明的令牌时,我需要打印出一条错误消息(使用下面类似的语法)。 documentation for antlr4表示line是Token对象的属性,该属性给出“ [to]该令牌所在的行号,从1开始计数;转换为对getLine
的调用。示例:{{1} }。”
我试图在以下代码段中实现这一点:
$ID.line
但是我不断收到错误消息
not_valid : not_digit { System.out.println("Line " + $not_digit.line + " Contains Unrecognized Token " $not_digit.text)};
not_digit : ~( DIGIT );
我的第一个想法是我将词法分析器 token 的属性应用于解析器 rule ,因为文档将Token和Rule属性拆分为两个不同的表。所以我将代码更改为:
unkNown attribute line for rule not_digit in $not_digit.line
还有
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 ;
我不确定我缺少什么。我所有的搜索都打开了如何在解析器外部使用Java进行此操作,但是我需要在解析器中处理动作代码(我认为这就是所谓的内容)。
解决方法
像{ ... }
这样的块称为 action 。您将目标特定的代码嵌入其中。因此,如果您使用的是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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。