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

Performance issue in Xpath grammar file using antlr

我在为 Xpath 创建语法时 运行 遇到性能问题。

在我们添加对 xpath 的支持之前,整个语法工作正常:

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

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

在语法文件中添加对此的支持后,上述 xpaths 开始正常工作,但其他 xpaths 开始出现性能问题。

喜欢这个:

//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 秒(之前需要 170 毫秒)。

附加语法文件中的代码行 added/modified 开始出现性能问题:

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 预测期间创建的,该预测发现状态中的配置之间存在冲突。”

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

我不太了解Antlr,但是替换一下怎么样

pathExpression
 : expressionAtom
 | expressionAtom nodeSet
 ;

pathExpression
 : expressionAtom nodeSet?
 ;