2016-11-28 15 views
0

순서 블록에 대한 유용한 오류 메시지를 인쇄 할 인색 받기 (영숫자 여야 함) 전체 텍스트를 구성합니다.나는이 보이는 텍스트를 구문 분석하는 데 인색 (파이썬 PEG 파서 라이브러리)을 사용하고

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)) 

난 데 문제는 첫 번째 후 모든 블록의 구문 분석 오류가 있다면 내가 쓸모없는 오류 메시지입니다 : 여기에 문법입니다. 이 유용한 오류 메시지가 제공

text = """ 
block block_name_0 
{ 
    !foo 
} 

block block_name_1 
{ 
    bar 
} 

""" 

: 예를 제공하기 위해, 다음과 같은 텍스트가 생각 나는이 얻을

text = """ 
block block_name_0 
{ 
    foo 
} 

block block_name_1 
{ 
    !bar 
} 

""" 

: 그러나

[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 
} 

을 나는 다음과 같은 텍스트가있는 경우 오류 :

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과 비슷한 에러를주기를 원한다. 그래서 블럭 전체가 파싱되지 않을뿐만 아니라 블럭이 잘못되었는지 정확히 알 수있다.

도움이 될 것입니다.

답변

0

간략한 답변은 없지만 좋은 오류보고 지원을 위해서는 textX을 시도하거나 직접적으로 기본 PEG 파서 Arpeggio (면책 조항 : 나는이 라이브러리의 저자 임)을 시도해 보시기 바랍니다.

사용 textX :

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)가 최대한 할 수있는 에러가 어디 있는지 정확한 위치를 파악로 분석됩니다

는 textX와
textx.exceptions.TextXSyntaxError: 
    Expected ID at position (9, 5) => 'e_1 {  *!bar } '. 

당신은 또한 이렇게 무료로 AST를 얻을 수 예를 들면 다음과 같습니다 :

for block in program.blocks: 
    print(block.name, ':', block.body) 

그리고 디버깅/조사 목적으로도 nice visualization of grammars and models.