无法在grako语法中定义用于处理特殊标记的规则优先级

2024-04-30 01:57:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用一个通过Grako生成的语法来分析一些文档,该语法应该解析简单的句子以便进一步分析,但是在使用一些特殊标记时会遇到一些困难。在

(Grako风格)EBNF看起来像:

abbr::str = "etc." | "feat.";
word::str = /[^.]+/;
sentence::Sentence = content:{abbr | word} ".";
page::Page = content:{sentence};

我在以下内容中使用了上面的语法:

This is a sentence. This is a sentence feat. an abbrevation. I don't now feat. etc. feat. know English.

使用简单的NodeWalker的结果:

^{pr2}$

我的期望:

^{3}$

我不知道为什么会发生这种情况,尤其是在最后一个句子中,缩写是句子的一部分,而在前面的句子中却没有。为了清楚起见,我希望句子定义中的abbr规则比单词规则具有更高的优先级,但我不知道如何实现这一点。我玩弄着消极和积极的展望,但没有成功。我知道如何使用正则表达式来达到我预期的结果,但是需要一个上下文无关的语法来进行进一步的分析,所以为了可读性,我想把所有的东西放在一个语法中。我上次用这种方式使用语法已经有一段时间了,但我不记得遇到过这种问题。我通过谷歌搜索了一段时间,但没有成功,所以也许社区可以分享一些见解。在

提前谢谢。在

如果需要,用于测试的代码I:

from grako.model import NodeWalker, ModelBuilderSemantics
from parser import MyParser

class MyWalker(NodeWalker):
    def walk_Page(self, node):
        content = [self.walk(c) for c in node.content]
        print(content)

    def walk_Sentence(self, node):
        return ' '.join(node.content) + "."

    def walk_str(self, node):
        return node

def main(filename: str):
    parser = MyParser(semantics=ModelBuilderSemantics())
    with open(filename, 'r', encoding='utf-8') as src:
        result = parser.parse(src.read(), 'page')
    walker = HRBWalker()
    walker.walk(result)

使用的软件包: Python 3.5.2版 格拉科3.16.5


Tags: selfnodeparserdef语法etccontentgrako
1条回答
网友
1楼 · 发布于 2024-04-30 01:57:27

问题在于您用于word规则的正则表达式。正则表达式将解析您告诉它们的任何内容,而regexp正在吞噬空白。在

这种修改后的语法可以满足您的需要:

@@grammar:: Pages

abbr::str = "etc." | "feat.";
word::str = /[^.\s]+/;
sentence::Sentence = content:{abbr | word} ".";
page::Page = content:{sentence};

start = page ;

一次 trace的运行立即暴露了问题。在

相关问题 更多 >