为什么__不匹配时,pegjs不匹配Expression?程序= __ /表达式

时间:2018-11-27 22:19:17

标签: pegjs

示例代码:

Program = __/Expression

Expression = .*

__ = [ \t\r\n]*
test is

2 * (3 + 4)
hahah hahhah
def hahah

在我看来,当__不匹配时,pegjs匹配表达式吗? 但这会出错

第1行,第1列:预期为[ \t\r\n]或输入结尾,但找到了"2"。 预期的行为:

我想知道为什么它不起作用。 我想知道是否有可能让js中的所有函数被调用者都使用pegjs?

实际行为: 解析错误:第1行,第1列:预期为[ \t\r\n]或输入结尾但找到"2"

1 个答案:

答案 0 :(得分:0)

这是因为您规则__始终匹配,因为它匹配空输入。您可以认为,您在内部对语法进行了如下重写(这是完全有效的语法,您可以在线将其输入到pegjs中):

start = Program EOF

Program = __/Expression

Expression = .*

__ = [ \t\r\n]*
// EOF is ephemeral rule that match end of input, i.e. when nothing left in input
EOF = !.

因此您输入的解析为:

<'__' matched>
<'Program' matched>
<'EOF' not matched
  =>backtrack to 'start'
  =>nothing alternatives on 'start'
  =>error
>2 * (3 + 4)