Linux安全网 - Linux操作系统_Linux 命令_Linux教程_Linux黑客

会员投稿 投稿指南 本期推荐:
搜索:
您的位置: Linux安全网 > Linux集群 > Architecture > » 正文

antlr学习(一) 文法定义

来源: cw550284 分享至:

ANTLR 的文法定义使用了类似 EBNF(Extended Backus-Naur Form)的定义方式,是一 种强大简洁的文法定义方式。本章前面的文法定义的写法比较繁琐,定义复杂的文法时非常 不便,文法的可读性也会较差。

ANTLR的文法定义方式形象直观,可以用很短的行数描述以 前要很多行才能表示的文法内容。



规则的表示:文法是由规则组成的,本章前面的规则都是用 A=>a形式来表示的。

ANTLR 用 A : a;来表示规则,“:”代替了“=>”。ANTLR的规则要以分号“;”结束。我们可以方便 地称规则 A : a为规则 A。

在规则中有几种运算关系,选择、连接、重复、可选。

连接“ ”:规则 A : a b c; a、b、c之间用空格分隔。此规则接收句型 abc,符号 a、 b、c是按顺序连接起来的关系。

选择“| ”:规则 A : a | b | c; “|”表示“或”的关系,符号 A 可以推导出 a 或 b 或 c,也就是在 a、b、c中选择。这要比写成 A : a; A : b; A : c;方便得多。连接和选择 可以联合起来使用,如 A : a b c | c d e;。有进也会使句型的数量增多如:A : B D; B : a | b; D : c | d;这时符号A推导出的句型有 ac、ad、bc、bd四种。

重复“*,+”:定义符号的多重性,规则 A : a*; “*”表示 a可以出现 0次或多次。A : a*; 相当于 A : A a | ;。这样可以避免递归的定义,可文法定义中递归往往引起文法的二 义性。如果 a至少要出现一次可以表示为 A : a+; “+”表示 a可以出现 1次或多次。相当 于 A : A a | a;。重复可以和连接、选择一起使用如:A : a * b | c + d;。

可选“?”:规则 A : a?; “?”表示 a可以出现 0次或 1次,即 a可有可无。相当于 A : a | ;。可选可以和连接、选择、重复一起使用如:A : a* b? | c+ d?;。


子规则“()”:规则 A : (a b) | b; a 与 b 在括号中,这样“(a b)”形成了一个子规 则,也就是说可以把规则写成 A : B | b; B : a b;两个规则表示,我们把 B规则用括号括 起来放到 A规则中这样就是 A规则的子规则了。利用子规则也可以把多个符一起进行描述, A : (a b c)* 规则中 a、b、c 三个符号可以一起重复 0 次或多次。子规则有利于我们把很 复杂的多个规则写到一起,有时这样写会使文法既简练又直观。子规则和前面的各种特性用 到一起可以把复杂的文法写的很浓缩。如:A : (a b c)* | (c d)+ e?;。

值得注意的是如果我们的规则中有“()”的字符该如何表示?因为子规则也是用“()” 表示的。在 ANTLR 中表示字符要用“’”单引号括起来,用‘(’ ‘)’来表示括号字符。 前面讲到的表示文法规则的符号“| * + () ?”叫做文法的元符号。

注释“// /**/”:和一般编程语言一样,ANTLR 在文法定义中也可以添加注释。用// 来添加单行注释,如规则 E : ‘(’ E ‘)’ | INT // E 表示算术表达式。用/*…*/添加 多行注释,与 C++相同。


Tags:
分享至:
最新图文资讯
1 2 3 4 5 6
验证码:点击我更换图片 理智评论文明上网,拒绝恶意谩骂 用户名:
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 发展历史