2016-09-12 4 views
1

, 나는 문법 정의 다음 한 grako에 괄호로 표현을 구문 분석하려고 :"FailedParse : [...] 텍스트의 끝을 기대"때 <code>grako</code> 3.14.0에 대한 <code>search_query.ebnf</code>에서

@@grammar :: SearchQuery 

start = search_query $; 

search_query = parenthesized_query | combined_query | search_term; 
parenthesized_query = '(' search_query ')'; 
combined_query = search_query binary_operator search_query; 
binary_operator = '&' | '|'; 
search_term = /\w+/; 

내가 생성 파서

import search_query_parser 

parser = search_query_parser.SearchQueryParser() 
parser.parse('a') # -> 'a' 
parser.parse('(a)') # -> ['(', 'a', ')'] 
parser.parse('a & b') # -> ['a', '&', 'b'] 
parser.parse('a | b') # -> ['a', '|', 'b'] 
parser.parse('(a|b)&c') # -> ['(', ['a', '|', 'b'], ')', '&', 'c'] 
: 나는 이러한 입력에 대해 예상대로

grako search_query.ebnf --outfile search_query_parser.py 

와 결과 작동 0

하지만 연산자의 오른쪽에 괄호 표현이있는 경우, 파서는 나에게 오류 메시지가 있습니다 :

parser.parse('c&(a|b)') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/home/das-g/.virtualenvs/tmp-d0fd5a9428f7612a/search_query_parser.py", line 82, in parse 
    return super(SearchQueryParser, self).parse(text, *args, **kwargs) 
    File "/home/das-g/.virtualenvs/tmp-d0fd5a9428f7612a/lib/python3.5/site-packages/grako/contexts.py", line 227, in parse 
    result = rule() 
    File "/home/das-g/.virtualenvs/tmp-d0fd5a9428f7612a/lib/python3.5/site-packages/grako/contexts.py", line 86, in wrapper 
    return self._call(rule, name, params, kwparams) 
    File "/home/das-g/.virtualenvs/tmp-d0fd5a9428f7612a/lib/python3.5/site-packages/grako/contexts.py", line 475, in _call 
    node, newpos, newstate = self._invoke_rule(rule, name, params, kwparams) 
    File "/home/das-g/.virtualenvs/tmp-d0fd5a9428f7612a/lib/python3.5/site-packages/grako/contexts.py", line 511, in _invoke_rule 
    rule(self) 
    File "/home/das-g/.virtualenvs/tmp-d0fd5a9428f7612a/search_query_parser.py", line 87, in _start_ 
    self._check_eof() 
    File "/home/das-g/.virtualenvs/tmp-d0fd5a9428f7612a/lib/python3.5/site-packages/grako/contexts.py", line 650, in _check_eof 
    self._error('Expecting end of text.') 
    File "/home/das-g/.virtualenvs/tmp-d0fd5a9428f7612a/lib/python3.5/site-packages/grako/contexts.py", line 450, in _error 
    item 
grako.exceptions.FailedParse: (1:2) Expecting end of text. : 
c&(a|b) 
^ 
start 

내가 뭔가 잘못하고 오전?

답변

1

내가 잘못하고 있니?

나는 그렇게 생각하지 않는다.

"왼쪽 재귀"와 관련하여 grakoknown bug 인 것 같습니다.

버그에서 언급 한 해결 방법도 귀하의 경우에 작동하는 것 같다 :

@@grammar :: SearchQuery 

start = search_query $; 

search_query = parenthesized_query | combined_query | search_term; 
parenthesized_query = '(' search_query | search_term ')'; ## Workaround 
combined_query = search_query binary_operator search_query; 
binary_operator = '&' | '|'; 
search_term = /\w+/; 

즉는 search_query 규칙도를 생성 할 수 있어야한다하더라도, 괄호 안에 명시 적으로 search_term을 언급.

+0

Grako가 (간접적 인) 왼쪽 재귀를 처리하는 데 알려진 버그입니다. – Apalala

+0

@Apalala 그게 내가 쓴 것이 아닌가? (또는 구문 오류가 생겼나요? 영어로 구문 분석 전문 용어에 익숙하지 않습니다.) –

+0

나는 당신이 쓴 것을 다시 주장했습니다. 저는 Grako의 저자입니다. – Apalala