用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的规则如下:
- 所以第一个字母大小的rule都是Lexing rule
- lexer会试图找出一个Rule,它可以最好程度的匹配输入
- 最好程度的匹配的意思是:匹配到的字符串length最大。
如果只有一个rule匹配到了,那么这个rule就是我们的token
如果有多个rule匹配到了,那个那个在语法文件中第一个被定义的rule会被采纳
回到上面的错误,aaa12匹配到的rule是Name,而不是ID,所以会报错。
Note:
在写Rule的时候,最后不用有交集;
如果有的话,要先后顺序来指定优先级;
要不然就试一试别的语法解析工具。