次のような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
将来、これはもう少し複雑になるでしょうが、私の最初のアイデアは、行ごとに分割することでした (多くの場合、新しい行は区切り文字として機能します)。私はこのことにまったく慣れていないので、これを解決する方法について完全に間違った考えを持っている可能性があります。だから私の質問は、新しい行をどのように検出するのですか? また、私がやろうとしていることに対するより良いアプローチがあれば、どんなアドバイスも大歓迎です。ありがとう。