diff --git a/PoyoLang.Analysis.NGrams/60000 Most Frequent Words in American English - Corpus of Contemporary American English.xlsx b/PoyoLang.Analysis.NGrams/60000 Most Frequent Words in American English - Corpus of Contemporary American English.xlsx
deleted file mode 100644
index 3c3a0de..0000000
Binary files a/PoyoLang.Analysis.NGrams/60000 Most Frequent Words in American English - Corpus of Contemporary American English.xlsx and /dev/null differ
diff --git a/PoyoLang.Analysis.NGrams/PoyoLang.Analysis.NGrams.csproj b/PoyoLang.Analysis.NGrams/PoyoLang.Analysis.NGrams.csproj
deleted file mode 100644
index d618101..0000000
--- a/PoyoLang.Analysis.NGrams/PoyoLang.Analysis.NGrams.csproj
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
- Exe
- net9.0
- enable
- enable
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/PoyoLang.Analysis.NGrams/Program.cs b/PoyoLang.Analysis.NGrams/Program.cs
deleted file mode 100644
index 577098b..0000000
--- a/PoyoLang.Analysis.NGrams/Program.cs
+++ /dev/null
@@ -1,105 +0,0 @@
-// See https://aka.ms/new-console-template for more information
-
-// Load up the file
-
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Text.Json;
-using ClosedXML.Excel;
-
-Console.WriteLine("Reading Excel file...");
-
-// Load Excel data file
-const string ExcelFilePath = "PoyoLang.Analysis.NGrams.60000 Most Frequent Words in American English - Corpus of Contemporary American English.xlsx";
-
-using var excelFileStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(ExcelFilePath);
-
-using var workBook = new XLWorkbook(excelFileStream);
-var worksheet = workBook.Worksheet("List");
-
-Console.WriteLine("Reading word frequencies");
-
-// Read word frequencies
-var wordColumn = "C";
-var frequencyColumn = "D";
-
-var wordFrequencies = new List<(string word, long frequency)>();
-
-var row = 2;
-
-while (true)
-{
- var wordValue = worksheet.Cell(row, wordColumn).Value;
-
- if (wordValue.IsBlank)
- {
- break;
- }
-
- var word = $"{wordValue.GetText().Trim().ToLowerInvariant()} ";
- var frequency = (long)worksheet.Cell(row, frequencyColumn).GetDouble();
-
- if (!word.Contains('('))
- {
- wordFrequencies.Add((word, frequency));
- }
-
- row++;
-}
-
-Console.WriteLine("Computing ngrams");
-
-// Compute n-grams
-var ngrams = new Dictionary();
-
-const int MaxLength = 5;
-const int MinLength = 1;
-
-foreach (var (word, frequency) in wordFrequencies)
-{
- var span = word.AsSpan();
-
- while (span.Length >= MinLength)
- {
- for (int length = MinLength; length <= MaxLength; length++)
- {
- if (length > span.Length)
- {
- break;
- }
-
- Increment(span[..length]);
- }
-
- span = span[1..];
- }
-
- continue;
-
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- void Increment(ReadOnlySpan span)
- {
- var ngram = span.ToString();
-
- if (ngrams.TryGetValue(ngram, out var count))
- {
- ngrams[ngram] = count + frequency;
- }
- else
- {
- ngrams[ngram] = frequency;
- }
- }
-}
-
-// Order frequencies
-var orderedNgrams = ngrams
- .OrderByDescending(n => n.Value)
- .ToList();
-
-Console.WriteLine($"Found {orderedNgrams.Count} n-grams");
-
-var serializedNgrams = JsonSerializer.Serialize(orderedNgrams, new JsonSerializerOptions() { WriteIndented = true});
-
-await File.WriteAllTextAsync("n-grams.json", serializedNgrams);
-
diff --git a/PoyoLang.Test/Program.cs b/PoyoLang.Test/Program.cs
index 6334d20..e8cd52a 100644
--- a/PoyoLang.Test/Program.cs
+++ b/PoyoLang.Test/Program.cs
@@ -1,9 +1,63 @@
// See https://aka.ms/new-console-template for more information
+using System.Text;
using PoyoLang.Dictionary;
-Console.OutputEncoding = System.Text.Encoding.UTF8;
+var dictionary = new Dictionary();
+
+var text = "Lorem ipsum dolor sit amet";
+
+var output = new StringBuilder(text.Length);
+var span = text.AsSpan();
+
+NextLetter(ref span, output);
+
+Console.Write(output.ToString());
+
+void NextLetter(ref ReadOnlySpan text, StringBuilder output)
+{
+
+ if (text.Length > 0)
+ {
+ var isCaps = char.IsUpper(text[0]);
+
+ switch (text[0])
+ {
+ case 'a' or 'A':
+
+ if (text.Length > 1)
+ {
+ switch (text[1])
+ {
+ case 'm':
+
+ text = text[2..];
+
+ output.Append(isCaps ? "Payo" : "payo");
+
+ return;
+ }
+ }
+
+ text = text[1..];
+
+ output.Append(isCaps ? "Piyo" : "piyo");
+
+ return;
+
+ case 'b' or 'B':
+
+ text = text[1..];
+
+ output.Append(isCaps ? "Pïyo" : "pïyo");
+
+ return;
+ }
+
+ text = text[1..];
+
+ output.Append(text[0]);
+ }
+}
-Console.WriteLine(string.Join(Environment.NewLine, Alphabet.BaseAlphabet));
-Console.WriteLine(Alphabet.BaseAlphabet.Length);
\ No newline at end of file
diff --git a/PoyoLang.Translator.SourceGenerator/Node.cs b/PoyoLang.Translator.SourceGenerator/Node.cs
new file mode 100644
index 0000000..a5118e5
--- /dev/null
+++ b/PoyoLang.Translator.SourceGenerator/Node.cs
@@ -0,0 +1,15 @@
+namespace PoyoLang.Translator.SourceGenerator;
+
+public class Node
+{
+ public char Letter { get; }
+ public string Target { get; }
+
+ public List Nodes { get; } = [];
+
+ public Node(char letter, string target)
+ {
+ Letter = letter;
+ Target = target;
+ }
+}
\ No newline at end of file
diff --git a/PoyoLang.Translator.SourceGenerator/PoyoLang.Translator.SourceGenerator.csproj b/PoyoLang.Translator.SourceGenerator/PoyoLang.Translator.SourceGenerator.csproj
new file mode 100644
index 0000000..13920ca
--- /dev/null
+++ b/PoyoLang.Translator.SourceGenerator/PoyoLang.Translator.SourceGenerator.csproj
@@ -0,0 +1,31 @@
+
+
+
+ netstandard2.0
+ enable
+ enable
+ default
+
+ false
+ true
+ true
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
+
+
+
+
+
diff --git a/PoyoLang.Translator.SourceGenerator/PoyoLangTranslatorGenerator.cs b/PoyoLang.Translator.SourceGenerator/PoyoLangTranslatorGenerator.cs
new file mode 100644
index 0000000..096774f
--- /dev/null
+++ b/PoyoLang.Translator.SourceGenerator/PoyoLangTranslatorGenerator.cs
@@ -0,0 +1,225 @@
+using System.Text;
+using System.Text.Json;
+using Microsoft.CodeAnalysis;
+
+namespace PoyoLang.Translator.SourceGenerator;
+
+[Generator]
+public class PoyoLangTranslatorGenerator : IIncrementalGenerator
+{
+ private const char IndentChar = '\t';
+
+ public void Initialize(IncrementalGeneratorInitializationContext context)
+ {
+ var texts = context.AdditionalTextsProvider;
+
+ // There will be only one of those but incremental generators work as pipelines
+ var dictionaries = texts
+ .Where(static text => text.Path.EndsWith("dictionary.json"))
+ .Select(static (text, _) => text.GetText());
+
+ var parsedDictionaries = dictionaries
+ .Select(static (dictionary, _) =>
+ JsonSerializer.Deserialize>(dictionary!.ToString())
+ );
+
+ var formattedDictionaries = parsedDictionaries
+ .Select(static (dictionary, _) =>
+ {
+ // Reverse dictionary order to have ngrams first
+ return dictionary!.OrderBy(p => p.Value).ToDictionary(p => p.Value, p => p.Key);
+ });
+
+ var prefixTrees = formattedDictionaries
+ .Select(static (formattedDictionary, _) => BuildPrefixTree(formattedDictionary));
+
+ context.RegisterSourceOutput(prefixTrees, static (sourceProductionContext, prefixTree) =>
+ {
+ sourceProductionContext.AddSource("PoyoLangTranslator.g.cs", GenerateSource(prefixTree));
+ });
+ }
+
+ private static List BuildPrefixTree(Dictionary dictionary)
+ {
+ var rootNodes = new List();
+
+ var firstNodes = dictionary.Where(p => p.Key.Length is 1);
+
+ foreach (var firstNode in firstNodes)
+ {
+ var letter = firstNode.Key[0];
+ var target = firstNode.Value;
+
+ var node = new Node(letter, target);
+ rootNodes.Add(node);
+
+ // Add sub-nodes
+ ParseNodes(node, letter.ToString());
+ }
+
+ return rootNodes;
+
+ void ParseNodes(Node node, string prefix)
+ {
+ // Find nodes that have previous node as prefixed
+ var subNodes = dictionary
+ .Where(p => p.Key.StartsWith(prefix) && p.Key.Length == prefix.Length + 1);
+
+ foreach (var subNode in subNodes)
+ {
+ var letter = subNode.Key[prefix.Length];
+ var target = subNode.Value;
+
+ var newPrefix = $"{prefix}{letter}";
+
+ var newNode = new Node(letter, target);
+ node.Nodes.Add(newNode);
+
+ // Recursively add sub-nodes
+ ParseNodes(newNode, newPrefix);
+ }
+ }
+ }
+
+ private static string GenerateSource(List rootNodes)
+ {
+ var source = new StringBuilder();
+
+ // Usings and namespace
+ source.Append(
+ """
+ using System;
+ using System.Text;
+
+ namespace PoyoLang.Translator;
+
+ """
+ );
+
+ // Partial class definition
+ source.Append(
+ """
+ public partial class PoyoLangTranslator
+ {
+
+ """
+ );
+
+ // Next letter method definition
+ source.Append(
+ """
+ public void NextLetter(ref ReadOnlySpan text, StringBuilder output)
+ {
+ """
+ );
+
+ // 0 length case and caps
+ source.Append(
+ """
+ if (text.Length < 1)
+ {
+ return;
+ }
+
+ var isCaps = char.IsUpper(text[0]);
+
+ """
+ );
+
+ GenerateSwitchCases(rootNodes, depth: 0, source: source);
+
+ // Next letter method end
+ source.Append(
+ """
+ // Punctuation/Unknown characters case
+ text = text[1..];
+
+ output.Append(text[0]);
+ }
+ """
+ );
+
+ // Partial class end
+ source.Append(
+ """
+ }
+ """
+ );
+
+ return source.ToString();
+ }
+
+ private static void GenerateSwitchCases(List nodes, int depth, StringBuilder source)
+ {
+ var indent = Indent(depth * 3);
+
+ // Switch-case start
+ source.Append(
+ $$"""
+ {{indent}}switch (text[{{depth}}])
+ {{indent}}{
+ """
+ );
+
+ foreach (var node in nodes)
+ {
+ var targetLower = node.Target;
+ var targetUpper = ToTitleCase(targetLower);
+
+ // Case start
+ source.Append(
+ $$"""
+ {{indent}} case '{{node.Letter}}' or '{{char.ToUpper(node.Letter)}}':
+ {{indent}}
+ """
+ );
+
+ // Sub nodes handling
+ if (node.Nodes.Count > 0)
+ {
+ source.Append(
+ $$"""
+ {{indent}} if (text.Length > {{depth + 1}})
+ {{indent}} {
+ """
+ );
+
+ // Sub nodes
+ GenerateSwitchCases(node.Nodes, depth + 1, source);
+
+ source.Append(
+ $$"""
+ {{indent}} }
+ """
+ );
+ }
+
+ // Current node handling fallback
+ source.Append(
+ $$"""
+ {{indent}}
+ {{indent}} text = text[{{depth + 1}}..];
+ {{indent}}
+ {{indent}} output.Append(isCaps ? "{{targetUpper}}" : "{{targetLower}}");
+ {{indent}}
+ {{indent}} return;
+ """
+ );
+ }
+
+ // Switch-case end
+ source.Append(
+ $$"""
+
+ {{indent}}}
+ """
+ );
+ }
+
+ private static string ToTitleCase(string text)
+ {
+ return $"{char.ToUpper(text[0])}{text[1..]}";
+ }
+
+ private static string Indent(int depth) => new(IndentChar, depth);
+}
\ No newline at end of file
diff --git a/PoyoLang.Translator/PoyoLang.Translator.csproj b/PoyoLang.Translator/PoyoLang.Translator.csproj
new file mode 100644
index 0000000..c7c030c
--- /dev/null
+++ b/PoyoLang.Translator/PoyoLang.Translator.csproj
@@ -0,0 +1,18 @@
+
+
+
+ net9.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/PoyoLang.Translator/PoyoLangTranslator.cs b/PoyoLang.Translator/PoyoLangTranslator.cs
new file mode 100644
index 0000000..61fc82e
--- /dev/null
+++ b/PoyoLang.Translator/PoyoLangTranslator.cs
@@ -0,0 +1,6 @@
+namespace PoyoLang.Translator;
+
+public partial class PoyoLangTranslator
+{
+
+}
\ No newline at end of file
diff --git a/PoyoLang.Translator/dictionary.json b/PoyoLang.Translator/dictionary.json
new file mode 100644
index 0000000..9bc8a12
--- /dev/null
+++ b/PoyoLang.Translator/dictionary.json
@@ -0,0 +1,322 @@
+{
+ "poyo": " ",
+ "poy\u00F3": "e",
+ "poy\u00F2": "t",
+ "poy\u00F4": "a",
+ "poy\u00F6": "o",
+ "poy\u00F5": "i",
+ "poy\u014D": "n",
+ "poy\u01D2": "e ",
+ "p\u00F3yo": "r",
+ "p\u00F3y\u00F3": "h",
+ "p\u00F3y\u00F2": "s",
+ "p\u00F3y\u00F4": "l",
+ "p\u00F3y\u00F6": "d",
+ "p\u00F3y\u00F5": "c",
+ "p\u00F3y\u014D": "th",
+ "p\u00F3y\u01D2": "u",
+ "p\u00F2yo": "t ",
+ "p\u00F2y\u00F3": "he",
+ "p\u00F2y\u00F2": "m",
+ "p\u00F2y\u00F4": "b",
+ "p\u00F2y\u00F6": "f",
+ "p\u00F2y\u00F5": "y",
+ "p\u00F2y\u014D": "p",
+ "p\u00F2y\u01D2": "the",
+ "p\u00F4yo": "n ",
+ "p\u00F4y\u00F3": "w",
+ "p\u00F4y\u00F2": "g",
+ "p\u00F4y\u00F4": "he ",
+ "p\u00F4y\u00F6": "in",
+ "p\u00F4y\u00F5": "y ",
+ "p\u00F4y\u014D": "d ",
+ "p\u00F4y\u01D2": "r ",
+ "p\u00F6yo": "an",
+ "p\u00F6y\u00F3": "er",
+ "p\u00F6y\u00F2": "the ",
+ "p\u00F6y\u00F4": "be",
+ "p\u00F6y\u00F6": "at",
+ "p\u00F6y\u00F5": "re",
+ "p\u00F6y\u014D": "v",
+ "p\u00F6y\u01D2": "on",
+ "p\u00F5yo": "o ",
+ "p\u00F5y\u00F3": "nd",
+ "p\u00F5y\u00F2": "or",
+ "p\u00F5y\u00F4": "be ",
+ "p\u00F5y\u00F6": "ha",
+ "p\u00F5y\u00F5": "en",
+ "p\u00F5y\u014D": "to",
+ "p\u00F5y\u01D2": "ve",
+ "p\u014Dyo": "ou",
+ "p\u014Dy\u00F3": "nd ",
+ "p\u014Dy\u00F2": "it",
+ "p\u014Dy\u00F4": "st",
+ "p\u014Dy\u00F6": "l ",
+ "p\u014Dy\u00F5": "k",
+ "p\u014Dy\u014D": "te",
+ "p\u014Dy\u01D2": "al",
+ "p\u01D2yo": "ti",
+ "p\u01D2y\u00F3": "f ",
+ "p\u01D2y\u00F2": "and",
+ "p\u01D2y\u00F4": "s ",
+ "p\u01D2y\u00F6": "er ",
+ "p\u01D2y\u00F5": "nt",
+ "p\u01D2y\u014D": "and ",
+ "p\u01D2y\u01D2": "of",
+ "payo": "ar",
+ "pay\u00F3": "a ",
+ "pay\u00F2": "se",
+ "pay\u00F4": "to ",
+ "pay\u00F6": "ea",
+ "pay\u00F5": "hi",
+ "pay\u014D": "of ",
+ "pay\u01D2": "me",
+ "p\u00E1yo": "le",
+ "p\u00E1y\u00F3": "on ",
+ "p\u00E1y\u00F2": "h ",
+ "p\u00E1y\u00F4": "co",
+ "p\u00E1y\u00F6": "is",
+ "p\u00E1y\u00F5": "in ",
+ "p\u00E1y\u014D": "at ",
+ "p\u00E1y\u01D2": "ro",
+ "p\u00E0yo": "ll",
+ "p\u00E0y\u00F3": "ve ",
+ "p\u00E0y\u00F2": "de",
+ "p\u00E0y\u00F4": "es",
+ "p\u00E0y\u00F6": "ng",
+ "p\u00E0y\u00F5": "io",
+ "p\u00E0y\u014D": "om",
+ "p\u00E0y\u01D2": "ne",
+ "p\u00E2yo": "ic",
+ "p\u00E2y\u00F3": "li",
+ "p\u00E2y\u00F2": "ri",
+ "p\u00E2y\u00F4": "ra",
+ "p\u00E2y\u00F6": "as",
+ "p\u00E2y\u00F5": "ce",
+ "p\u00E2y\u014D": "g ",
+ "p\u00E2y\u01D2": "ho",
+ "p\u00E4yo": "ion",
+ "p\u00E4y\u00F3": "ca",
+ "p\u00E4y\u00F2": "or ",
+ "p\u00E4y\u00F4": "ta",
+ "p\u00E4y\u00F6": "ut",
+ "p\u00E4y\u00F5": "el",
+ "p\u00E4y\u014D": "ch",
+ "p\u00E4y\u01D2": "m ",
+ "p\u00E3yo": "hat",
+ "p\u00E3y\u00F3": "ma",
+ "p\u00E3y\u00F2": "hat ",
+ "p\u00E3y\u00F4": "ur",
+ "p\u00E3y\u00F6": "k ",
+ "p\u00E3y\u00F5": "ng ",
+ "p\u00E3y\u014D": "fo",
+ "p\u00E3y\u01D2": "re ",
+ "p\u0101yo": "no",
+ "p\u0101y\u00F3": "si",
+ "p\u0101y\u00F2": "her",
+ "p\u0101y\u00F4": "av",
+ "p\u0101y\u00F6": "nt ",
+ "p\u0101y\u00F5": "tha",
+ "p\u0101y\u014D": "ion ",
+ "p\u0101y\u01D2": "il",
+ "p\u01CEyo": "ent",
+ "p\u01CEy\u00F3": "et",
+ "p\u01CEy\u00F2": "la",
+ "p\u01CEy\u00F4": "us",
+ "p\u01CEy\u00F6": "ac",
+ "p\u01CEy\u00F5": "ly",
+ "p\u01CEy\u014D": "ing",
+ "p\u01CEy\u01D2": "wh",
+ "piyo": "ow",
+ "piy\u00F3": "ave",
+ "piy\u00F2": "pe",
+ "piy\u00F4": "ec",
+ "piy\u00F6": "ly ",
+ "piy\u00F5": "ot",
+ "piy\u014D": "tio",
+ "piy\u01D2": "ll ",
+ "p\u00EDyo": "tion",
+ "p\u00EDy\u00F3": "wi",
+ "p\u00EDy\u00F2": "ave ",
+ "p\u00EDy\u00F4": "se ",
+ "p\u00EDy\u00F6": "al ",
+ "p\u00EDy\u00F5": "ing ",
+ "p\u00EDy\u014D": "ge",
+ "p\u00EDy\u01D2": "it ",
+ "p\u00ECyo": "so",
+ "p\u00ECy\u00F3": "that",
+ "p\u00ECy\u00F2": "that ",
+ "p\u00ECy\u00F4": "for",
+ "p\u00ECy\u00F6": "ay",
+ "p\u00ECy\u00F5": "st ",
+ "p\u00ECy\u014D": "lo",
+ "p\u00ECy\u01D2": "pr",
+ "p\u00EEyo": "ee",
+ "p\u00EEy\u00F3": "hav",
+ "p\u00EEy\u00F2": "have",
+ "p\u00EEy\u00F4": "have ",
+ "p\u00EEy\u00F6": "tr",
+ "p\u00EEy\u00F5": "sh",
+ "p\u00EEy\u014D": "le ",
+ "p\u00EEy\u01D2": "w ",
+ "p\u00EFyo": "mo",
+ "p\u00EFy\u00F3": "an ",
+ "p\u00EFy\u00F2": "tion ",
+ "p\u00EFy\u00F4": "ut ",
+ "p\u00EFy\u00F6": "un",
+ "p\u00EFy\u00F5": "ce ",
+ "p\u00EFy\u014D": "ct",
+ "p\u00EFy\u01D2": "ay ",
+ "p\u0129yo": "me ",
+ "p\u0129y\u00F3": "di",
+ "p\u0129y\u00F2": "ss",
+ "p\u0129y\u00F4": "ed",
+ "p\u0129y\u00F6": "i ",
+ "p\u0129y\u00F5": "we",
+ "p\u0129y\u014D": "ol",
+ "p\u0129y\u01D2": "yo",
+ "p\u012Byo": "ul",
+ "p\u012By\u00F3": "rt",
+ "p\u012By\u00F2": "te ",
+ "p\u012By\u00F4": "em",
+ "p\u012By\u00F6": "th ",
+ "p\u012By\u00F5": "ter",
+ "p\u012By\u014D": "do",
+ "p\u012By\u01D2": "ke",
+ "p\u01D0yo": "po",
+ "p\u01D0y\u00F3": "ir",
+ "p\u01D0y\u00F2": "thi",
+ "p\u01D0y\u00F4": "nc",
+ "p\u01D0y\u00F6": "you",
+ "p\u01D0y\u00F5": "his",
+ "p\u01D0y\u014D": "im",
+ "p\u01D0y\u01D2": "is ",
+ "puyo": "oo",
+ "puy\u00F3": "all",
+ "puy\u00F2": "ent ",
+ "puy\u00F4": "ig",
+ "puy\u00F6": "pa",
+ "puy\u00F5": "ate",
+ "puy\u014D": "p ",
+ "puy\u01D2": "ati",
+ "p\u00FAyo": "ld",
+ "p\u00FAy\u00F3": "fi",
+ "p\u00FAy\u00F2": "his ",
+ "p\u00FAy\u00F4": "en ",
+ "p\u00FAy\u00F6": "ver",
+ "p\u00FAy\u00F5": "na",
+ "p\u00FAy\u014D": "mi",
+ "p\u00FAy\u01D2": "ry",
+ "p\u00F9yo": "ai",
+ "p\u00F9y\u00F3": "pl",
+ "p\u00F9y\u00F2": "ow ",
+ "p\u00F9y\u00F4": "gh",
+ "p\u00F9y\u00F6": "wo",
+ "p\u00F9y\u00F5": "sa",
+ "p\u00F9y\u014D": "ad",
+ "p\u00F9y\u01D2": "her ",
+ "p\u00FByo": "ld ",
+ "p\u00FBy\u00F3": "ev",
+ "p\u00FBy\u00F2": "su",
+ "p\u00FBy\u00F4": "os",
+ "p\u00FBy\u00F6": "iv",
+ "p\u00FBy\u00F5": "for ",
+ "p\u00FBy\u014D": "ther",
+ "p\u00FBy\u01D2": "wa",
+ "p\u00FCyo": "ni",
+ "p\u00FCy\u00F3": "ry ",
+ "p\u00FCy\u00F2": "ith",
+ "p\u00FCy\u00F4": "am",
+ "p\u00FCy\u00F6": "bo",
+ "p\u00FCy\u00F5": "u ",
+ "p\u00FCy\u014D": "ch ",
+ "p\u00FCy\u01D2": "ab",
+ "p\u0169yo": "ou ",
+ "p\u0169y\u00F3": "you ",
+ "p\u0169y\u00F2": "op",
+ "p\u0169y\u00F4": "id",
+ "p\u0169y\u00F6": "wit",
+ "p\u0169y\u00F5": "ne ",
+ "p\u0169y\u014D": "bu",
+ "p\u0169y\u01D2": "with",
+ "p\u016Byo": "fe",
+ "p\u016By\u00F3": "tu",
+ "p\u016By\u00F2": "bl",
+ "p\u016By\u00F4": "ere",
+ "p\u016By\u00F6": "atio",
+ "p\u016By\u00F5": "x",
+ "p\u016By\u014D": "ed ",
+ "p\u016By\u01D2": "ation",
+ "p\u01D4yo": "ome",
+ "p\u01D4y\u00F3": "out",
+ "p\u01D4y\u00F2": "con",
+ "p\u01D4y\u00F4": "ke ",
+ "p\u01D4y\u00F6": "ns",
+ "p\u01D4y\u00F5": "rea",
+ "p\u01D4y\u014D": "eve",
+ "p\u01D4y\u01D2": "ci",
+ "peyo": "ie",
+ "pey\u00F3": "com",
+ "pey\u00F2": "ar ",
+ "pey\u00F4": "et ",
+ "pey\u00F6": "ith ",
+ "pey\u00F5": "vi",
+ "pey\u014D": "ty",
+ "pey\u01D2": "with ",
+ "p\u00E9yo": "ear",
+ "p\u00E9y\u00F3": "fr",
+ "p\u00E9y\u00F2": "if",
+ "p\u00E9y\u00F4": "ag",
+ "p\u00E9y\u00F6": "res",
+ "p\u00E9y\u00F5": "ate ",
+ "p\u00E9y\u014D": "do ",
+ "p\u00E9y\u01D2": "mp",
+ "p\u00E8yo": "ey",
+ "p\u00E8y\u00F3": "ive",
+ "p\u00E8y\u00F2": "ia",
+ "p\u00E8y\u00F4": "pro",
+ "p\u00E8y\u00F6": "ba",
+ "p\u00E8y\u00F5": "ov",
+ "p\u00E8y\u014D": "nce",
+ "p\u00E8y\u01D2": "as ",
+ "p\u00EAyo": "ck",
+ "p\u00EAy\u00F3": "sta",
+ "p\u00EAy\u00F2": "sp",
+ "p\u00EAy\u00F4": "ty ",
+ "p\u00EAy\u00F6": "gr",
+ "p\u00EAy\u00F5": "ter ",
+ "p\u00EAy\u014D": "ation ",
+ "p\u00EAy\u01D2": "hin",
+ "p\u00EByo": "ess",
+ "p\u00EBy\u00F3": "ak",
+ "p\u00EBy\u00F2": "ge ",
+ "p\u00EBy\u00F4": "ill",
+ "p\u00EBy\u00F6": "go",
+ "p\u00EBy\u00F5": "out ",
+ "p\u00EBy\u014D": "our",
+ "p\u00EBy\u01D2": "ot ",
+ "p\u1EBDyo": "ey ",
+ "p\u1EBDy\u00F3": "fa",
+ "p\u1EBDy\u00F2": "ss ",
+ "p\u1EBDy\u00F4": "igh",
+ "p\u1EBDy\u00F6": "not",
+ "p\u1EBDy\u00F5": "int",
+ "p\u1EBDy\u014D": "ex",
+ "p\u1EBDy\u01D2": "j",
+ "p\u0113yo": "om ",
+ "p\u0113y\u00F3": "one",
+ "p\u0113y\u00F2": "ap",
+ "p\u0113y\u00F4": "men",
+ "p\u0113y\u00F6": "all ",
+ "p\u0113y\u00F5": "od",
+ "p\u0113y\u014D": "here",
+ "p\u0113y\u01D2": "est",
+ "p\u011Byo": "up",
+ "p\u011By\u00F3": "ive ",
+ "p\u011By\u00F2": "rs",
+ "p\u011By\u00F4": "ere ",
+ "p\u011By\u00F6": "ove",
+ "p\u011By\u00F5": "nce ",
+ "p\u011By\u014D": "ide",
+ "p\u011By\u01D2": "uc"
+}
\ No newline at end of file
diff --git a/PoyoLang.sln b/PoyoLang.sln
index 0e633e8..5d85d8e 100644
--- a/PoyoLang.sln
+++ b/PoyoLang.sln
@@ -6,6 +6,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PoyoLang.Test", "PoyoLang.T
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PoyoLang.Dictionary.Generation", "PoyoLang.Dictionary.Generation\PoyoLang.Dictionary.Generation.csproj", "{43FFCEF2-A4AA-49A1-9731-CB6DAD9863F2}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PoyoLang.Translator.SourceGenerator", "PoyoLang.Translator.SourceGenerator\PoyoLang.Translator.SourceGenerator.csproj", "{0411CE3E-B80E-4AC3-839F-307AD0A16774}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PoyoLang.Translator", "PoyoLang.Translator\PoyoLang.Translator.csproj", "{079808D0-16FB-4D01-A502-5366018312CB}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -24,5 +28,13 @@ Global
{43FFCEF2-A4AA-49A1-9731-CB6DAD9863F2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{43FFCEF2-A4AA-49A1-9731-CB6DAD9863F2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{43FFCEF2-A4AA-49A1-9731-CB6DAD9863F2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0411CE3E-B80E-4AC3-839F-307AD0A16774}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0411CE3E-B80E-4AC3-839F-307AD0A16774}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0411CE3E-B80E-4AC3-839F-307AD0A16774}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0411CE3E-B80E-4AC3-839F-307AD0A16774}.Release|Any CPU.Build.0 = Release|Any CPU
+ {079808D0-16FB-4D01-A502-5366018312CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {079808D0-16FB-4D01-A502-5366018312CB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {079808D0-16FB-4D01-A502-5366018312CB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {079808D0-16FB-4D01-A502-5366018312CB}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal