簡體   English   中英

嘗試解析 grako 中帶括號的表達式時出現“FailedParse: [...] 期望文本結束”

[英]"FailedParse: [...] Expecting end of text" when trying to parse parenthesized expressions in grako

search_query.ebnf ,我對grako 3.14.0 有以下語法定義:

@@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+/;

我生成解析器

grako search_query.ebnf --outfile search_query_parser.py

結果符合我對這些輸入的預期:

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']

但是如果我在運算符的右側有一個帶括號的表達式,解析器會給我一條錯誤消息:

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

難道我做錯了什么?

難道我做錯了什么?

我不這么認為。

這看起來像是grako關於“左遞歸”的已知錯誤

錯誤中提到的解決方法似乎也適用於您的情況:

@@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_term ,即使search_query規則也應該能夠生成它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM