anltr中的Lexing和Parsing

知识共享许可协议 Creative Commons

用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的时候,最后不用有交集;
如果有的话,要先后顺序来指定优先级;
要不然就试一试别的语法解析工具。

猜你喜欢

转载自blog.csdn.net/lantianjialiang/article/details/91839655