Я пытаюсь понять PEG, вводя простые грамматики на площадку PEG.js.
Пример 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
= 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
= !.
text()
, который ссылается на полную текстовую строку, которая была сопоставлена, например:digits = [0-9]+ { return text() }
- person Rob Raisch   schedule 26.01.2017