首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在grako语法中定义处理特殊标记的规则优先级。

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

Stack Overflow用户
提问于 2016-12-22 10:47:45
回答 1查看 211关注 0票数 1

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

(Grako风格的) EBNF看起来像:

代码语言:javascript
复制
abbr::str = "etc." | "feat.";
word::str = /[^.]+/;
sentence::Sentence = content:{abbr | word} ".";
page::Page = content:{sentence};

我在以下内容上使用了高级语法:

这是句话。这是一项判决壮举。缩写。我现在没有壮举了。等等.壮举懂英语。

使用一个简单的NodeWalker的结果:

代码语言:javascript
复制
[
    'This is a sentence.',
    'This is a sentence feat.',
    'an abbrevation.',
    "I don't know feat.",
    'etc. feat. know English.'
]

我的期望是:

代码语言:javascript
复制
[
    'This is a sentence.',
    'This is a sentence feat. an abbrevation.',
    "I don't know feat. etc. feat. know English."
]

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

提前谢谢。

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

代码语言:javascript
复制
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)

使用的软件包:Python3.5.2 Grako 3.16.5

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-02 01:05:22

问题在于用于word规则的正则表达式。正则表达式将在您告诉它们的任何内容上进行解析,而regexp则是在空格上吃食。

这种修改的语法可以实现您想要的结果:

代码语言:javascript
复制
@@grammar:: Pages

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

start = page ;

一次--trace运行立即揭示了这个问题。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41281358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档