使用antlr的Xpath语法文件中的性能问题

问题描述 投票:0回答:1

创建Xpath语法时遇到性能问题。

整个语法运行良好,直到我们添加了对xpath的支持,例如:

((div)[1]//span)[1]

((//div)[1]/div)[last()]

在语法文件中添加了对此的支持之后,上述xpath开始正常运行,但其他xpath开始出现性能问题。

喜欢这个:

//label[normalize-space(.)='Phone']/parent::lightning-input/parent::slot/parent::slot/parent::span/parent::div/parent::force-record-layout-item/parent::slot/parent::force-record-layout-row/parent::slot/parent::div/parent::div/parent::div/parent::force-record-layout-section/parent::slot/parent::force-record-layout-block/parent::forcegenerated-detailpanel_contact___012b0000000jhhvia4___full___view___recordlayout2/parent::records-lwc-record-layout/parent::slot/parent::records-record-layout-event-broker/parent::div/parent::div/following-sibling::force-form-footer//button

开始解析需要30秒(之前花费了170ms)。>>

这些是在附加的语法文件中添加/修改的代码行,开始出现性能问题:

union
 : expressions+=pathExpression (WS? operator='|' WS? expressions+=pathExpression)*  
 ;

pathExpression
 : expressionAtom
 | expressionAtom nodeSet
 ;

expressionAtom
 : functionCall
 | nodeSet
 | literal
 | parenthesis
 ;  

以前是:

union
 : expressions+=expressionAtom (WS? operator='|' WS? expressions+=expressionAtom)*
 ;

expressionAtom
 : functionCall
 | nodeSet
 | literal 
 | parenthesis
 ;  

并且以前没有任何性能问题。

在调试XpathParser时,我发现这是因为在这种情况下DFAState具有** requiresFullContext作为true **。>>

文档指出,此值的真实值“表明此状态是在SLL预测期间创建的,发现该状态中的配置之间存在冲突。”

您能帮我解决此问题吗,是什么导致它搜索需要时间的完整上下文?

我在为Xpath创建语法时遇到性能问题。整个语法运行良好,直到我们添加了对xpath的支持,例如:((div)[1] // span)[1]或((// div)[1] / div)[...

xpath antlr antlr4
1个回答
0
投票

我不太了解Antlr,但是如何替换

pathExpression
 : expressionAtom
 | expressionAtom nodeSet
 ;
© www.soinside.com 2019 - 2024. All rights reserved.