令牌计数比较语法
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
)。
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
;
This version is too slow, however, tests:
Random strings length 20 literals: Avg time =14 ms, Min time =0, Max time =78
Length 40: Avg time =32, Min time =0, Max time =231
Length 60: Avg time =83, Min time =16, Max time =416
Length 80: Avg time =365, Min time =37, Max time =11935
Length 100: Avg time =1442, Min time =67, Max time =25317
Length 120: Avg time =21861, Min time =135, Max time =924769
The input for the above 924 sec parse time:
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
Can the grammar be rewritten to faster version? (Be careful, changing say eq
into
eq: 'a' 'b'
| 'b' 'a'
| eq 'a' 'b'
| eq 'b' 'a'
| 'a' eq 'b'
| 'b' eq 'a'
| 'a' 'b' eq
| 'b' 'a' eq
;
is not equivalent rule rewriting, as it will not recognize a a b b b b a a
).
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论