4

私は Jison で簡単な式パーサーを作成しており、任意の数の改行を式の二項演算子の後に続けることができます。これまでの私の文法は次のとおりです。

{
    "operators": [
        ["left", "+", "-"],
        ["left", "*", "/", "%"]
    ],
    "bnf": {
        "program": [
            ["statement EOF", "return $1;"]
        ],
        "statement": [
            ["expression newlines", "$$ = $1 + ';';"]
        ],
        "expression": [
            ["NUMBER",                           "$$ = yytext;"],
            ["expression + expression",          "$$ = $1 + ' + ' + $3;"],
            ["expression - expression",          "$$ = $1 + ' - ' + $3;"],
            ["expression * expression",          "$$ = $1 + ' * ' + $3;"],
            ["expression / expression",          "$$ = $1 + ' / ' + $3;"],
            ["expression % expression",          "$$ = $1 + ' % ' + $3;"],
            ["expression + newlines expression", "$$ = $1 + ' + ' + $4;"],
            ["expression - newlines expression", "$$ = $1 + ' - ' + $4;"],
            ["expression * newlines expression", "$$ = $1 + ' * ' + $4;"],
            ["expression / newlines expression", "$$ = $1 + ' / ' + $4;"],
            ["expression % newlines expression", "$$ = $1 + ' % ' + $4;"]
        ],
        "newlines": [
            ["NEWLINE",          ""],
            ["newlines NEWLINE", ""]
        ]
    }
}

ご覧のとおり、二項演算子ごとに 2 つのルールを記述しています。それは私には非常に冗長に思えます。1 つ以上のトークン ( Kleene plus ) ではなく、 0 個以上のNEWLINEトークン ( Kleene star ) に一致するプロダクションが必要です。ジソンでこれをどのように行いますか?

4

1 に答える 1

1

私は Jison を使用し、空白 (改行を含む) を無視します。

%lex の最初の行は次のとおりです。

\s+   /* ignore */

しかし、やりたくない場合は、そのようにする必要はありません。これらの行に沿って何かを試してください:

"expression": [
            ["NUMBER",                           "$$ = yytext;"],
            ["expression + expression",          "$$ = $1 + ' + ' + $3;"],
            ["expression - expression",          "$$ = $1 + ' - ' + $3;"],
            ["expression * expression",          "$$ = $1 + ' * ' + $3;"],
            ["expression / expression",          "$$ = $1 + ' / ' + $3;"],
            ["expression % expression",          "$$ = $1 + ' % ' + $3;"],
            ["expression newlines",              "$$ = $1"],
            ["newlines expression",              "$$ = $2"]
        ],

これにより、式の前後に任意の量の改行を許可する必要があります。

于 2013-07-01T15:32:53.510 に答える