1

次のような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

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

4

2 に答える 2

0

@riciの答えが役に立ち、正しい軌道に乗った. しかし、[ \t]+私が必要としたことはしませんでした。これらは、私が最終的に使用した2つの行です。

(\r?\n)+\s*         return 'NEWLINE';
[^\S\r\n]+          ; /* whitespace */

ここで見つけました。

編集: @rici の更新された回答は、この回答よりも明確であり、必要なことを正確に実行するので、それを受け入れます。

于 2016-05-31T18:13:30.893 に答える