我一直在试图为我设计的一种语言找到一个基本的框架,并且我试图使用Parsimonious为我进行解析。现在,我声明了以下语法:
grammar = Grammar(
"""
program = expr*
expr = _ "{" lvalue (rvalue / expr)* "}" _
lvalue = _ ~"[a-z0-9\\-]+" _
rvalue = _ ~".+" _
_ = ~"[\\n\\s]*"
"""
)
当我试图输出一个简单输入字符串(如"{ do-something some-argument }"
)的结果AST时:
print(grammar.parse("{ do-something some-argument }"))
吝啬鬼决定干脆拒绝它,然后给我这个有点神秘的错误:
Traceback (most recent call last): File "tests.py", line 13, in <module> print(grammar.parse("{ do-something some-argument }")) File "/usr/local/lib/python2.7/dist-packages/parsimonious/grammar.py", line 112, in parse return self.default_rule.parse(text, pos=pos) File "/usr/local/lib/python2.7/dist-packages/parsimonious/expressions.py", line 109, in parse raise IncompleteParseError(text, node.end, self) parsimonious.exceptions.IncompleteParseError: Rule 'program' matched in its entirety, but it didn't consume all the text. The non-matching portion of the text begins with '{ do-something some-' (line 1, column 1).
起初我认为这可能是与我的空白规则_
有关的问题,但是在某些地方尝试删除空白规则失败了几次之后,我仍然遇到了同样的错误。在
我尝试过在网上搜索,但我发现的似乎是远程相关的this question,这对我没有任何帮助。在
我的语法有问题吗?我没有以正确的方式分析输入吗?如果有人能解决这个问题,我们将不胜感激。在
我还不是一个精打细算的专家,但我相信问题是}的regex相同。现在,它解析并(惊人地)通过上下文区分两个定义相同的标记}。在
~".+"
贪婪地匹配输入字符串的其余部分,而没有留下任何东西来匹配其余的产品。我最初通过将rvalue
的regex改为~"[a-z0-9\\-]+"
,与{lvalue
和{如果您的意思是
^{pr2}$rvalue
匹配任何非空白字符序列,则需要如下所示:但是天呐!在
"}"
是右大括号,但它也是一个或多个非空白字符的序列。是"}"
还是{所以我们需要在花括号问题上排斥寄宿生。我想这个语法可以满足您的需要:
我也排除了左大括号,因为您希望这个字符串如何标记化?在
我会料到的
…因为如果}被标记为}视为}
"poo}"
被标记为"poo"
"}"
,而{"{"
"foo"
,那么将{"bar{baz"
或{"baz"
是违反直觉的。在现在我想起了我对亚克的仇恨是如何驱使我对它着迷的。在
相关问题 更多 >
编程相关推荐