首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"FailedParse:[.]期望文本的结束“当试图解析grako中括号大小的表达式时

"FailedParse:[.]期望文本的结束“当试图解析grako中括号大小的表达式时
EN

Stack Overflow用户
提问于 2016-09-12 15:44:43
回答 1查看 267关注 0票数 1

search_query.ebnf中,我为grako 3.14.0定义了以下语法:

代码语言:javascript
复制
@@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+/;

生成解析器的

代码语言:javascript
复制
grako search_query.ebnf --outfile search_query_parser.py

其结果与我所期望的用于这些输入的效果相同:

代码语言:javascript
复制
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']

但是,如果在操作符的右边有一个括号大小的表达式,解析器就会给出一个错误消息:

代码语言:javascript
复制
parser.parse('c&(a|b)')
代码语言:javascript
复制
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

我做错了什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-12 15:44:43

我做错了什么吗?

我不这样认为。

这看起来像一个关于“左递归”的已知臭虫grako中。

bug中提到的解决方法似乎也适用于您的情况:

代码语言:javascript
复制
@@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规则也应该能够产生它。

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

https://stackoverflow.com/questions/39454140

复制
相关文章

相似问题

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