void ValueBindingPattern(out PatternConstruct pattern) { VariableInitializer init; var modifier = ExpressoModifiers.None; if (la.kind == 27) { Get(); modifier = ExpressoModifiers.Immutable; } else if (la.kind == 28) { Get(); } else SynErr(132); var inits = new List<VariableInitializer>(); PatternVarDef(out init); inits.Add(init); while (la.kind == 12) { Get(); PatternVarDef(out init); inits.Add(init); } pattern = PatternConstruct.MakeValueBindingPattern(inits, modifier); }
void WildcardPattern(out PatternConstruct pattern) { Expect(77); pattern = PatternConstruct.MakeWildcardPattern(); }
void PatternItem(out PatternConstruct pattern) { pattern = PatternConstruct.Null; if (StartOf(15)) { ExpressionPattern(out pattern); } else if (la.kind == 14) { IdentifierPattern(out pattern); } else SynErr(137); }
void TuplePattern(out PatternConstruct pattern) { var inners = new List<PatternConstruct>(); Expect(8); while (StartOf(18)) { if (StartOf(16)) { LhsPattern(out pattern); } else { ExpressionPattern(out pattern); } inners.Add(pattern); Expect(12); } Expect(10); pattern = PatternConstruct.MakeTuplePattern(inners); }
void Pattern(out PatternConstruct pattern) { pattern = null; if (la.kind == 77) { WildcardPattern(out pattern); } else if (la.kind == 8) { TuplePattern(out pattern); } else if (IsDestructuringPattern()) { DestructuringPattern(out pattern); } else if (StartOf(15)) { ExpressionPattern(out pattern); } else SynErr(135); }
void LhsPattern(out PatternConstruct pattern) { pattern = PatternConstruct.Null; if (la.kind == 77) { WildcardPattern(out pattern); } else if (la.kind == 27 || la.kind == 28) { ValueBindingPattern(out pattern); } else if (IsIdentifierPattern()) { IdentifierPattern(out pattern); } else if (la.kind == 8) { TuplePattern(out pattern); } else if (la.kind == 9 || la.kind == 14) { DestructuringPattern(out pattern); } else SynErr(133); }
void IdentifierPattern(out PatternConstruct pattern) { PatternConstruct inner = null; string name; AstType type = new PlaceholderType(TextLocation.Empty); Expect(14); name = t.val; var ident = AstNode.MakeIdentifier(name, type, CurrentLocation); Symbols.AddSymbol(name, ident); if (la.kind == 78) { Get(); LhsPattern(out inner); } pattern = PatternConstruct.MakeIdentifierPattern(ident, inner); }
void ExpressionPattern(out PatternConstruct pattern) { Expression expr; PatternOrTest(out expr); pattern = PatternConstruct.MakeExpressionPattern(expr); }
void DestructuringPattern(out PatternConstruct pattern) { pattern = PatternConstruct.Null; AstType type_path; var patterns = new List<PatternConstruct>(); bool is_vector = false; if (la.kind == 14) { TypePathExpression(out type_path); Expect(7); if (StartOf(15)) { PatternItem(out pattern); patterns.Add(pattern); } while (la.kind == 12) { Get(); PatternItem(out pattern); patterns.Add(pattern); } Expect(11); pattern = PatternConstruct.MakeDestructuringPattern(type_path, patterns); } else if (la.kind == 9) { Get(); if (StartOf(15)) { PatternItem(out pattern); patterns.Add(pattern); } while (NotFinalComma()) { ExpectWeak(12, 19); PatternItem(out pattern); patterns.Add(pattern); } if (la.kind == 12) { Get(); Expect(2); is_vector = true; } Expect(3); pattern = PatternConstruct.MakeCollectionPattern(patterns, is_vector); } else SynErr(136); }