3

非常に単純なスクリプト構文の「インタープリター」を作成しようと、Jison と遊んでいます (これは個人的ないじりプロジェクトのためであり、ビジネスケースではありません!)

コンパイラを作成しなければならなくなってから約 20 年が経ちましたが、いくつかの概念を理解していないだけだと思います。

私が考えているのは、1 行に 1 つずつ、非常に単純なステートメントのプログラムを Jison に渡し、アクションを実行する Javascript ステートメントのストリームを取得することです。

私はこれを間違って見ているかもしれません-解析中に実際にアクションを実行する必要があるのでしょうか? しかし、これは正しく聞こえません。

とにかく、私が持っているのは(私はこれをオンラインで試していますhttp://zaach.github.io/jison/try/

/* lexical grammar */
%lex
%options case-insensitive
%%

\s+                        /* skip whitespace */
is\s+a\b                   return 'OCREATE'
is\s+some\b                return 'ACREATE'
[_a-zA-Z]+[_a-zA-Z0-9]*\b  return 'IDENTIFIER'
<<EOF>>                    return 'EOF'

/lex

/* operator associations and precedence */

%start input

%% /* language grammar */

input
        : /* empty */
        | program EOF
        { return $1; }
;

program
        : expression 
                { $$ = $1; }
        | program expression
                { $$ = $1; }
        ;

expression
        : IDENTIFIER OCREATE IDENTIFIER
            { $$ = 'controller.createOne(\'' + $1 + '\', \'' + $3 + '\');' }

        | IDENTIFIER ACREATE IDENTIFIER
            { $$ = 'controller.createSeveral(\'' + $1 + '\', \'' + $3 + '\');' }
;

したがって、入力の場合:

basket is some apples
orange is a fruit

...私が欲しい:

controller.createSeveral('basket', 'apples');
controller.createOne('orange', 'fruit');

私が得ているものは次のとおりです。

controller.createSeveral('basket', 'apples');

この種の単一の結果を取得することは理にかなっていますが、出力の構築を進めるために何をすべきかわかりません。

4

1 に答える 1

4

問題は の 2 番目のプロダクションにありますprogram:

program
    : expression
            { $$ = $1; }
    | program expression
            { $$ = $1; }

2番目のプロダクションが言っていることは、基本的に、「プログラムは(短い)プログラムの後に式が続く場合がありますが、その意味値は短いプログラムの値です」ということです。

明らかに、プログラムの値を式の値で増やしたいので、次のように言う必要があります。

program
    : expression
            { $$ = $1; }
    | program expression
            { $$ = $1.concat($2); }

(または$$ = $1 + $2、必要に応じて。読みやすくするために改行が必要になる場合があります。)

于 2014-05-28T15:34:58.860 に答える