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