设计原则
语法规则的设计遵循“自顶向下”的原则,即由宏观到具体。比如,CSV的语法规则,一个CSV文件由多行组成,每行由多个字段组成,每个字段组成规则等等,如下所示,这种方式更贴近人类的思维和表达方式。
csvFile: hdr row+ ;
hdr : row ;
row : field (',' field)* '\r'? '\n' ;
field
: TEXT
| STRING
|
;
TEXT : ~[,\n\r"]+ ;
STRING : '"' ('""'|~'"')* '"' ; // quote-quote is an escaped quote
规则元素
- Token序列;
- 字符串;//‘literal’ 单引号
- 规则;
- 规则参数;//向规则函数中传递的参数,参数的书写规则是目标语言,用逗号分隔
- 通配符;
- {action} 动作,在元素的间隔中执行;
- {p} 谓词;
通配符
- | 表示或
- * 表示出现0次或以上
- ? 表示出现0次或1次
- + 表示出现1次或以上
- ~ 表示取反
规则文件与解析器的对应关系
规则文件中的每条规则对应解析器的一个方法和对应的上下文,如下图所示:
可选标签
- 含义:为规则中的某个分支打标;
- 作用:更精准的控制解析过程,分支粒度;如果不用标签,则只能到规则粒度;
规则元素标签
Antlr允许用 = 操作符为规则中的元素添加标签,这样会在规则的上下文对象中添加元素的字段,等号左边为属性名,右边为规则名,如下图所示:
参考: