我有一段 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
将来这会变得更加复杂,但我最初的想法是将其分解为每行(在许多情况下,新行将用作分隔符)。我对这些东西完全陌生,所以我可能对如何解决这个问题有一个完全错误的想法。所以我的问题是如何检测新行?此外,如果对我正在尝试做的事情有更好的方法,任何建议都非常受欢迎。谢谢。