private void ParsePrimaryExpression(ref Expression expr) { Token token = lex.Parse(); if (Lex.TokenIsOperator(token, OperatorCode.LeftParenthesis)) { Expression v = null; ParseAdditiveExpression(ref v); token = lex.Parse(); if (Lex.TokenIsNotOperator(token, OperatorCode.RightParenthesis)) { //LogStatus(StatusLog.StateType_e.Error, "Paren expression wrong"); _errored = true; return; } //expr = MakeNode(AstNodeType_e.Expression_Paren, v); expr = new ParenthesisExpression(v); } else if (Lex.TokenIsOperator(token, OperatorCode.LeftBrace)) { //string text = lex.GetRawStringUntil('}'); //token = lex.Parse(); //ExpressionBrace v = new ExpressionBrace(); //v.BracedText = MakeNode(AstNodeType_e.RawString, "{" + text + "}"); //expr = MakeNode(AstNodeType_e.Expression_Brace, v); //lex.ConsumeAToken(); } else if (Lex.TokenIs(token, TokenType.Identifier)) { Identifier id = (Identifier)token.Value; Symbol sym = null; if (_symtab.ContainsKey(id.Name)) { sym = _symtab[id.Name]; } else { sym = new Symbol(id.Name, SymbolType.Variable, id); _symtab.Add(id.Name, sym); } id.SymbolEntry = sym; expr = new IdentifierExpression(id); } else if (Lex.TokenIs(token, TokenType.Constant)) { expr = new ConstantExpression((Constant)token.Value); } //else if (Lex.TokenIs(token, TokenType_e.Label)) //{ // //need to check if label re-define // Label label = (Label)token.Value; // Symbol sym; // if (_symtab.Contains(label.Name)) // { // sym = _symtab[label.Name]; // } // else // { // sym = new Symbol(label.Name, SymbolType_e.Label, label); // _symtab.Add(sym); // } // expr = MakeNode(AstNodeType_e.Label, token.Value); //} //else //{ // LogStatus(StatusLog.StateType_e.Error, "Errored"); // _errored = true; // return; //} }