Jelajahi Sumber

feat: 支持字面量后缀调用

SongZihuan 4 tahun lalu
induk
melakukan
279e45d509
3 mengubah file dengan 19 tambahan dan 4 penghapusan
  1. 1 0
      include/macro.h
  2. 1 0
      main.c
  3. 17 4
      parser/grammar.c

+ 1 - 0
include/macro.h

@@ -15,5 +15,6 @@
 #define bool int
 #define true 1
 #define false 0
+#define NUL 0
 
 #endif //VIRTUALMATH_MACRO_H

+ 1 - 0
main.c

@@ -21,6 +21,7 @@ int main(int argc, char *argv[]) {
 
 
 /** TODO-szh List
+ * 匿名函数
  * 字面量后缀
  * 官方函数
  * 官方类

+ 17 - 4
parser/grammar.c

@@ -882,15 +882,28 @@ void parserBaseValue(PASERSSIGNATURE){
     Token *value_token = popNewToken(pm->tm);
     Statement *st = NULL;
     if (MATHER_NUMBER == value_token->token_type){
-        st = makeBaseStrValueStatement(value_token->data.str, number_str, value_token->line, pm->file);
+        Statement *tmp = NULL;
+        tmp = makeBaseStrValueStatement(value_token->data.str, number_str, value_token->line, pm->file);
+        if (*value_token->data.second_str == NUL)
+            st = tmp;
+        else{
+            Statement *sencod_var = makeBaseVarStatement(value_token->data.second_str, NULL, value_token->line, pm->file);
+            st = makeCallStatement(sencod_var, makeValueParameter(tmp));
+        }
     }
     else if (MATHER_STRING == value_token->token_type){
         Value *tmp_value = makeStringValue(value_token->data.str, inter);
-        st = makeBaseStrValueStatement(value_token->data.str, string_str, value_token->line, pm->file);
+        Statement *tmp = NULL;
+        tmp = makeBaseStrValueStatement(value_token->data.str, string_str, value_token->line, pm->file);
+        if (*value_token->data.second_str == NUL)
+            st = tmp;
+        else{
+            Statement *sencod_var = makeBaseVarStatement(value_token->data.second_str, NULL, value_token->line, pm->file);
+            st = makeCallStatement(sencod_var, makeValueParameter(tmp));
+        }
     }
-    else if (MATHER_VAR == value_token->token_type){
+    else if (MATHER_VAR == value_token->token_type)
         st = makeBaseVarStatement(value_token->data.str, NULL, value_token->line, pm->file);
-    }
     else if (MATHER_SVAR == value_token->token_type){
         Statement *svar_st = NULL;
         if (!callChildStatement(CALLPASERSSIGNATURE, parserBaseValue, BASEVALUE, &svar_st, NULL)){