我试图用一个通过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
问题在于您用于
word
规则的正则表达式。正则表达式将解析您告诉它们的任何内容,而regexp正在吞噬空白。在这种修改后的语法可以满足您的需要:
一次
trace
的运行立即暴露了问题。在相关问题 更多 >
编程相关推荐