private void PutVariableIfInBlock(VariableNameTableItem res) { if (inProgramBlock || currentRoutine != null) { scope.PutVariable(res); } }
private void TranslateDeclareHead(VariableNameTableItem item, IndentedTextWriter writer) { // module var if (item.IsConstant) { writer.Write("const "); } writer.Write($"{GetStringFromType(item.Type)} {item.Name}"); }
public override object VisitConstDecl([NotNull] SLangGrammarParser.ConstDeclContext context) { var type = Visit(context.scalarType()) as SlangType; var nameToken = context.Id().Symbol; var item = new VariableNameTableItem { Type = type, IsConstant = false, Column = nameToken.Column, Line = nameToken.Line, Name = nameToken.Text }; PutVariableIfInBlock(item); TranslateDeclare(item, context.exp()); return(null); }
private void TranslateDeclare(VariableNameTableItem item, SLangGrammarParser.ExpContext expContext) { if (!inProgramBlock && currentRoutine == null) { TranslateDeclareHead(item, headerText); } TranslateDeclareHead(item, cppText); if (expContext != null) { cppText.Write(" = "); Visit(expContext); } }
public override object VisitArrayDecl([NotNull] SLangGrammarParser.ArrayDeclContext context) { var type = Visit(context.arrayDeclType()) as SlangType; var nameToken = context.Id().Symbol; var res = new VariableNameTableItem { Type = type, IsConstant = false, Column = nameToken.Column, Line = nameToken.Line, Name = nameToken.Text }; if (!inProgramBlock && currentRoutine == null) { TranslateDeclareHead(res, headerText); } TranslateDeclareHead(res, cppText); // write constructor var exps = context.arrayDeclType().exp(); int dimensionCount = exps.Length; int n = dimensionCount - 1; foreach (var exp in context.arrayDeclType().exp()) { cppText.Write("("); Visit(exp); if (n > 0) { cppText.Write(", "); cppText.Write(GetVectorTypeStart(n)); var arrType = Visit(context.arrayDeclType().scalarType()) as SlangType; cppText.Write(GetStringFromType(arrType)); cppText.Write(GetVectorTypeEnd(n)); } n--; } for (int i = 0; i < exps.Length; ++i) { cppText.Write(")"); } PutVariableIfInBlock(res); return(null); }
// declares public override object VisitSimpleDecl([NotNull] SLangGrammarParser.SimpleDeclContext context) { SlangType type; if (context.simpleType() != null) { type = Visit(context.simpleType()) as SlangType; } else { type = Visit(context.customType()) as SlangType; } var nameToken = context.Id().Symbol; var res = new VariableNameTableItem { Type = type, IsConstant = false, Column = nameToken.Column, Line = nameToken.Line, Name = nameToken.Text }; PutVariableIfInBlock(res); TranslateDeclare(res, context.exp()); return(null); }
private void TranslateClassFieldDecl(VariableNameTableItem field) { headerText.WriteLine($"{GetStringFromType(field.Type)} {field.Name};"); }
public static void ThrowFieldOfClassTypeException(FileInfo file, VariableNameTableItem item) => ThrowException($"Invalid use of variable with type {item.Type} in class {item.Type}, only pointers allowed", file, item.Line, item.Column);