tl;dr:#define
前処理ステップを実行せずに、jison を使用してC に相当するものをどのようにエミュレートしますか?
私は、簡潔にするために後で再利用できるコードのチャンクに識別子を割り当てる機能を備えた比較的単純な文法に取り組んでいます。例:
# Valid grammar with various elements of different types
foo x.3 y.4 z.5
# Assign an id to a chunk of code. Everything after -> is assigned to id
fill_1-> bar a.1 b.2 c.3
# Use chunk of code later
# Should be equivalent to parsing: "baz d.4 bar a.1 b.2 c.3 e.5"
baz d.4 ["fill_1"] e.5
これまでのところ、コードの割り当て行を正しく識別し、「->」の右側の部分を他のパーサー アクションで使用できる辞書に格納するようにパーサーをセットアップしました。以下に示す定義アクションに関連するコード:
// Lexer
HSPC [ \t]
ID [a-zA-Z_][a-zA-Z0-9_]*
%%
{ID}{HSPC}*"->" {
this.begin("FINISHLINE");
yytext = yytext.replace("->", "").trim();
return "DEFINE";
}
('"'{ID}'"') {
yytext = yytext.slice(1,-1);
return "QUOTED_ID";
}
<FINISHLINE>.* {
this.begin("INITIAL");
yytext = yytext.trim();
return "REST_OF_LINE";
}
%%
// Parser
statement
: "[" QUOTED_ID "]"
{ $$ = (defines[$2] ? defines[$2] : ""); }
| DEFINE REST_OF_LINE
{
defines[$1] = $2;
}
;
%%
var defines = {};
保存されたコードのスニペットを実際にトークン化して解析するように jison を取得するにはどうすればよいですか? AST アプローチを採用する必要がありますか? コードをパーサーに挿入する方法はありますか? これは字句解析段階または解析段階で発生する必要がありますか? 短い例のスニペットを使用して、複数の戦略を採用できることを楽しみにしています。
ありがとう!