ANTLR4 定制嵌入式语法及三个词法符号特性
定制嵌入式语法
我们可以在语法规则的定义中,加上嵌入式的动作。
我们将从一个文本文件中,根据列号,取出该列每行的值。
预期效果
输入
文件t.rows:
输出
:
语法文件
观察以下代码:
我们在该语法分析器中加入了新成员:col
(也就是列号)、一个自定义的RowsParser
(获取输入的文件及列号);
在row
规则中,我们引入了一个locals本地变量i
,在STUFF读取完之前,i会++多次,并判断是否与col相同以决定是否要打印STUFF
的内容。
//Rows.g4
grammar Rows;
@parser::members {
// add members to generated RowsParser
int col;
public RowsParser(TokenStream input, int col) {
// custom constructor
this(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;
import org.antlr.v4.runtime.Token;
import java.io.FileInputStream;
import java.io.InputStream;