public static LinkedListNode <Lexeme> TryParse(LinkedListNode <Lexeme> lexemes, out Expr resultNode) { resultNode = null; var nextLexeme = UnaryExpr.TryParse(lexemes, out UnaryExpr pre); if (pre != null) { resultNode = pre; return(nextLexeme); } nextLexeme = ArrayInitializer.TryParse(nextLexeme, out ArrayInitializer arrInit); if (arrInit != null) { resultNode = arrInit; return(nextLexeme); } nextLexeme = Literal.TryParse(lexemes, out Literal lit); if (lit != null) { resultNode = lit; return(nextLexeme); } nextLexeme = TryParseNoLit(lexemes, out Expr nolit); if (nolit != null) { resultNode = nolit; return(nextLexeme); } return(lexemes); }
public static LinkedListNode <Lexeme> TryParse(LinkedListNode <Lexeme> lexemes, out ArrayInitializer resultNode) { resultNode = null; var nextLexeme = Type.TryParse(lexemes, out Type type); if (type == null) { return(lexemes); } if (nextLexeme.Value.Type != LT.OP_SQBRACKET_O) { return(lexemes); } nextLexeme = nextLexeme.Next; nextLexeme = Expr.TryParse(nextLexeme, out Expr len); if (len == null) { return(lexemes); } if (nextLexeme.Value.Type != LT.OP_SQBRACKET_C) { return(lexemes); } nextLexeme = nextLexeme.Next; Expr def = null; if (nextLexeme.Value.Type == LT.OP_BRACE_O) { var braceLexeme = nextLexeme; nextLexeme = nextLexeme.Next; nextLexeme = Expr.TryParse(nextLexeme, out def); if (def == null) { throw new Exception($"Missing default value at {nextLexeme.Value.File}:{nextLexeme.Value.Line}"); } if (nextLexeme.Value.Type != LT.OP_BRACE_C) { nextLexeme = braceLexeme; def = null; } else { nextLexeme = nextLexeme.Next; } } resultNode = new ArrayInitializer { DefaultValue = def, Length = len, Type = type, Token = lexemes.Value }; return(nextLexeme); }