非常に単純なスクリプト構文の「インタープリター」を作成しようと、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');
この種の単一の結果を取得することは理にかなっていますが、出力の構築を進めるために何をすべきかわかりません。