fix: 输出文件位置错误 && 更新open_set (#70)

Reviewed-on: PostGuard/Canon#70
This commit is contained in:
2024-04-30 15:04:58 +08:00
parent 5ca947125b
commit feddbff205
8 changed files with 66 additions and 63 deletions

View File

@@ -4,6 +4,7 @@ using Canon.Console.Services;
using Canon.Core.Abstractions;
using Canon.Core.GrammarParser;
using Canon.Core.LexicalParser;
using Canon.Core.SemanticParser;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
@@ -39,6 +40,7 @@ public static class RootCommandExtensions
builder.Services.AddSingleton<CompilerOption>(
_ => new CompilerOption { SourceFilename = sourceFilename });
builder.Services.AddTransient<ILexer, Lexer>();
builder.Services.AddSingleton<SyntaxTreeTraveller>();
builder.Services.AddSingleton<IGrammarParser>(_ => GeneratedGrammarParser.Instance);
builder.Services.AddHostedService<Compiler>();

View File

@@ -1,7 +1,7 @@
using Canon.Console.Models;
using Canon.Core.Abstractions;
using Canon.Core.CodeGenerators;
using Canon.Core.LexicalParser;
using Canon.Core.SemanticParser;
using Canon.Core.SyntaxNodes;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
@@ -12,6 +12,7 @@ public class Compiler(
CompilerOption compilerOption,
ILexer lexer,
IGrammarParser grammarParser,
SyntaxTreeTraveller traveller,
IHostApplicationLifetime applicationLifetime,
ILogger<Compiler> logger) : IHostedService
{
@@ -20,10 +21,10 @@ public class Compiler(
IEnumerable<SemanticToken> tokens = lexer.Tokenize(await CreateSourceReader());
ProgramStruct root = grammarParser.Analyse(tokens);
CCodeBuilder builder = new();
root.GenerateCCode(builder);
CCodeGenerateVisitor visitor = new();
traveller.Travel(root, visitor);
await WriteToOutputFile(builder.Build());
await WriteToOutputFile(visitor.Builder.Build());
applicationLifetime.StopApplication();
}
@@ -49,7 +50,7 @@ public class Compiler(
private async Task WriteToOutputFile(string compiledCode)
{
FileInfo outputFile = new(Path.Combine(Environment.CurrentDirectory,
FileInfo outputFile = new(Path.Combine(Path.GetDirectoryName(compilerOption.SourceFilename)!,
Path.GetFileNameWithoutExtension(compilerOption.SourceFilename) + ".c"));
logger.LogDebug("Select output file: '{}'.", outputFile.Name);