public override IAstNode VisitReadFieldStmt(MicroCParser.ReadFieldStmtContext context) { var label = ++_label; string recName = context.name.Text; string fieldName = context.field.Text; var recSymbol = _symbolTable.LookupSymbol(recName); if (recSymbol == null) { throw new ArgumentException($"Record: {recName} does not exist"); } var fieldSymbol = recSymbol.Children.SingleOrDefault(f => f.Name == fieldName); if (fieldSymbol == null) { throw new ArgumentException($"Record: {recName} does not include a field: {fieldName}"); } var recIdent = new Identifier(recName, recSymbol.Type, recSymbol.Id); var fieldIdent = new Identifier(fieldName, fieldSymbol.Type, fieldSymbol.Id); RecordAccess sa = new RecordAccess(recIdent, fieldIdent); var readStmt = new ReadStmt(sa); readStmt.Label = label; return(readStmt); }
/// <summary> /// Exit a parse tree produced by the <c>readFieldStmt</c> /// labeled alternative in <see cref="MicroCParser.statement"/>. /// <para>The default implementation does nothing.</para> /// </summary> /// <param name="context">The parse tree.</param> public virtual void ExitReadFieldStmt([NotNull] MicroCParser.ReadFieldStmtContext context) { }
/// <summary> /// Visit a parse tree produced by the <c>readFieldStmt</c> /// labeled alternative in <see cref="MicroCParser.statement"/>. /// <para> /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/> /// on <paramref name="context"/>. /// </para> /// </summary> /// <param name="context">The parse tree.</param> /// <return>The visitor result.</return> public virtual Result VisitReadFieldStmt([NotNull] MicroCParser.ReadFieldStmtContext context) { return(VisitChildren(context)); }