Remove symbol table

This commit is contained in:
nub31
2025-05-05 16:10:16 +02:00
parent b67d33455d
commit 1f42a3f82d
2 changed files with 53 additions and 324 deletions

View File

@@ -7,28 +7,27 @@ public class Generator
{
private readonly List<DefinitionNode> _definitions;
private readonly StringBuilder _builder = new();
private readonly SymbolTable _symbolTable;
private readonly Dictionary<string, string> _variables = new();
private readonly List<string> _strings = [];
public Generator(List<DefinitionNode> definitions)
{
_definitions = definitions;
_symbolTable = SymbolTable.Create(definitions);
}
public string Generate()
{
for (var i = 0; i < _symbolTable.Strings.Count; i++)
{
var str = _symbolTable.Strings[i];
_builder.AppendLine($"data $str{i} = {{ b \"{str}\", b 0 }}");
}
foreach (var funcDefinition in _definitions.OfType<LocalFuncDefinitionNode>())
{
GenerateFuncDefinition(funcDefinition);
}
for (var i = 0; i < _strings.Count; i++)
{
var str = _strings[i];
_builder.AppendLine($"data $str{i + 1} = {{ b \"{str}\", b 0 }}");
}
return _builder.ToString();
}
@@ -38,7 +37,7 @@ public class Generator
{
return "l";
}
if (type.Equals(NubType.Int32) || type.Equals(NubType.Bool))
{
return "w";
@@ -59,26 +58,27 @@ public class Generator
_builder.Append('$');
_builder.Append(node.Name);
_builder.AppendLine($"({string.Join(", ", parameters)}) {{");
_builder.AppendLine("@start");
GenerateBlock(node.Body, _symbolTable.ResolveLocalFunc(node.Name, node.Parameters.Select(x => x.Type).ToList()));
GenerateBlock(node.Body);
if (!node.ReturnType.HasValue)
{
_builder.AppendLine(" ret");
}
_builder.AppendLine("}");
}
private void GenerateBlock(BlockNode block, LocalFuncDef func)
private void GenerateBlock(BlockNode block)
{
foreach (var statement in block.Statements)
{
GenerateStatement(statement, func);
GenerateStatement(statement);
}
}
private void GenerateStatement(StatementNode statement, LocalFuncDef func)
private void GenerateStatement(StatementNode statement)
{
switch (statement)
{
@@ -89,22 +89,22 @@ public class Generator
GenerateContinue();
break;
case FuncCallStatementNode funcCallStatement:
GenerateStatementFuncCall(funcCallStatement, func);
GenerateStatementFuncCall(funcCallStatement);
break;
case IfNode ifStatement:
GenerateIf(ifStatement, func);
GenerateIf(ifStatement);
break;
case ReturnNode @return:
GenerateReturn(@return, func);
GenerateReturn(@return);
break;
case VariableAssignmentNode variableAssignment:
GenerateVariableAssignment(variableAssignment, func);
GenerateVariableAssignment(variableAssignment);
break;
case VariableReassignmentNode variableReassignment:
GenerateVariableReassignment(variableReassignment, func);
GenerateVariableReassignment(variableReassignment);
break;
case WhileNode whileStatement:
GenerateWhile(whileStatement, func);
GenerateWhile(whileStatement);
break;
default:
throw new ArgumentOutOfRangeException(nameof(statement));
@@ -114,33 +114,33 @@ public class Generator
private void GenerateBreak()
{
}
private void GenerateContinue()
{
}
private void GenerateStatementFuncCall(FuncCallStatementNode funcCall, LocalFuncDef func)
private void GenerateStatementFuncCall(FuncCallStatementNode funcCall)
{
var results = new List<(string, NubType)>();
foreach (var parameter in funcCall.FuncCall.Parameters)
{
results.Add((GenerateExpression(parameter, func), parameter.Type));
results.Add((GenerateExpression(parameter), parameter.Type));
}
var parameters = results.Select(p => $"{QbeTypeName(p.Item2)} {p.Item1}");
_builder.AppendLine($" call ${funcCall.FuncCall.Name}({string.Join(", ", parameters)})");
}
private void GenerateIf(IfNode ifStatement, LocalFuncDef func)
private void GenerateIf(IfNode ifStatement)
{
}
private void GenerateReturn(ReturnNode @return, LocalFuncDef func)
private void GenerateReturn(ReturnNode @return)
{
if (@return.Value.HasValue)
{
var result = GenerateExpression(@return.Value.Value, func);
var result = GenerateExpression(@return.Value.Value);
_builder.AppendLine($" ret {result}");
}
else
@@ -149,61 +149,62 @@ public class Generator
}
}
private void GenerateVariableAssignment(VariableAssignmentNode variableAssignment, LocalFuncDef func)
private void GenerateVariableAssignment(VariableAssignmentNode variableAssignment)
{
_variables[variableAssignment.Name] = GenerateExpression(variableAssignment.Value, func);
_variables[variableAssignment.Name] = GenerateExpression(variableAssignment.Value);
}
private void GenerateVariableReassignment(VariableReassignmentNode variableReassignment, LocalFuncDef func)
private void GenerateVariableReassignment(VariableReassignmentNode variableReassignment)
{
_variables[variableReassignment.Name] = GenerateExpression(variableReassignment.Value, func);
_variables[variableReassignment.Name] = GenerateExpression(variableReassignment.Value);
}
private void GenerateWhile(WhileNode whileStatement, LocalFuncDef func)
private void GenerateWhile(WhileNode whileStatement)
{
}
private string GenerateExpression(ExpressionNode expression, LocalFuncDef func)
private string GenerateExpression(ExpressionNode expression)
{
switch (expression)
{
case BinaryExpressionNode binaryExpression:
return GenerateBinaryExpression(binaryExpression, func);
return GenerateBinaryExpression(binaryExpression);
case FuncCallExpressionNode funcCallExpression:
return GenerateExpressionFuncCall(funcCallExpression, func);
return GenerateExpressionFuncCall(funcCallExpression);
case IdentifierNode identifier:
return GenerateIdentifier(identifier, func);
return GenerateIdentifier(identifier);
case LiteralNode literal:
return GenerateLiteral(literal, func);
return GenerateLiteral(literal);
case StructInitializerNode structInitializer:
return GenerateStructInitializer(structInitializer, func);
return GenerateStructInitializer(structInitializer);
case StructMemberAccessorNode structMemberAccessor:
return GenerateStructMemberAccessor(structMemberAccessor, func);
return GenerateStructMemberAccessor(structMemberAccessor);
default:
throw new ArgumentOutOfRangeException(nameof(expression));
}
}
private string GenerateStructMemberAccessor(StructMemberAccessorNode structMemberAccessor, LocalFuncDef func)
private string GenerateStructMemberAccessor(StructMemberAccessorNode structMemberAccessor)
{
throw new NotImplementedException();
}
private string GenerateBinaryExpression(BinaryExpressionNode binaryExpression, LocalFuncDef func)
private string GenerateBinaryExpression(BinaryExpressionNode binaryExpression)
{
throw new NotImplementedException();
}
private string GenerateIdentifier(IdentifierNode identifier, LocalFuncDef func)
private string GenerateIdentifier(IdentifierNode identifier)
{
return _variables[identifier.Identifier];
}
private string GenerateLiteral(LiteralNode literal, LocalFuncDef func)
private string GenerateLiteral(LiteralNode literal)
{
if (literal.LiteralType.Equals(NubType.String))
{
return $"$str{_symbolTable.ResolveString(literal.Literal)}";
_strings.Add(literal.Literal);
return $"$str{_strings.Count}";
}
else
{
@@ -211,24 +212,24 @@ public class Generator
}
}
private string GenerateStructInitializer(StructInitializerNode structInitializer, LocalFuncDef func)
private string GenerateStructInitializer(StructInitializerNode structInitializer)
{
throw new NotImplementedException();
}
private string GenerateExpressionFuncCall(FuncCallExpressionNode funcCall, LocalFuncDef func)
private string GenerateExpressionFuncCall(FuncCallExpressionNode funcCall)
{
var results = new List<(string, NubType)>();
foreach (var parameter in funcCall.FuncCall.Parameters)
{
results.Add((GenerateExpression(parameter, func), parameter.Type));
results.Add((GenerateExpression(parameter), parameter.Type));
}
var parameters = results.Select(p => $"{QbeTypeName(p.Item2)} {p.Item1}");
var output = GenName();
_builder.AppendLine($" %{output} ={QbeTypeName(funcCall.Type)} call ${funcCall.FuncCall.Name}({string.Join(", ", parameters)})");
return $"%{output}";
}