我从 PEG 开始PEG.js
。
有些事情我无法理解......我确信它很简单,但它让我在试图理解这个概念时感到头疼......
考虑这个两规则语法:
name
= name:.* {return name.join("")}
put
= "put " a:name " into " b:name "." {put(a,b)}
我希望能够通过这个解析器“将 foo 放入 bar”。并导致put("foo","bar")
评估。
但是 PEG.js 给了我错误Expected " into " or any character but end of input found.
name
如果规则的正则表达式比规则更具体,我想我可以解决这个问题,.*
但为什么必须这样?解析器不能足够聪明地向前看并看到“ into”即将出现,以及“。” 在最后?
我怎样才能实现我正在寻找的东西?这可能是“自下而上”和“自上而下”语法之间的区别吗?
编辑:正则表达式按/put (.*) into (.*)/g
我想要的方式工作——如果我通过它"put foo into bar"
,它会给我$1="foo"
and $2="bar"
。我只是在问我是否可以使用 PEGjs 或 Jison 获得相同的功能(在决定令牌边界的位置之前考虑整个字符串)。