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;

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值