Parsing 解析表达式语法:检测下一个标记?

Parsing 解析表达式语法:检测下一个标记?,parsing,pegjs,Parsing,Pegjs,我以PEG.js开始PEG's 有些事情我想不起来…我相信这很简单,但它让我头痛试图理解这个概念 考虑以下两条规则语法: name = name:.* {return name.join("")} put = "put " a:name " into " b:name "." {put(a,b)} 我希望能够通过这个解析器“将foo放入bar”,并使put(“foo”,“bar”)进行计算 但是PEG.js给了我错误预期的“into”或找到的任何字符,但输入结束。 如果名称规则的正则

我以
PEG.js
开始PEG's

有些事情我想不起来…我相信这很简单,但它让我头痛试图理解这个概念

考虑以下两条规则语法:

name
  = name:.* {return name.join("")}

put
  = "put " a:name " into " b:name "." {put(a,b)}
我希望能够通过这个解析器“将foo放入bar”,并使
put(“foo”,“bar”)
进行计算

但是PEG.js给了我错误
预期的“into”或找到的任何字符,但输入结束。

如果
名称
规则的正则表达式比
*
更具体,我想我可以解决这个问题,但是为什么必须这样呢?解析器难道不能足够聪明地向前看,看到“into”和最后的“.”都将出现吗

我怎样才能实现我所追求的目标?这就是“自下而上”和“自上而下”语法之间的区别吗

编辑: regex
/put(.*)to(.*)/g
的工作方式与我所希望的一样——如果我将它传递给
“put foo into bar”
,它将给我
$1=“foo”
$2=“bar”
。我只是问我是否可以使用PEGjs或Jison获得相同的功能(在决定令牌边界的位置之前考虑整个字符串)。

我相当肯定“themirror”是正确的-第一条规则将吃掉所有输入。不用那个规则就试试吧

此外,您还应该有另一个允许任意空格的规则。我在网上找到这个

_
  = [ \r\n\t]*
下划线将匹配任意数量的空白字符。 然后你可以把你的规则改写成

put
   = "put" _ a:name _ "into" _  b:name _  "." {put(a,b)}

对不起,我的英语不好

第一条规则
*
尝试读取每个字符,以便到达文件末尾

您可以使名称规则更具体(任何字符,但不包括空格或点):

这个有效。。。但不适用于包含空格的名称

put = "put " a:name " into " b:name "." {put(a,b);}

name = c:[^ .]+ {return c.join("");}
对于Node.js

var PEG = require('pegjs');
var text = 'put foo into bar.';
var parser = PEG.buildParser('{function put(a,b){ console.log(a,b); }}put = "put " a:name " into " b:name "." {put(a,b);}\nname = c:[^ .]+ {return c.join("");}');
parser.parse(text);
对于名称中的空格,我没有很好的解决方案,但请尝试以下方法:

nameBeforeInto = (!" into ".)+

nameBeforeDot = [^.]+

put = "put " nameBeforeInto " into " nameBeforeDot "."
NameBeforeTo返回多维数组


Fabrice

我个人没有使用peg.js的经验,但在线文档表明,
*
将贪婪地使用它所能使用的每个字符。我真的很好奇,是否有人能就“自下而上”与“自上而下”解析的关系对这个问题发表评论。这会有所不同吗?
nameBeforeInto = (!" into ".)+

nameBeforeDot = [^.]+

put = "put " nameBeforeInto " into " nameBeforeDot "."