У меня есть Jison кусок кода, который выглядит следующим образом:Как обнаружить новую линию в Джисоне?
%lex
%options flex
%{
if (!('regions' in yy)) {
yy.regions = [];
}
%}
text [a-zA-Z][a-zA-Z0-9]*
%%
\s+ /* skip whitespace */
\n+ return 'NL';
"," return ',';
"-" return '-';
"[" return '[';
"]" return ']';
{text} return 'TEXT';
<<EOF>> return 'EOF';
/lex
%start expressions
%%
expressions
: content EOF
{
console.log(yy.regions);
return yy.regions;
}
| EOF
{
console.log("empty file");
return yy.regions;
}
;
content
: line NL content
{ console.log("NL"); }
| line content
{ console.log("no NL"); }
//| line NL
// { console.log("parsing line with NL"); }
| line
{ console.log("parsing line"); }
;
line
: '[' text ']'
{ yy.regions.push($2); $$ = $2; }
;
text
: TEXT
{ $$ = $1; }
;
Это то, что мой вклад выглядит на данный момент (я начал с самой основной конструкцией, что я планирую иметь, и я хотел бы построить это оттуда):
[sectionA]
[sectionB]
[sectionC]
Проблема, с которой я сталкиваюсь, заключается в том, что новая строка не обнаружена. Он всегда идет в line content
и никогда не попадает в line NL content
. Позже я хотел бы разобрать то, что выглядит примерно так:
[sectionA]
something1, something2, something3
something4, something5, something6
[sectionB]
something4, something5, something6
[sectionC]
something4, something5, something6
something4, something5, something6
something4, something5, something6
В будущем это будет получить немного более сложным, но моя первоначальная идея состояла в том, чтобы отчасти разбить его на каждой линии (новая линия во многих случаях будет служить разделителем). Я совершенно новичок в этом, поэтому у меня может быть совершенно неправильная идея о том, как это решить. Итак, мой вопрос: как определить новую строку? Также, если есть лучший подход к тому, что я пытаюсь сделать, любые советы более чем приветствуются. Благодарю.
Это сработало. Большое спасибо. Он делает именно то, что мне нужно, и ответ был в целом весьма информативным. – pootzko