Antlr 中 fragment词法规则


ANTLR文法中语法规则是在词法规则基础上建立的。但不一定每个词法规则都会被语法规则直接使用。这就象一个类的公有成员和私有成员,公有成员是对外公开的会被外界直接调用。而私有成员不对外公开是由公有成员间接调用的。在词法规则中那些不会被语法规则直接调用的词法规则可以用一个fragment关键字来标识,fragment标识的规则只能为其它词法规则提供基础。

grammar TestFragment;

options {

  language=CSharp;

  output=AST;

}

a : INT;

INT : DIGIT+;

fragment DIGIT : '0' .. '9';

此示例中词法符号INT定义了整型数,而DIGIT定义了一位数字。语法规则a对DIGIT规则的使用是间接的,这时使用fragment来标识DIGIT规则,DIGIT规则将不能被语法规则直接调用。如果如下例语法规则a直接调用DIGIT规则,运行时语法分析器会死循环。

a : DIGIT;

INT : DIGIT+;

fragment DIGIT : '0' .. '9';

在不使用fragment关键字的时候,有时语法规则也不能直接使用某些词法规则。请看下面的示例。

a : DIGIT;

INT : DIGIT+;

DIGIT : '0' .. '9';

运行后输入“9”分析器生成的语法树为空,使用java命令行运行时提示“line 1:0 mismatched input '0'expecting DIGIT ”。这是因为DIGIT规则匹配的内容对INT规则来说也是匹配的,INT规则干扰了DIGIT规则的匹配,造成DIGIT规则没有匹配的内容。

a : DIGIT;

fragment INT : DIGIT+;

DIGIT : '0' .. '9';

如果在INT前加入fragment则分析器可以生成有一个节点“9” 的语法树,不过在实际中不应该这样定义。在第五章我们会学到fragment词法规则是可以带参数的,这样可以在词法分析的过程中灵活的控制,fragment词法规则具有更大的意义。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值