令牌计数比较语法

发布于 2025-01-14 06:34:48 字数 1262 浏览 2 评论 0原文

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文