「言語ハッキング方法 ( Hack AIR-Engine! )」の編集履歴(バックアップ)一覧はこちら

言語ハッキング方法 ( Hack AIR-Engine! )」(2009/02/20 (金) 13:35:40) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

---- ** How to hack the ''Reserved Keyword''. (''予約語'') ---- - Open "parser/flex.l" and seek definition statement which includes the ''Reserved Keyord'' or its ''Alias Name'' you want to hack, in the function named chk_rsvdkeywd(). - ファイル "parser/flex.l" を開き、ハックしたい''予約語''、又は、その''別名''を含む定義文を、関数 chk_rsvdkeywd() の中から検索します。 ** Example: "elif" extern int chk_rsvdkeywd(char *str){ ... if( strcmp(str,"elif")==0 ){ _f("[ELIF]",0); return(ELIF); } ... } > Each token in AIR-Script Program is extracted and passed to this function, chk_rsvdkeywd(), to check whether it is a Reserved Keyword or not. 1st parameter, str, is a string to be checked. > Function _f() is a debug function in flex scanner. It displays debug message with line number if "-f" option is given to AIR-Engine. So you can just ignore it. > ELIF is a termnal symbol defined in bison parser. It will be reduced to if_stmt non terminal symbol, if correct 'if' statement comes in. ** Example: Change Keyword from "elif" to "elseif" extern int chk_rsvdkeywd(char *str){ ... //if( strcmp(str,"elif")==0 ){ _f("[ELIF]",0); return(ELIF); } if( strcmp(str,"elseif")==0 ){ _f("[ELIF]",0); return(ELIF); } ... } ** Example: Define "elseif" as Alias Name for "elif" extern int chk_rsvdkeywd(char *str){ ... if( strcmp(str,"elif")==0 ){ _f("[ELIF]",0); return(ELIF); } if( strcmp(str,"elseif")==0 ){ _f("[ELIF]",0); return(ELIF); } ... } ** Example: Remove Keyword of "elif" extern int chk_rsvdkeywd(char *str){ ... if( strcmp(str,"(N/A)")==0 ){ _f("[ELIF]",0); return(ELIF); } ... } > Identifier of "(N/A)" cannot be a valid token in AIR-Lang, so it will never passed to this function. Or you can just remove this line completely. ---- ** How to hack the ''Built-In Constants''. (''組み込み定数'') ---- - Open "admin/inst_syscnst.c" and seek definition statement for Built-In Constant you want to hack, in the function named inst_syscnst(void). - ファイル "admin/inst_syscnst.c" を開き、ハックしたい組み込み定数の定義文を、関数 inst_syscnst() の中から検索します。 ** Example: "M_PI" void inst_syscnst(int s_argc,char *s_argv[]){ ... wr_dtab(GL_DTAB,"M_PI",'D',M_PI); .... } > Each system built-in constat is installed into AIR-Engine by inst_syscnst(), by using wr_dtab() function. Parameters to this function is as follows. # GL_DTAB = This identifier "M_PI" has global scope. # "M_PI" = Name of Identifier, which can be seen from AIR-Script Program. # 'D' = Value type of this identifier. ( 'D' = Double ) # M_PI = Initial Value to be installed. ( M_PI = 3.1415 ... ) ** Example: Change Name from "M_PI" to "PI" void inst_syscnst(int s_argc,char *s_argv[]){ ... // wr_dtab(GL_DTAB,"M_PI",'D',M_PI); wr_dtab(GL_DTAB,"PI",'D',M_PI); .... } ** Example: Remove Name of "M_PI" completely void inst_syscnst(int s_argc,char *s_argv[]){ ... // wr_dtab(GL_DTAB,"M_PI",'D',M_PI); .... } ** Example: Define *NEW* Name of "ONE","TWO", and "THREE" in double void inst_syscnst(int s_argc,char *s_argv[]){ ... wr_dtab(GL_DTAB,"ONE" ,'D',1.0); wr_dtab(GL_DTAB,"TWO" ,'D',2.0); wr_dtab(GL_DTAB,"THREE",'D',3.0); .... } ** Example: Define *NEW* Name of "ONE","TWO", and "THREE" in integer void inst_syscnst(int s_argc,char *s_argv[]){ ... wr_dtab(GL_DTAB,"ONE" ,'I',1); wr_dtab(GL_DTAB,"TWO" ,'I',2); wr_dtab(GL_DTAB,"THREE",'I',3); .... } ---- ** How to hack the ''Built-In Functions''. (''組み込み関数'') ---- - Open "admin/inst_sysfunc.c" and seek definition statement for Built-In Function you want to hack, in the function named inst_sysfunc(void). - ファイル "admin/inst_sysfunc.c" を開き、ハックしたい組み込み関数の定義文を、関数 inst_sysfunc() の中から検索します。 ** Example: "cos()" void inst_sysfunc(void){ ... wr_dtab(GL_DTAB,"cos",'X',i_cos,1); .... } > Each system built-in function is installed into AIR-Engine by inst_sysfunc(), by using wr_dtab() function. Parameters to this function is as follows. # GL_DTAB = This identifier "cos" has global scope. # "cos" = Name of Identifier, which can be seen from AIR-Script Program. # 'X' = This identifier is Built-In Function. # i_cos = Internal function name for this identifier. ( Exist in icode/ ) # 1 = Parameter Count of this function. ** Example: Change Keyword from "cos()" to "cosine()" void inst_sysfunc(void){ ... // wr_dtab(GL_DTAB,"cos",'X',i_cos,1); wr_dtab(GL_DTAB,"cosine",'X',i_cos,1); .... } ** Example: Define "cosine()" as Alias Name for "cos()" void inst_sysfunc(void){ ... wr_dtab(GL_DTAB,"cos",'X',i_cos,1); wr_dtab(GL_DTAB,"cosine",'X',i_cos,1); .... } ** Example: Remove "cos()" void inst_sysfunc(void){ ... wr_dtab(GL_DTAB,"(N/A)",'X',i_cos,1); .... } > Identifier of "(N/A)" cannot be a valid function name in AIR-Lang, so it will disable this function. Or you can just remove this line completely. ** FYI (参考) - If you want to change its internal behavior, seek "i_cos.c" in "icode/" and modify it for your purpose. - もし、その関数の内部動作を変更したい場合は、"icode/*" 中から "i_cos.c" を探し、その内容を変更してください。 ** Define *NEW* Built-In Function: "log3()" - The best way to define *NEW* built-in function is to utilize pre-existing functions. In this case "log2()" would be a good sample. - 新しい組込み関数を定義する最良の方法は、既にある関数を利用することです。この場合は、関数 "log2()" を利用するのがベストとなります。 + Seek source code file for log2() in icode/*. In most cases file name for built-in function is "i_" + name + ".c". ( In this case, its "i_log2.c". ) + Copy i_log2.c to i_log3.c in the same directory layer. + Edit i_log3.c so that it will return log3(). + Here is the source. /****************************************************************************/ // i_log2.c /****************************************************************************/ #include "air.h" void i_log2(void){ /*** AIR-Lang: a=log2(x) ***/ char *fx="log2()"; /* Function Name */ dtab *a,*x; /* Pointer to AIR-Script Variables */ /* Set Parameters */ if(set_iparam1(fx,&a,&x,"ID")!=TRUE) pterm(EXIT_FAILURE); /*--------------------------------------------------------------------------*/ // Do log2()!! /*--------------------------------------------------------------------------*/ a->type='D'; a->dval=log2(cdbl(x)); } > *a is a return value from log2(). ( struct dtab is defined in air.h ) > *x is a parameter value to log2(). > set_iparam1() sets parameter of log2() to *x, but it only accepts if it is 'I'nt or 'D'ouble. > *a->type='D'; sets return type as 'D'ouble. > *a->dval=...; sets return value in a storage area for 'D'ouble. > cdbl(x) casts numerical value into 'D'ouble. ( cdbl = cast-double ) + In this case, substitude /log2()/log3()/ at first, then replace "*a->dval=log3(cdbl(x))" line like this. a->dval=log10(cdbl(x))/log10(3.0); + After preparing i_log3.c, you need to declare this function correctrly to supress compiling waring message from GCC. + Open "admin/ifunc.h" and seek declaration line for i_log2() then insert i_log3() declaration like this. (before) extern void i_log(void),i_log2(void),i_log10(void); (after) extern void i_log(void),i_log2(void),i_log3(void),i_log10(void); + Then install it AIR-Engine as built-in function. + Open "admin/inst_sysfunc.c and seek definition line for log2() then insert log3() definition like this. (before) wr_dtab(GL_DTAB,"log" ,'X',i_log ,1); wr_dtab(GL_DTAB,"log2" ,'X',i_log2 ,1); wr_dtab(GL_DTAB,"log10",'X',i_log10,1); (after) wr_dtab(GL_DTAB,"log" ,'X',i_log ,1); wr_dtab(GL_DTAB,"log2" ,'X',i_log2 ,1); wr_dtab(GL_DTAB,"log3" ,'X',i_log3 ,1); wr_dtab(GL_DTAB,"log10",'X',i_log10,1); ---- ** How to hack ''Colon Command''. (''コロンコマンド'') ---- - Open file "parser/flex.l" and seek Regular Expression Pattern for Colon Command you want to hack. Then change its pattern or action according to your need. Refere to flex(1) manual in detail. - ファイル parser/flex.l を開き、ハック対象とするコロンコマンドの正規表現パターンを検索します。そしてそのパターン又はアクションをお好みに応じて変更して下さい。詳細については flex(1) マニュアルを参照して下さい。
&br() ---- ** How to hack the ''Reserved Keyword''. (''予約語'') ---- - Open "parser/flex.l" and seek definition statement which includes the ''Reserved Keyord'' or its ''Alias Name'' you want to hack, in the function named chk_rsvdkeywd(). - ファイル "parser/flex.l" を開き、ハックしたい''予約語''、又は、その''別名''を含む定義文を、関数 chk_rsvdkeywd() の中から検索します。 ** Example: "elif" extern int chk_rsvdkeywd(char *str){ ... if( strcmp(str,"elif")==0 ){ _f("[ELIF]",0); return(ELIF); } ... } > Each token in AIR-Script Program is extracted and passed to this function, chk_rsvdkeywd(), to check whether it is a Reserved Keyword or not. 1st parameter, str, is a string to be checked. > Function _f() is a debug function in flex scanner. It displays debug message with line number if "-f" option is given to AIR-Engine. So you can just ignore it. > ELIF is a termnal symbol defined in bison parser. It will be reduced to if_stmt non terminal symbol, if correct 'if' statement comes in. ** Example: Change Keyword from "elif" to "elseif" extern int chk_rsvdkeywd(char *str){ ... //if( strcmp(str,"elif")==0 ){ _f("[ELIF]",0); return(ELIF); } if( strcmp(str,"elseif")==0 ){ _f("[ELIF]",0); return(ELIF); } ... } ** Example: Define "elseif" as Alias Name for "elif" extern int chk_rsvdkeywd(char *str){ ... if( strcmp(str,"elif")==0 ){ _f("[ELIF]",0); return(ELIF); } if( strcmp(str,"elseif")==0 ){ _f("[ELIF]",0); return(ELIF); } ... } ** Example: Remove Keyword of "elif" extern int chk_rsvdkeywd(char *str){ ... if( strcmp(str,"(N/A)")==0 ){ _f("[ELIF]",0); return(ELIF); } ... } > Identifier of "(N/A)" cannot be a valid token in AIR-Lang, so it will never passed to this function. Or you can just remove this line completely. &br() ---- ** How to hack the ''Built-In Constants''. (''組み込み定数'') ---- - Open "admin/inst_syscnst.c" and seek definition statement for Built-In Constant you want to hack, in the function named inst_syscnst(void). - ファイル "admin/inst_syscnst.c" を開き、ハックしたい組み込み定数の定義文を、関数 inst_syscnst() の中から検索します。 ** Example: "M_PI" void inst_syscnst(int s_argc,char *s_argv[]){ ... wr_dtab(GL_DTAB,"M_PI",'D',M_PI); .... } > Each system built-in constat is installed into AIR-Engine by inst_syscnst(), by using wr_dtab() function. Parameters to this function is as follows. # GL_DTAB = This identifier "M_PI" has global scope. # "M_PI" = Name of Identifier, which can be seen from AIR-Script Program. # 'D' = Value type of this identifier. ( 'D' = Double ) # M_PI = Initial Value to be installed. ( M_PI = 3.1415 ... ) ** Example: Change Name from "M_PI" to "PI" void inst_syscnst(int s_argc,char *s_argv[]){ ... // wr_dtab(GL_DTAB,"M_PI",'D',M_PI); wr_dtab(GL_DTAB,"PI",'D',M_PI); .... } ** Example: Remove Name of "M_PI" completely void inst_syscnst(int s_argc,char *s_argv[]){ ... // wr_dtab(GL_DTAB,"M_PI",'D',M_PI); .... } ** Example: Define *NEW* Name of "ONE","TWO", and "THREE" in double void inst_syscnst(int s_argc,char *s_argv[]){ ... wr_dtab(GL_DTAB,"ONE" ,'D',1.0); wr_dtab(GL_DTAB,"TWO" ,'D',2.0); wr_dtab(GL_DTAB,"THREE",'D',3.0); .... } ** Example: Define *NEW* Name of "ONE","TWO", and "THREE" in integer void inst_syscnst(int s_argc,char *s_argv[]){ ... wr_dtab(GL_DTAB,"ONE" ,'I',1); wr_dtab(GL_DTAB,"TWO" ,'I',2); wr_dtab(GL_DTAB,"THREE",'I',3); .... } &br() ---- ** How to hack the ''Built-In Functions''. (''組み込み関数'') ---- - Open "admin/inst_sysfunc.c" and seek definition statement for Built-In Function you want to hack, in the function named inst_sysfunc(void). - ファイル "admin/inst_sysfunc.c" を開き、ハックしたい組み込み関数の定義文を、関数 inst_sysfunc() の中から検索します。 ** Example: "cos()" void inst_sysfunc(void){ ... wr_dtab(GL_DTAB,"cos",'X',i_cos,1); .... } > Each system built-in function is installed into AIR-Engine by inst_sysfunc(), by using wr_dtab() function. Parameters to this function is as follows. # GL_DTAB = This identifier "cos" has global scope. # "cos" = Name of Identifier, which can be seen from AIR-Script Program. # 'X' = This identifier is Built-In Function. # i_cos = Internal function name for this identifier. ( Exist in icode/ ) # 1 = Parameter Count of this function. ** Example: Change Keyword from "cos()" to "cosine()" void inst_sysfunc(void){ ... // wr_dtab(GL_DTAB,"cos",'X',i_cos,1); wr_dtab(GL_DTAB,"cosine",'X',i_cos,1); .... } ** Example: Define "cosine()" as Alias Name for "cos()" void inst_sysfunc(void){ ... wr_dtab(GL_DTAB,"cos",'X',i_cos,1); wr_dtab(GL_DTAB,"cosine",'X',i_cos,1); .... } ** Example: Remove "cos()" void inst_sysfunc(void){ ... wr_dtab(GL_DTAB,"(N/A)",'X',i_cos,1); .... } > Identifier of "(N/A)" cannot be a valid function name in AIR-Lang, so it will disable this function. Or you can just remove this line completely. ** FYI (参考) - If you want to change its internal behavior, seek "i_cos.c" in "icode/" and modify it for your purpose. - もし、その関数の内部動作を変更したい場合は、"icode/*" 中から "i_cos.c" を探し、その内容を変更してください。 ** Define *NEW* Built-In Function: "log3()" - The best way to define *NEW* built-in function is to utilize pre-existing functions. In this case "log2()" would be a good sample. - 新しい組込み関数を定義する最良の方法は、既にある関数を利用することです。この場合は、関数 "log2()" を利用するのがベストとなります。 + Seek source code file for log2() in icode/*. In most cases file name for built-in function is "i_" + name + ".c". ( In this case, its "i_log2.c". ) + Copy i_log2.c to i_log3.c in the same directory layer. + Edit i_log3.c so that it will return log3(). + Here is the source. /****************************************************************************/ // i_log2.c /****************************************************************************/ #include "air.h" void i_log2(void){ /*** AIR-Lang: a=log2(x) ***/ char *fx="log2()"; /* Function Name */ dtab *a,*x; /* Pointer to AIR-Script Variables */ /* Set Parameters */ if(set_iparam1(fx,&a,&x,"ID")!=TRUE) pterm(EXIT_FAILURE); /*--------------------------------------------------------------------------*/ // Do log2()!! /*--------------------------------------------------------------------------*/ a->type='D'; a->dval=log2(cdbl(x)); } > *a is a return value from log2(). ( struct dtab is defined in air.h ) > *x is a parameter value to log2(). > set_iparam1() sets parameter of log2() to *x, but it only accepts if it is 'I'nt or 'D'ouble. > *a->type='D'; sets return type as 'D'ouble. > *a->dval=...; sets return value in a storage area for 'D'ouble. > cdbl(x) casts numerical value into 'D'ouble. ( cdbl = cast-double ) + In this case, substitude /log2()/log3()/ at first, then replace "*a->dval=log3(cdbl(x))" line like this. a->dval=log10(cdbl(x))/log10(3.0); + After preparing i_log3.c, you need to declare this function correctrly to supress compiling waring message from GCC. + Open "admin/ifunc.h" and seek declaration line for i_log2() then insert i_log3() declaration like this. (before) extern void i_log(void),i_log2(void),i_log10(void); (after) extern void i_log(void),i_log2(void),i_log3(void),i_log10(void); + Then install it AIR-Engine as built-in function. + Open "admin/inst_sysfunc.c and seek definition line for log2() then insert log3() definition like this. (before) wr_dtab(GL_DTAB,"log" ,'X',i_log ,1); wr_dtab(GL_DTAB,"log2" ,'X',i_log2 ,1); wr_dtab(GL_DTAB,"log10",'X',i_log10,1); (after) wr_dtab(GL_DTAB,"log" ,'X',i_log ,1); wr_dtab(GL_DTAB,"log2" ,'X',i_log2 ,1); wr_dtab(GL_DTAB,"log3" ,'X',i_log3 ,1); wr_dtab(GL_DTAB,"log10",'X',i_log10,1); &br() ---- ** How to hack ''Colon Command''. (''コロンコマンド'') ---- - Open file "parser/flex.l" and seek Regular Expression Pattern for Colon Command you want to hack. Then change its pattern or action according to your need. Refere to flex(1) manual in detail. - ファイル parser/flex.l を開き、ハック対象とするコロンコマンドの正規表現パターンを検索します。そしてそのパターン又はアクションをお好みに応じて変更して下さい。詳細については flex(1) マニュアルを参照して下さい。

表示オプション

横に並べて表示:
変化行の前後のみ表示:
記事メニュー
目安箱バナー