/** * Parses the rest of a v-name, and constructs an AST to represent its phrase * structure. * * @param firstIdentifier * the {@link triangle.compiler.syntax.trees.terminals.Identifier} * that is the start of the * {@link triangle.compiler.syntax.trees.vnames.Vname} * * @return a {@link triangle.compiler.syntax.trees.vnames.Vname} * * @throws SyntaxError * a syntactic error * */ Vname ParseRestOfVname(Identifier firstIdentifier) { var startLocation = firstIdentifier.Start; Vname vname = new SimpleVname(firstIdentifier, firstIdentifier.Position); while (_currentToken.Kind == TokenKind.Dot || _currentToken.Kind == TokenKind.LeftBracket) { if (_currentToken.Kind == TokenKind.Dot) { AcceptIt(); var identifier = ParseIdentifier(); var vnamePosition = new SourcePosition(startLocation, _currentToken.Finish); vname = new DotVname(vname, identifier, vnamePosition); } else { AcceptIt(); var expression = ParseExpression(); Accept(TokenKind.RightBracket); var vnamePosition = new SourcePosition(startLocation, _currentToken.Finish); vname = new SubscriptVname(vname, expression, vnamePosition); } } return(vname); }
public TypeDenoter VisitDotVname(DotVname ast, Void arg) { ast.Type = null; var vnameType = ast.Vname.Visit(this); var record = vnameType as RecordTypeDenoter; if (record != null) { ast.Type = CheckFieldIdentifier(record.FieldType, ast.Identifier); CheckAndReportError(ast.Type != StandardEnvironment.ErrorType, "no field \"%\" in this record type", ast.Identifier); } else { ReportError("record expected here", ast.Vname); } return(ast.Type); }
// Value-or-variable names public IFetchableEntity VisitDotVname(DotVname ast, Frame frame) { return(ast.Vname.Visit(this, frame)); }