]> git.xonotic.org Git - xonotic/gmqcc.git/commitdiff
Adding ids to operators for SYA later
authorWolfgang Bumiller <wolfgang.linux@bumiller.com>
Fri, 20 Jul 2012 12:04:52 +0000 (14:04 +0200)
committerWolfgang Bumiller <wolfgang.linux@bumiller.com>
Fri, 20 Jul 2012 12:04:52 +0000 (14:04 +0200)
lexer.h
parser.c

diff --git a/lexer.h b/lexer.h
index f49b8ff2fe349a6407c5955affba02e86922303f..f23c1a631b89ad03594da89f4785e38b52f6004d 100644 (file)
--- a/lexer.h
+++ b/lexer.h
@@ -117,66 +117,67 @@ enum {
 
 typedef struct {
     const char   *op;
+    unsigned int id;
     unsigned int assoc;
     unsigned int prec;
     unsigned int flags;
 } oper_info;
 
 static const oper_info operators[] = {
-    { "++",  ASSOC_LEFT,  16, OP_SUFFIX},
-    { "--",  ASSOC_LEFT,  16, OP_SUFFIX},
+    { "++",    1, ASSOC_LEFT,  16, OP_SUFFIX},
+    { "--",    2, ASSOC_LEFT,  16, OP_SUFFIX},
 
-    { ".",   ASSOC_LEFT,  15, 0 },
+    { ".",    10, ASSOC_LEFT,  15, 0 },
 
-    { "!",   ASSOC_RIGHT, 14, 0 },
-    { "~",   ASSOC_RIGHT, 14, 0 },
-    { "+",   ASSOC_RIGHT, 14, OP_PREFIX },
-    { "-",   ASSOC_RIGHT, 14, OP_PREFIX },
-    { "++",  ASSOC_RIGHT, 14, OP_PREFIX },
-    { "--",  ASSOC_RIGHT, 14, OP_PREFIX },
-/*  { "&",   ASSOC_RIGHT, 14, OP_PREFIX }, */
+    { "!",    21, ASSOC_RIGHT, 14, 0 },
+    { "~",    22, ASSOC_RIGHT, 14, 0 },
+    { "+",    23, ASSOC_RIGHT, 14, OP_PREFIX },
+    { "-",    24, ASSOC_RIGHT, 14, OP_PREFIX },
+    { "++",   25, ASSOC_RIGHT, 14, OP_PREFIX },
+    { "--",   26, ASSOC_RIGHT, 14, OP_PREFIX },
+/*  { "&",    27, ASSOC_RIGHT, 14, OP_PREFIX }, */
 
-    { "*",   ASSOC_LEFT,  13, 0 },
-    { "/",   ASSOC_LEFT,  13, 0 },
-    { "%",   ASSOC_LEFT,  13, 0 },
+    { "*",    30, ASSOC_LEFT,  13, 0 },
+    { "/",    31, ASSOC_LEFT,  13, 0 },
+    { "%",    32, ASSOC_LEFT,  13, 0 },
 
-    { "+",   ASSOC_LEFT,  12, 0 },
-    { "-",   ASSOC_LEFT,  12, 0 },
+    { "+",    40, ASSOC_LEFT,  12, 0 },
+    { "-",    41, ASSOC_LEFT,  12, 0 },
 
-    { "<<",  ASSOC_LEFT,  11, 0 },
-    { ">>",  ASSOC_LEFT,  11, 0 },
+    { "<<",   50, ASSOC_LEFT,  11, 0 },
+    { ">>",   51, ASSOC_LEFT,  11, 0 },
 
-    { "<",   ASSOC_LEFT,  10, 0 },
-    { ">",   ASSOC_LEFT,  10, 0 },
-    { "<=",  ASSOC_LEFT,  10, 0 },
-    { ">=",  ASSOC_LEFT,  10, 0 },
+    { "<",    60, ASSOC_LEFT,  10, 0 },
+    { ">",    61, ASSOC_LEFT,  10, 0 },
+    { "<=",   62, ASSOC_LEFT,  10, 0 },
+    { ">=",   63, ASSOC_LEFT,  10, 0 },
 
-    { "==",  ASSOC_LEFT,  9,  0 },
-    { "!=",  ASSOC_LEFT,  9,  0 },
+    { "==",   70, ASSOC_LEFT,  9,  0 },
+    { "!=",   71, ASSOC_LEFT,  9,  0 },
 
-    { "&",   ASSOC_LEFT,  8,  0 },
+    { "&",    80, ASSOC_LEFT,  8,  0 },
 
-    { "^",   ASSOC_LEFT,  7,  0 },
+    { "^",    90, ASSOC_LEFT,  7,  0 },
 
-    { "|",   ASSOC_LEFT,  6,  0 },
+    { "|",   100, ASSOC_LEFT,  6,  0 },
 
-    { "&&",  ASSOC_LEFT,  5,  0 },
+    { "&&",  110, ASSOC_LEFT,  5,  0 },
 
-    { "||",  ASSOC_LEFT,  4,  0 },
+    { "||",  120, ASSOC_LEFT,  4,  0 },
 
-    { "?",   ASSOC_RIGHT, 3,  0 },
+    { "?",   130, ASSOC_RIGHT, 3,  0 },
 
-    { "=",   ASSOC_RIGHT, 2,  0 },
-    { "+=",  ASSOC_RIGHT, 2,  0 },
-    { "-=",  ASSOC_RIGHT, 2,  0 },
-    { "*=",  ASSOC_RIGHT, 2,  0 },
-    { "/=",  ASSOC_RIGHT, 2,  0 },
-    { "%=",  ASSOC_RIGHT, 2,  0 },
-    { ">>=", ASSOC_RIGHT, 2,  0 },
-    { "<<=", ASSOC_RIGHT, 2,  0 },
-    { "&=",  ASSOC_RIGHT, 2,  0 },
-    { "^=",  ASSOC_RIGHT, 2,  0 },
-    { "|=",  ASSOC_RIGHT, 2,  0 },
+    { "=",   140, ASSOC_RIGHT, 2,  0 },
+    { "+=",  141, ASSOC_RIGHT, 2,  0 },
+    { "-=",  142, ASSOC_RIGHT, 2,  0 },
+    { "*=",  143, ASSOC_RIGHT, 2,  0 },
+    { "/=",  144, ASSOC_RIGHT, 2,  0 },
+    { "%=",  145, ASSOC_RIGHT, 2,  0 },
+    { ">>=", 146, ASSOC_RIGHT, 2,  0 },
+    { "<<=", 147, ASSOC_RIGHT, 2,  0 },
+    { "&=",  148, ASSOC_RIGHT, 2,  0 },
+    { "^=",  149, ASSOC_RIGHT, 2,  0 },
+    { "|=",  150, ASSOC_RIGHT, 2,  0 },
 };
 
 typedef struct
index 036aca6fc24b0f6c172303129f1ff007da37228b..0b16a8732d1e74541af4d220d93f037831db6e9f 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -159,9 +159,26 @@ static ast_value *parser_parse_type(parser_t *parser, int basetype, bool *isfunc
     return var;
 }
 
+typedef struct
+{
+    int etype; /* 0 = expression, others are operators */
+    ast_expression* out;
+} sy_elem;
+typedef struct
+{
+    MEM_VECTOR_MAKE(sy_elem, out);
+    MEM_VECTOR_MAKE(sy_elem, ops);
+} shyntingyard;
+
 static bool parser_expression(parser_t *parser, ast_block *block)
 {
-    parseerror(parser, "TODO: statements/expressions");
+    shyntingyard sy;
+
+    MEM_VECTOR_INIT(&sy, out);
+    MEM_VECTOR_INIT(&sy, ops);
+
+    MEM_VECTOR_CLEAR(&sy, out);
+    MEM_VECTOR_CLEAR(&sy, ops);
     return false;
 }
 
@@ -178,9 +195,11 @@ static bool parser_body_do(parser_t *parser, ast_block *block)
     else if (parser->tok == '{')
     {
         /* a block */
+        parseerror(parser, "TODO: inner blocks");
+        return false;
     }
     else
-        return parser_expression(parser_t *parser, ast_block *block);
+        return parser_expression(parserblock);
 }
 
 static ast_block* parser_parse_block(parser_t *parser)