令牌计数比较语法
grammar neq;
WS
: [ \t\r\n]+ -> skip
;
root: aGTb | bGTa | eq;
aGTb: 'a'
| eq aGTb
| aGTb eq
| aGTb aGTb
;
bGTa: 'b'
| eq bGTa
| bGTa eq
| bGTa bGTa
;
eq: 'a' 'b'
| 'b' 'a'
| 'a' eq 'b'
| 'b' eq 'a'
| eq eq
;
然而,这个版本太慢了,测试:
-
随机字符串长度20个文字:平均时间=14毫秒,最短时间=0,最大时间=78
-
长度 40:平均时间 =32,最小时间 =0,最大时间 =231
-
长度 60:平均时间 =83,最短时间 =16,最长时间 =416
-
长度 80:平均时间 =365,最短时间 =37,最长时间 =11935
-
长度 100:平均时间 =1442,最短时间 =67,最长时间 =25317
-
长度 120:平均时间 =21861,最小时间 =135,最大时间 =924769
上述 924 秒解析时间的输入:
a b b a a a b b a a b a b a a a a b a a a a b b b a a a a b a a b
a a a b b b a a a b b a b b b a a b b a b a b a b a b a a a a b b
b a a b b b b a a b a b a b a a a b a b b b b b a a a b a a a b b
a b a b a a b b b a a b b a b a a a a a a
语法可以重写为更快的版本吗? (请注意,将 say eq
更改为
eq: 'a' 'b'
| 'b' 'a'
| eq 'a' 'b'
| eq 'b' 'a'
| 'a' eq 'b'
| 'b' eq 'a'
| 'a' 'b' eq
| 'b' 'a' eq
;
并不等同的规则重写,因为它不会识别 aabbbba a
)。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论