如何优化此语法规则?

用户4979733

我正在使用TatSu python库实现语法。我的语法工作正常,但是有一条规则要花很多时间。在大约3000行的块(较大语法的一部分)上,如果我遵循此完整规则,则解析整个块大约需要42秒。如果我将此规则简化为几个令牌,则运行时间将从42s降至33s(提高了20%)。

该规则如下所示,它应与一系列以“ /”分隔事件匹配

events
    =
    '/'%{event}
    ;
event
    =
    'D' | 'U' | 'Z' | 'P' | 'L' | 'H' | 'x' | 'X' | 'T' | 'V' | 'l' | 'h' | 't' | 'v' | 'N' | 'A' | 'B' | 'F' | '?' | 'G' | 'R' | 'Q' | 'M'
    | 'ForceDown' | 'ForceUp' | 'ForceOff' | 'ForcePrior' | 'CompareLow' | 'CompareHigh' | 'CompareUnknown' | 'CompareOff'
    | 'CompareValid' | 'CompareLowWindow' | 'CompareHighWindow' | 'CompareOffWindow' | 'CompareValidWindow' | 'ForceUnknown'
    | 'LogicLow' | 'LogicHigh' | 'LogicZ' | 'Unknown' | 'ExpectHigh' | 'ExpectLow' | 'ExpectOff' | 'Marker'
    ;

如果将事件更改为以下内容,则可以更快地进行解析。

event
  =
  /[DUZPLHXT]/
  ;

那么有可能以某种方式改进上述规则以获得更快的处理速度吗?感谢您的任何想法。

阿巴拉拉

如您所述,对于具有很多仅是标记的选项的规则,使用模式(正则表达式)会更加有效。

但是运行时最终取决于某些规则如何相互调用。

您可以尝试的一种简单优化方法是添加一个cut(˜)表达式,这样每个表达式event最多可以尝试一次(尽管cut应当在%表达式中是隐式的)。

event
    =
    (
    'D' | 'U' | 'Z' | 'P' | 'L' | 'H' | 'x' | 'X' | 'T' | 'V' | 'l' | 'h' | 't' | 'v' | 'N' | 'A' | 'B' | 'F' | '?' | 'G' | 'R' | 'Q' | 'M'
    | 'ForceDown' | 'ForceUp' | 'ForceOff' | 'ForcePrior' | 'CompareLow' | 'CompareHigh' | 'CompareUnknown' | 'CompareOff'
    | 'CompareValid' | 'CompareLowWindow' | 'CompareHighWindow' | 'CompareOffWindow' | 'CompareValidWindow' | 'ForceUnknown'
    | 'LogicLow' | 'LogicHigh' | 'LogicZ' | 'Unknown' | 'ExpectHigh' | 'ExpectLow' | 'ExpectOff' | 'Marker'
    ) ~
    ;

就是说,因为规则是如此的词汇化,所以我选择了正则表达式。

event
    =
    /(?x)
    'D' | 'U' | 'Z' | 'P' | 'L' | 'H' | 'x' | 'X' | 'T' | 'V' | 'l' | 'h' | 't' | 'v' | 'N' | 'A' | 'B' | 'F' | '?' | 'G' | 'R' | 'Q' | 'M'
    | 'ForceDown' | 'ForceUp' | 'ForceOff' | 'ForcePrior' | 'CompareLow' | 'CompareHigh' | 'CompareUnknown' | 'CompareOff'
    | 'CompareValid' | 'CompareLowWindow' | 'CompareHighWindow' | 'CompareOffWindow' | 'CompareValidWindow' | 'ForceUnknown'
    | 'LogicLow' | 'LogicHigh' | 'LogicZ' | 'Unknown' | 'ExpectHigh' | 'ExpectLow' | 'ExpectOff' | 'Marker'
    /
    ;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何为错误创建语法规则?

来自分类Dev

此Haskell代码的语法规则是什么?

来自分类常见问题

(JavaScript)语法规则

来自分类Dev

(JavaScript)语法规则

来自分类Dev

路径语法规则

来自分类Dev

语法规则优先级如何工作?

来自分类Dev

如何在ANTLR的语法规则中处理歧义标记?

来自分类Dev

如何在Scala的语法规则定义中使用〜>和<〜?

来自分类Dev

如何获得令牌的野牛语法规则

来自分类Dev

如何设置优先于文件特定规则的全局语法规则?

来自分类Dev

def或val或lazy val的语法规则?

来自分类Dev

什么是语法规则(在解析中)?

来自分类Dev

树梢忽略语法规则

来自分类Dev

如何在没有root的`vim`中增加文件类型的现有语法规则集?

来自分类Dev

如何使用Scheme中的语法规则从List创建Alist?

来自分类Dev

如何编写 textx 语法规则来检测标准数据类型而不修改它们?

来自分类Dev

Scheme的语法规则-在`...`中混合不同的语法选择

来自分类Dev

在Perl中声明变量的语法的语法规则?

来自分类Dev

如何注释 yacc 中的语法规则和 lex 中的正则表达式匹配规则?

来自分类Dev

匹配一组标记的Bison语法规则

来自分类Dev

从yacc文件中提取BNF语法规则

来自分类Dev

Haskell中缀数据类型构造函数的语法规则

来自分类Dev

将自上而下的语法规则转换为BNF

来自分类Dev

每次重复长度增加的数字块序列的语法规则

来自分类Dev

数学表达式的语法规则(无左递归)

来自分类Dev

带有竖线的可选语法规则序列

来自分类Dev

获取antlr3中的语法规则文本

来自分类Dev

语法规则实际上是正确的还是可能的?

来自分类Dev

匹配一组标记的Bison语法规则

Related 相关文章

热门标签

归档