微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在解析规则中获取令牌行?

如何解决如何在解析规则中获取令牌行?

我到处搜索,找不到解决方案。我是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,则需要在{}

之间编写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 举报,一经查实,本站将立刻删除。