Lua1.1構文解析
lua_にかかわらずdostringかlua_dofile、文法解析luaを呼び出しました.parse.luaでは文法解析器はyaccで生成され、y.tabです.cファイル、lua.stxはyaccの入力ファイルです.ここで述べたものは基本的にコンパイル原理書に紹介されていますが、さらに理解する必要がある場合は、自分で参照してください.文法分析を話す前に、文法分析を話します.luaの文法分析は手書きで、手書きの文法分析の性能は比較的に良くて、これはlua 1.1持参した文書に説明があり、ファイル名lua.ps,8ページ目(またはwww.lua.org/semish 94.htmlのImplementationセクション)では,手書きの構文解析器の性能が2倍に向上した.(ファイル内のタイトルは、The design and implementation of a language for extendingアプリケーション)です.文法解析の入力はlua_からsetinputから来たそのInput関数ポインタ.いくつかのリザーブワードは特殊な処理を行い,reserved配列にはすべてのリザーブワードが存在する.構文解析の主な関数はyylexで、構文解析によって呼び出され、毎回tokenが返されます.その内部実装は大きなswitch caseである.ただし、tokenのタイプがNAMEの場合、メソッドfindReservedを呼び出して予約ワードであるかどうかを確認し、もしそうであれば、直接予約ワードtokenを返します.tokenは2つに分けられ、1つはタイプのみで、1つは値とタイプがあります.tokenのタイプが自分自身を記述するのに十分であれば、予約語、比較演算子などの値は必要ありません.タイプだけが自分自身を識別するのに十分です.数値型のように値が必要です.例えば、1つの数が789であれば、文法分析はNUMBERを返し、789の値を返します.文法分析の使い方については、文法分析自身のことです.参考になるLex入力ファイル(Lua 1.1では使用されていませんが)は、src/yaccディレクトリのluaです.lex.lexがわかりやすい.cの中のあのswith caseはどうしてそう書きますか.次に文法解析luaを見てみましょう.parse :y.tab.cファイル
構文解析yyparse(yaccによって生成された構文解析器のエントリ)の後、仮想マシン実行命令lua_を呼び出すexecute.PrintCodeは、LISTINGマクロによって制御されるバイトコードを印刷します.バイトコードを印刷する場合は、PrintCodeが正常に呼び出されることを保証する必要があります.詳細については、バイトコードを印刷するを参照してください.ここではyaccによって生成されるので、yaccの内容については私が注目しているポイントではなく、詳しく説明しないで、興味のある人は自分で関連資料を探すことができます.私はそれがlua 3から好きです.1バージョンからの手書きの再帰的降下文法解析は,可能であればその時になってから文法解析過程を解析しよう.lua 1.1はスタック仮想マシンであるが,彼が生成した命令は保存して直接使用することはできず,ソースコード解析後に直接生成しなければならない.中にはコンパイルというステップはなく,説明しながら実行されていると考えられる.バージョンLua 2へ4生成された命令を保存することができ、独立したコンパイラがあれば、データとコードのすべての情報がコンパイル生成されたバイトコードに保存されます.構文解析の結果は,バイトコード命令配列,すなわち,以前に見たバイトコード展示である.これでバイトコードが生成され,コンパイラフロントエンドの作業は完了した.
/*
** Parse LUA code and execute global statement.
** Return 0 on success or 1 on error.
*/
int lua_parse (void)
{
Byte *init = initcode = (Byte *) calloc(GAPCODE, sizeof(Byte));
maincode = 0;
maxmain = GAPCODE;
if (init == NULL)
{
lua_error("not enough memory");
return 1;
}
err = 0;
if (yyparse () || (err==1)) return 1;
initcode[maincode++] = HALT;
init = initcode;
#if LISTING
PrintCode(init,init+maincode);
#endif
if (lua_execute (init)) return 1;
free(init);
return 0;
}
構文解析yyparse(yaccによって生成された構文解析器のエントリ)の後、仮想マシン実行命令lua_を呼び出すexecute.PrintCodeは、LISTINGマクロによって制御されるバイトコードを印刷します.バイトコードを印刷する場合は、PrintCodeが正常に呼び出されることを保証する必要があります.詳細については、バイトコードを印刷するを参照してください.ここではyaccによって生成されるので、yaccの内容については私が注目しているポイントではなく、詳しく説明しないで、興味のある人は自分で関連資料を探すことができます.私はそれがlua 3から好きです.1バージョンからの手書きの再帰的降下文法解析は,可能であればその時になってから文法解析過程を解析しよう.lua 1.1はスタック仮想マシンであるが,彼が生成した命令は保存して直接使用することはできず,ソースコード解析後に直接生成しなければならない.中にはコンパイルというステップはなく,説明しながら実行されていると考えられる.バージョンLua 2へ4生成された命令を保存することができ、独立したコンパイラがあれば、データとコードのすべての情報がコンパイル生成されたバイトコードに保存されます.構文解析の結果は,バイトコード命令配列,すなわち,以前に見たバイトコード展示である.これでバイトコードが生成され,コンパイラフロントエンドの作業は完了した.