我试图通过将简单的语法输入到PEG.js playground中来围绕 PEG 。
示例 1:
- 输入:
"abcdef1234567ghijklmn8901opqrs"
期望的输出:
["abcdef", "1234567", "ghijklmn", "8901", "opqrs"]
实际输出:
["abcdef", ["1234567", ["ghijklmn", ["8901", ["opqrs", ""]]]]]
这个例子非常有效,但我可以让 PEG.js 不将结果数组嵌套到一百万级吗?我认为诀窍是使用concat()
而不是join()
某处,但我找不到那个地方。
start
= Text
Text
= Numbers Text
/ Characters Text
/ EOF
Numbers
= numbers: [0-9]+ {return numbers.join("")}
Characters
= text: [a-z]+ {return text.join("")}
EOF
= !.
示例 2:
与示例 1 相同的问题和代码,但将 Characters 规则更改为以下内容,我预计这会产生相同的结果。
Characters
= text: (!Numbers .)+ {return text.join("")}
结果输出是:
[",a,b,c,d,e,f", ["1234567", [",g,h,i,j,k,l,m,n", ["8901", [",o,p,q,r,s", ""]]]]]
为什么我得到所有这些空匹配?
示例 3:
最后一个问题。这根本行不通。我怎样才能让它工作?对于奖励积分,任何关于效率的指示?例如,如果可能的话,我应该避免递归吗?
我也很感激一个好的 PEG 教程的链接。我已阅读(http://www.codeproject.com/KB/recipes/grammar_support_1.aspx),但如您所见,我需要更多帮助...
- 输入:
'abcdefghijklmnop"qrstuvwxyz"abcdefg'
- 期望的输出:
["abcdefghijklmnop", "qrstuvwxyz", "abcdefg"]
- 实际输出:
"abcdefghijklmnop\"qrstuvwxyz\"abcdefg"
start
= Words
Words
= Quote
/ Text
/ EOF
Quote
= quote: ('"' .* '"') Words {return quote.join("")}
Text
= text: (!Quote . Words) {return text.join("")}
EOF
= !.