private IExpression ParseDefExpression() { string name = this.ParseName(); INamedExpression named = null; if (name == "self") { named = new SelfExpression(); } else { named = new NameExpression(name); } while (true) { if (this.TryParseToken(TokenType.Separator, ".")) { string newname = this.ParseName(); named = new DotExpression(named, newname, new IExpression[0]); continue; } if (this.TryParseToken(TokenType.Separator, "::")) { string newname = this.ParseName(); named = new DoubleColonExpression(named, newname); continue; } break; } IList <string> parameters = this.ParseParameterList(); IExpression body = this.ParseCommandList(); return(new DefExpression(named, parameters, body)); }
private ClassExpression ParseClassExpression() { string name = this.ParseName(); INamedExpression named = null; if (name == "self") { named = new SelfExpression(); } else { named = new NameExpression(name); } while (true) { if (this.TryParseToken(TokenType.Separator, "::")) { string newname = this.ParseName(); named = new DoubleColonExpression(named, newname); continue; } break; } this.ParseEndOfCommand(); IExpression body = this.ParseCommandList(); if (!Predicates.IsConstantName(named.Name)) { throw new SyntaxError("class/module name must be a CONSTANT"); } return(new ClassExpression(named, body)); }
public ClassExpression(INamedExpression namedexpression, IExpression expression, INamedExpression superclassexpression = null) { this.namedexpression = namedexpression; this.expression = expression; this.superclassexpression = superclassexpression; }
public DefExpression(INamedExpression namedexpression, IList <string> parameters, IExpression expression) { this.namedexpression = namedexpression; this.parameters = parameters; this.expression = expression; }
void AssertNamedExpression(INamedExpression expected, INamedExpression actual, string label) { Assert.AreEqual(expected.Name, actual.Name, $"{label}.Name"); Assert.AreEqual(expected.Expression?.GetType(), actual.Expression?.GetType(), $"{label}.Expression.Type"); AssertExpression((dynamic)expected.Expression, (dynamic)actual.Expression, label: $"{label}.Expression"); }