@@ -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>();
|
||||
|
||||
|
@@ -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);
|
||||
|
||||
|
Reference in New Issue
Block a user