ANTLR4(三) 语义判定 词法符号特性

ANTLR4 定制嵌入式语法及三个词法符号特性

  • 定制嵌入式语法
    • 预期效果
    • 语法文件
    • 运行效果
  • 词法分析特性
    • 通过模式切换处理相同文件中的不同格式
      • 语法文件
      • 运行词法分析器
    • 重写输入流
      • 重写Listener
      • 运行结果
    • 将词法符号送入不同通道

定制嵌入式语法

我们可以在语法规则的定义中,加上嵌入式的动作。

我们将从一个文本文件中,根据列号,取出该列每行的值。

预期效果

输入文件t.rows:
在这里插入图片描述
输出
在这里插入图片描述

语法文件

观察以下代码:

我们在该语法分析器中加入了新成员:col(也就是列号)、一个自定义的RowsParser(获取输入的文件及列号);

row规则中,我们引入了一个locals本地变量i,在STUFF读取完之前,i会++多次,并判断是否与col相同以决定是否要打印STUFF的内容。

//Rows.g4grammar Rows;@parser::members { // add members to generated RowsParserint col;public RowsParser(TokenStream input, int col) { // custom constructorthis(input);this.col = col;}
}file: (row NL)+ ;row
locals [int i=0]: (   STUFF{$i++;if ( $i == col ) System.out.println($STUFF.text);})+;TAB  :  '\t' -> skip ;   // match but don't pass to the parser
NL   :  '\r'? '\n' ;     // match and pass to the parser
STUFF:  ~[\t\r\n]+ ;     // match any chars except tab, newline

运行效果

观察以下代码:

注意自定义的RowsParser的实例获取了输入文件以及列号,并且关掉了语法分析树的构建

//Col.java
import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.ParserRuleContext;


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部