// Writes all string literals to data segment private void ProcessStringLiterals() { for (int i = 0; i < SymbolTable.StringLiteralCount; i++) { StringLiteralNode node = (StringLiteralNode)SymbolTable.LookupNode($"_S{i}"); OutputAssembly($"__S{i} DB {node.Literal}, \"$\"", 1); } }
// OutputOptions -> IdentifierToken | StringLiteralToken | EndLineToken private bool ProcessOutputOptions() { if (LexicalAnaylzer.Token == Token.IdentifierToken) { VariableNode node = (VariableNode)SymbolTable.LookupNode(LexicalAnaylzer.Lexeme); if (node == null) { CommonTools.PromptProgramErrorExit($"ERROR: Line {LexicalAnaylzer.LineNumber} Use of " + $"undeclared variable \"{LexicalAnaylzer.Lexeme}\""); return(false); } if (node.Type == Token.CharToken) { OutputThreeAddressCode($"\t_WRC {GetThreeAddressCodeName(LexicalAnaylzer.Lexeme)}"); } else if (node.Type == Token.IntToken) { OutputThreeAddressCode($"\t_WRI {GetThreeAddressCodeName(LexicalAnaylzer.Lexeme)}"); } else { OutputThreeAddressCode($"\t_WRF {GetThreeAddressCodeName(LexicalAnaylzer.Lexeme)}"); } LexicalAnaylzer.GetNextToken(); } else if (LexicalAnaylzer.Token == Token.StringLiteralToken) { StringLiteralNode node = new StringLiteralNode() { Lexeme = $"_S{SymbolTable.StringLiteralCount}", Literal = LexicalAnaylzer.Lexeme }; SymbolTable.InsertNode(node); OutputThreeAddressCode($"\t_WRS {node.Lexeme}"); LexicalAnaylzer.GetNextToken(); } else { OutputThreeAddressCode($"\t_WRL"); if (!MatchToken(Token.EndLineToken)) { return(false); } } return(true); }