@@ -50,74 +50,6 @@ void ParserState_iterStart(struct ParserState* ps);
5050void ParserState_iterEnd (struct ParserState * ps );
5151char * Parser_popToken (Args * buffs_p , char * tokens );
5252
53- /* Syntex item */
54- const SyntaxItem syntexItemList [] = {
55- /* clang-format off */
56- {
57- .asmCode = "RUN" ,
58- .astNodeName = "method" ,
59- .isUseNodeValue = PIKA_TRUE
60- },
61- {
62- .asmCode = "OPT" ,
63- .astNodeName = "operator" ,
64- .isUseNodeValue = PIKA_TRUE
65- },
66- {
67- .asmCode = "BYT" ,
68- .astNodeName = "bytes" ,
69- .isUseNodeValue = PIKA_TRUE
70- },
71- {
72- .asmCode = "NUM" ,
73- .astNodeName = "num" ,
74- .isUseNodeValue = PIKA_TRUE
75- },
76- {
77- .asmCode = "IMP" ,
78- .astNodeName = "import" ,
79- .isUseNodeValue = PIKA_TRUE
80- },
81- {
82- .asmCode = "REF" ,
83- .astNodeName = "ref" ,
84- .isUseNodeValue = PIKA_TRUE
85- },
86- {
87- .asmCode = "STR" ,
88- .astNodeName = "string" ,
89- .isUseNodeValue = PIKA_TRUE
90- },
91-
92- #if PIKA_SYNTAX_SLICE_ENABLE
93- {
94- .asmCode = "SLC" ,
95- .astNodeName = "slice" ,
96- .isUseNodeValue = PIKA_FALSE
97- },
98- #endif
99-
100- #if PIKA_BUILTIN_STRUCT_ENABLE
101- {
102- .asmCode = "DCT" ,
103- .astNodeName = "dict" ,
104- .isUseNodeValue = PIKA_FALSE
105- },
106- {
107- .asmCode = "LST" ,
108- .astNodeName = "list" ,
109- .isUseNodeValue = PIKA_FALSE
110- },
111- #endif
112-
113- {
114- .asmCode = "OUT" ,
115- .astNodeName = "left" ,
116- .isUseNodeValue = PIKA_TRUE
117- }
118- /* clang-format on */
119- };
120-
12153uint16_t Tokens_getSize (char * tokens ) {
12254 if (strEqu ("" , tokens )) {
12355 return 0 ;
@@ -712,6 +644,16 @@ char* Lexer_getTokens(Args* outBuffs, char* stmt) {
712644 continue ;
713645 }
714646 }
647+ /* in */
648+ if ('i' == c0 ) {
649+ if (('n' == c1 ) && (' ' == c2 )) {
650+ tokens_arg =
651+ Lexer_setSymbel (tokens_arg , stmt , i , & symbol_start_index );
652+ tokens_arg = Lexer_setToken (tokens_arg , TOKEN_operator , " in " );
653+ i = i + 2 ;
654+ continue ;
655+ }
656+ }
715657 /* as */
716658 if ('a' == c0 ) {
717659 if (('s' == c1 ) && (' ' == c2 )) {
@@ -803,10 +745,10 @@ uint8_t Parser_isContainToken(char* tokens,
803745}
804746
805747static const char operators [][9 ] = {
806- "**" , "~" , "*" , "/" , "%" , "//" , "+" , "-" ,
807- ">>" , "<<" , "&" , "^" , "|" , "<" , "<=" , ">" ,
808- ">=" , "!=" , "==" , " is " , "%=" , "/ =" , "// =" , "- =" ,
809- "+=" , "*=" , "**=" , " not " , " and " , " or " , " import " };
748+ "**" , "~" , "*" , "/" , "%" , "//" , "+" , "-" ,
749+ ">>" , "<<" , "&" , "^" , "|" , "<" , "<=" , ">" ,
750+ ">=" , "!=" , "==" , " is " , " in " , "% =" , "/ =" , "// =" ,
751+ "-=" , " +=" , "*=" , "**=" , " not " , " and " , " or " , " import " };
810752
811753char * Lexer_getOperator (Args * outBuffs , char * stmt ) {
812754 Args buffs = {0 };
@@ -1829,13 +1771,13 @@ AST* AST_parseLine(char* line, Stack* block_stack) {
18291771 goto block_matched ;
18301772 }
18311773 if (strIsStartWith (line_start , "raise " )) {
1774+ AST_setThisNode (ast , "raise" , "" );
18321775 char * lineBuff = strsCopy (& buffs , line_start );
18331776 strsPopToken (& buffs , lineBuff , ' ' );
18341777 stmt = lineBuff ;
18351778 if (strEqu ("" , stmt )) {
18361779 stmt = "RuntimeError" ;
18371780 }
1838- AST_setThisNode (ast , "raise" , "" );
18391781 goto block_matched ;
18401782 }
18411783#endif
@@ -2241,6 +2183,7 @@ char* Parser_fileToAsm(Args* outBuffs, char* filename) {
22412183char * AST_appandPikaASM (AST * ast , AST * subAst , Args * outBuffs , char * pikaAsm ) {
22422184 int deepth = obj_getInt (ast , "deepth" );
22432185 Args buffs = {0 };
2186+ /* append each queue item */
22442187 while (1 ) {
22452188 QueueObj * subStmt = queueObj_popObj (subAst );
22462189 if (NULL == subStmt ) {
@@ -2249,17 +2192,32 @@ char* AST_appandPikaASM(AST* ast, AST* subAst, Args* outBuffs, char* pikaAsm) {
22492192 obj_setInt (ast , "deepth" , deepth + 1 );
22502193 pikaAsm = AST_appandPikaASM (ast , subStmt , & buffs , pikaAsm );
22512194 }
2195+
2196+ /* Byte code generate rules */
2197+ const GenRule rules_subAst [] = {
2198+ {._asm = "RUN" , .type = VAL_DYNAMIC , .ast = "method" },
2199+ {._asm = "OPT" , .type = VAL_DYNAMIC , .ast = "operator" },
2200+ {._asm = "BYT" , .type = VAL_DYNAMIC , .ast = "bytes" },
2201+ {._asm = "NUM" , .type = VAL_DYNAMIC , .ast = "num" },
2202+ {._asm = "IMP" , .type = VAL_DYNAMIC , .ast = "import" },
2203+ {._asm = "REF" , .type = VAL_DYNAMIC , .ast = "ref" },
2204+ {._asm = "STR" , .type = VAL_DYNAMIC , .ast = "string" },
2205+ {._asm = "SLC" , .type = VAL_NONEVAL , .ast = "slice" },
2206+ {._asm = "DCT" , .type = VAL_NONEVAL , .ast = "dict" },
2207+ {._asm = "LST" , .type = VAL_NONEVAL , .ast = "list" },
2208+ {._asm = "OUT" , .type = VAL_DYNAMIC , .ast = "left" }};
2209+
22522210 char * buff = args_getBuff (& buffs , PIKA_SPRINTF_BUFF_SIZE );
22532211
22542212 /* append the syntax item */
2255- for (size_t i = 0 ; i < sizeof (syntexItemList ) / sizeof (SyntaxItem ); i ++ ) {
2256- char * astNodeVal = obj_getStr (subAst , syntexItemList [i ].astNodeName );
2213+ for (size_t i = 0 ; i < sizeof (rules_subAst ) / sizeof (GenRule ); i ++ ) {
2214+ GenRule rule = rules_subAst [i ];
2215+ char * astNodeVal = obj_getStr (subAst , rule .ast );
22572216 if (NULL != astNodeVal ) {
22582217 /* e.g. "0 RUN print \n" */
2259- __platform_sprintf (buff , "%d %s " , deepth ,
2260- syntexItemList [i ].asmCode );
2218+ __platform_sprintf (buff , "%d %s " , deepth , rule ._asm );
22612219 Arg * abuff = arg_newStr (buff );
2262- if (syntexItemList [ i ]. isUseNodeValue ) {
2220+ if (rule . type == VAL_DYNAMIC ) {
22632221 abuff = arg_strAppend (abuff , astNodeVal );
22642222 }
22652223 abuff = arg_strAppend (abuff , "\n" );
@@ -2289,6 +2247,29 @@ char* ASM_addBlockDeepth(AST* ast,
22892247 return pikaAsm ;
22902248}
22912249
2250+ char * GenRule_toAsm (GenRule rule ,
2251+ Args * buffs ,
2252+ AST * ast ,
2253+ char * pikaAsm ,
2254+ int deepth ) {
2255+ char * buff = args_getBuff (buffs , PIKA_SPRINTF_BUFF_SIZE );
2256+ /* parse stmt ast */
2257+ pikaAsm = AST_appandPikaASM (ast , ast , buffs , pikaAsm );
2258+ /* e.g. "0 CTN \n" */
2259+ __platform_sprintf (buff , "%d %s " , deepth , rule ._asm );
2260+ Arg * abuff = arg_newStr (buff );
2261+ if (rule .type == VAL_DYNAMIC ) {
2262+ abuff = arg_strAppend (abuff , obj_getStr (ast , rule .ast ));
2263+ }
2264+ if (rule .type == VAL_STATIC_ ) {
2265+ abuff = arg_strAppend (abuff , rule .val );
2266+ }
2267+ abuff = arg_strAppend (abuff , "\n" );
2268+ pikaAsm = strsAppend (buffs , pikaAsm , arg_getStr (abuff ));
2269+ arg_deinit (abuff );
2270+ return pikaAsm ;
2271+ }
2272+
22922273char * AST_toPikaASM (AST * ast , Args * outBuffs ) {
22932274 Args buffs = {0 };
22942275 char * pikaAsm = strsCopy (& buffs , "" );
@@ -2408,30 +2389,6 @@ char* AST_toPikaASM(AST* ast, Args* outBuffs) {
24082389 is_block_matched = 1 ;
24092390 goto exit ;
24102391 }
2411- if (strEqu (obj_getStr (ast , "block" ), "while" )) {
2412- /* parse stmt ast */
2413- pikaAsm = AST_appandPikaASM (ast , ast , & buffs , pikaAsm );
2414- pikaAsm = strsAppend (& buffs , pikaAsm , "0 JEZ 2\n" );
2415- is_block_matched = 1 ;
2416- goto exit ;
2417- }
2418- if (strEqu (obj_getStr (ast , "block" ), "if" )) {
2419- /* parse stmt ast */
2420- pikaAsm = AST_appandPikaASM (ast , ast , & buffs , pikaAsm );
2421- pikaAsm = strsAppend (& buffs , pikaAsm , "0 JEZ 1\n" );
2422- is_block_matched = 1 ;
2423- goto exit ;
2424- }
2425- if (strEqu (obj_getStr (ast , "block" ), "else" )) {
2426- pikaAsm = strsAppend (& buffs , pikaAsm , "0 NEL 1\n" );
2427- goto exit ;
2428- }
2429- #if PIKA_SYNTAX_EXCEPTION_ENABLE
2430- if (strEqu (obj_getStr (ast , "block" ), "try" )) {
2431- pikaAsm = strsAppend (& buffs , pikaAsm , "0 TRY \n" );
2432- goto exit ;
2433- }
2434- #endif
24352392 if (strEqu (obj_getStr (ast , "block" ), "elif" )) {
24362393 /* skip if __else is 0 */
24372394 pikaAsm = strsAppend (& buffs , pikaAsm , "0 NEL 1\n" );
@@ -2489,54 +2446,41 @@ char* AST_toPikaASM(AST* ast, Args* outBuffs) {
24892446 is_block_matched = 1 ;
24902447 goto exit ;
24912448 }
2449+ /* generate code for block ast */
2450+ const GenRule rules_block [] = {
2451+ {._asm = "TRY" , .type = VAL_NONEVAL , .ast = "try" },
2452+ {._asm = "NEL" , .type = VAL_STATIC_ , .ast = "else" , .val = "1" },
2453+ {._asm = "JEZ" , .type = VAL_STATIC_ , .ast = "if" , .val = "1" },
2454+ {._asm = "JEZ" , .type = VAL_STATIC_ , .ast = "while" , .val = "2" },
2455+ };
24922456
2493- if (obj_isArgExist (ast , "return" )) {
2494- /* parse stmt ast */
2495- pikaAsm = AST_appandPikaASM (ast , ast , & buffs , pikaAsm );
2496- pikaAsm = strsAppend (& buffs , pikaAsm , "0 RET \n" );
2497- is_block_matched = 1 ;
2498- goto exit ;
2499- }
2500- #if PIKA_SYNTAX_EXCEPTION_ENABLE
2501- if (obj_isArgExist (ast , "raise" )) {
2502- /* parse stmt ast */
2503- pikaAsm = AST_appandPikaASM (ast , ast , & buffs , pikaAsm );
2504- pikaAsm = strsAppend (& buffs , pikaAsm , "0 RIS \n" );
2505- is_block_matched = 1 ;
2506- goto exit ;
2507- }
2508- #endif
2509- if (obj_isArgExist (ast , "global" )) {
2510- /* parse stmt ast */
2511- pikaAsm = AST_appandPikaASM (ast , ast , & buffs , pikaAsm );
2512- pikaAsm = strsAppend (& buffs , pikaAsm , "0 GLB " );
2513- pikaAsm = strsAppend (& buffs , pikaAsm , obj_getStr (ast , "global" ));
2514- pikaAsm = strsAppend (& buffs , pikaAsm , "\n" );
2515- is_block_matched = 1 ;
2516- goto exit ;
2517- }
2518- if (obj_isArgExist (ast , "del" )) {
2519- /* parse stmt ast */
2520- pikaAsm = AST_appandPikaASM (ast , ast , & buffs , pikaAsm );
2521- pikaAsm = strsAppend (& buffs , pikaAsm , "0 DEL " );
2522- pikaAsm = strsAppend (& buffs , pikaAsm , obj_getStr (ast , "del" ));
2523- pikaAsm = strsAppend (& buffs , pikaAsm , "\n" );
2524- is_block_matched = 1 ;
2525- goto exit ;
2526- }
2527- if (obj_isArgExist (ast , "break" )) {
2528- /* parse stmt ast */
2529- pikaAsm = AST_appandPikaASM (ast , ast , & buffs , pikaAsm );
2530- pikaAsm = strsAppend (& buffs , pikaAsm , "0 BRK \n" );
2531- is_block_matched = 1 ;
2532- goto exit ;
2457+ for (size_t i = 0 ; i < sizeof (rules_block ) / sizeof (GenRule ); i ++ ) {
2458+ GenRule rule = rules_block [i ];
2459+ if (strEqu (obj_getStr (ast , "block" ), rule .ast )) {
2460+ pikaAsm = GenRule_toAsm (rule , & buffs , ast , pikaAsm , 0 );
2461+ is_block_matched = 1 ;
2462+ goto exit ;
2463+ }
25332464 }
2534- if (obj_isArgExist (ast , "continue" )) {
2535- /* parse stmt ast */
2536- pikaAsm = AST_appandPikaASM (ast , ast , & buffs , pikaAsm );
2537- pikaAsm = strsAppend (& buffs , pikaAsm , "0 CTN \n" );
2538- is_block_matched = 1 ;
2539- goto exit ;
2465+
2466+ const GenRule rules_topAst [] = {
2467+ {._asm = "CTN" , .type = VAL_NONEVAL , .ast = "continue" },
2468+ {._asm = "BRK" , .type = VAL_NONEVAL , .ast = "break" },
2469+ {._asm = "DEL" , .type = VAL_DYNAMIC , .ast = "del" },
2470+ {._asm = "GLB" , .type = VAL_DYNAMIC , .ast = "global" },
2471+ {._asm = "RIS" , .type = VAL_DYNAMIC , .ast = "raise" },
2472+ {._asm = "ASS" , .type = VAL_NONEVAL , .ast = "assert" },
2473+ {._asm = "RET" , .type = VAL_NONEVAL , .ast = "return" }};
2474+
2475+ /* generate code for top level ast */
2476+ for (size_t i = 0 ; i < sizeof (rules_topAst ) / sizeof (rules_topAst [0 ]);
2477+ i ++ ) {
2478+ GenRule item = rules_topAst [i ];
2479+ if (obj_isArgExist (ast , item .ast )) {
2480+ pikaAsm = GenRule_toAsm (item , & buffs , ast , pikaAsm , 0 );
2481+ is_block_matched = 1 ;
2482+ goto exit ;
2483+ }
25402484 }
25412485exit :
25422486 if (NULL == pikaAsm ) {
0 commit comments