anltr中的Lexing和Parsing

110 篇文章 0 订阅
56 篇文章 0 订阅

用anltr来写DSL的时候,需要注意的是它在解析DSL语法的时候分为两个阶段。
Lexing和Parsing

Lexing就是把Input分割成一个一个的Token
Pasing就是把从Lexing得到的Token构建成一个语法树

如果我们在写语法的时候写出以下的语法:

input:
	ID ';'
;
ID : [a-zA-Z]+ ; 
NAME : [a-zA-Z0-9]+ ; 

这个语法在解析如下的输入时,是没有问题的;

aaa;

但是在解析如下的输入时会报错,说匹配不到ID。

aaa12;

这里就体现到Lexing的优先级了。
Lexing的规则如下:

  1. 所以第一个字母大小的rule都是Lexing rule
  2. lexer会试图找出一个Rule,它可以最好程度的匹配输入
  3. 最好程度的匹配的意思是:匹配到的字符串length最大。
    如果只有一个rule匹配到了,那么这个rule就是我们的token
    如果有多个rule匹配到了,那个那个在语法文件中第一个被定义的rule会被采纳

回到上面的错误,aaa12匹配到的rule是Name,而不是ID,所以会报错。

Note:
在写Rule的时候,最后不用有交集;
如果有的话,要先后顺序来指定优先级;
要不然就试一试别的语法解析工具。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值