我从PEG.js开始做聚乙二醇。
考虑以下两个规则的语法:
name
= name:.* {return name.join("")}
put
= "put " a:name " into " b:name "." {put(a,b)}我希望能够传递这个解析器"put foo into bar“。并使put("foo","bar")对其进行评估。
但是PEG.js给出了错误Expected " into " or any character but end of input found.
在最后?
我怎样才能实现我想要的东西?
编辑:正则表达式/put (.*) into (.*)/g按照我想要的方式工作--如果我向它传递"put foo into bar",它就会给我$1="foo"和$2="bar"。
发布于 2014-08-05 19:30:55
我非常确定"themirror“是正确的--第一条规则会吃掉所有的输入。在没有这个规则的情况下尝试一下。
此外,您还应该有另一个允许任意空格的规则。我在网上找到这个..。
_
= [ \r\n\t]*下划线将匹配任意数量的空格字符。然后您可以将您的规则重写为...
put
= "put" _ a:name _ "into" _ b:name _ "." {put(a,b)}发布于 2014-10-11 10:32:56
对不起,我的英语不好。
第一条规则.*尝试读取每个字符,因此到达文件末尾。
您可以使命名规则更具体(任何字符,但不包括空格或点):
name = [^ .]+这个有效..。但不是因为名字里面有空格。
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 "."nameBeforeInto返回多维数组
法布里斯
https://stackoverflow.com/questions/25128488
复制相似问题