public static LinkedListNode <Lexeme> TryParse(LinkedListNode <Lexeme> lexemes, out ArrayLit resultNode) { List <Expr> exprs = new List <Expr>(); resultNode = null; if (lexemes.Value.Type != LT.OP_BRACE_O) { return(lexemes); } LinkedListNode <Lexeme> nextLexeme = lexemes.Next; nextLexeme = BinaryExpr.TryParseExpr(nextLexeme, out var expr); if (expr == null) { resultNode = new ArrayLit { Data = exprs, Token = nextLexeme.Value }; return(nextLexeme); } exprs.Add(expr); while (nextLexeme.Value.Type == LT.OP_COMMA) { nextLexeme = nextLexeme.Next; nextLexeme = BinaryExpr.TryParseExpr(nextLexeme, out expr); if (expr == null) { break; } exprs.Add(expr); } resultNode = new ArrayLit { Data = exprs, Token = nextLexeme.Value }; if (nextLexeme.Value.Type == LT.OP_BRACE_C) { nextLexeme = nextLexeme.Next; } else { throw new ArgumentException($"Missing closing brace at {nextLexeme.Value.File}:{nextLexeme.Value.Line}"); } return(nextLexeme); }
public static LinkedListNode <Lexeme> TryParse(LinkedListNode <Lexeme> lexemes, out Literal resultNode) { resultNode = null; switch (lexemes.Value.Type) { case LT.LIT_STR: resultNode = new StringLit { Data = lexemes.Value.Value, Token = lexemes.Value }; break; case LT.LIT_CHAR: resultNode = new CharLit { Data = lexemes.Value.Value[0], Token = lexemes.Value }; break; case LT.LIT_FLOAT: if (!double.TryParse(lexemes.Value.Value, out var ddata)) { throw new ArgumentException($"Unrecognized float value {lexemes.Value.Value} at {lexemes.Value.File}:{lexemes.Value.Line}"); } resultNode = new FloatLit { Data = ddata, Token = lexemes.Value }; break; case LT.LIT_INT: if (!int.TryParse(lexemes.Value.Value, out var idata)) { throw new ArgumentException($"Unrecognized integer value {lexemes.Value.Value} at {lexemes.Value.File}:{lexemes.Value.Line}"); } resultNode = new IntLit { Data = idata, Token = lexemes.Value }; break; case LT.KW_TRUE: resultNode = new BoolLit { Data = true, Token = lexemes.Value }; break; case LT.KW_FALSE: resultNode = new BoolLit { Data = false, Token = lexemes.Value }; break; case LT.OP_BRACE_O: var newLexemes = StructLit.TryParse(lexemes, out StructLit slit); if (slit != null) { resultNode = slit; return(newLexemes); } newLexemes = ArrayLit.TryParse(lexemes, out ArrayLit alit); if (alit != null) { resultNode = alit; return(newLexemes); } break; default: return(lexemes); } return(lexemes.Next); }