首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简约地打印序列块的有用错误消息

简约地打印序列块的有用错误消息
EN

Stack Overflow用户
提问于 2016-11-29 04:39:15
回答 1查看 278关注 0票数 0

我使用parsimonious (python PEG解析器库)来解析如下文本:

代码语言:javascript
复制
text = """
block block_name_0
{
    foo
}

block block_name_1
{
    bar
}

"""

它是一系列具有简单正文要求(必须是字母)的块,它们构成了整个文本。下面是语法:

代码语言:javascript
复制
grammar = Grammar(r"""
file = block+
block = _ "block" _ alphanum _ start_brace _ block_body _ end_brace _
block_body = alphanum+
alphanum = ~"[_A-z0-9]+"
_ = ~"[\\n\\s]*"
start_brace = "{"
end_brace = "}"
""")

print (grammar.parse(text)) 

我遇到的问题是,如果在第一个块之后的任何块中都有解析错误,我会得到一个无用的错误消息。举个例子,看看下面的文本:

代码语言:javascript
复制
text = """
block block_name_0
{
    !foo
}

block block_name_1
{
    bar
}

"""

这会给出一条有用的错误消息:

代码语言:javascript
复制
[omitted stack trace]
  File "/lib/parsimonious/expressions.py", line 127, in match
    raise error
parsimonious.exceptions.ParseError: Rule 'block_body' didn't match at '!foo
}

但是,如果我有以下文本:

代码语言:javascript
复制
text = """
block block_name_0
{
    foo
}

block block_name_1
{
    !bar
}

"""

我得到了这个错误:

代码语言:javascript
复制
  File "/lib/parsimonious/expressions.py", line 112, in parse
    raise IncompleteParseError(text, node.end, self)
parsimonious.exceptions.IncompleteParseError: Rule 'file' matched in its entirety, but it didn't consume all the text. The non-matching portion of the text begins with 'block block_name_1
{' (line 7, column 1).

它看起来与序列的第一个实例(第一个块)匹配,但是当它在第二个块上失败时,它不会将整个事情视为失败,这正是我希望它做的。我希望它给我一个与块0类似的错误,这样我就可以确切地知道块出了什么问题,而不仅仅是整个块不能被解析。

任何帮助都将不胜感激!

EN

回答 1

Stack Overflow用户

发布于 2016-11-29 18:59:08

不是对简约的回答,但为了更好的错误报告支持,我建议你尝试textX或直接使用它的底层聚乙二醇解析器Arpeggio (免责声明:我是这些库的作者)。

使用textX:

代码语言:javascript
复制
from textx.metamodel import metamodel_from_str

grammar = """
Program: blocks+=Block ;

Block:
 'block' name=ID '{'
     body=Body
 '}'
;

Body: ID+ ;
"""

text = """
block block_name_0
{
    foo
}

block block_name_1
{
    !bar
}

"""

mm = metamodel_from_str(grammar)
program = mm.model_from_str(text)

textX/Arpeggio将尽可能地进行解析,并精确定位错误所在的确切位置:

代码语言:javascript
复制
textx.exceptions.TextXSyntaxError:
   Expected ID at position (9, 5) => 'e_1 {     *!bar }  '.

使用textX,您还可以免费获得AST,例如,您可以这样做:

代码语言:javascript
复制
for block in program.blocks:
    print(block.name, ':', block.body)

出于调试/调查的目的,您还需要一个nice visualization of grammars and models

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

https://stackoverflow.com/questions/40853040

复制
相关文章

相似问题

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