Я пытаюсь обернуть голову вокруг 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),, но, как вы можете видеть, мне нужна дополнительная помощь ...
- Input:
'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
= !.