Add translator source generator

This commit is contained in:
2025-05-15 21:03:35 +02:00
parent a25cbd6dde
commit 871f46b996
11 changed files with 686 additions and 127 deletions

View File

@@ -1,19 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<None Remove="60000 Most Frequent Words in American English - Corpus of Contemporary American English.xlsx" />
<EmbeddedResource Include="60000 Most Frequent Words in American English - Corpus of Contemporary American English.xlsx" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="ClosedXML" Version="0.104.2" />
</ItemGroup>
</Project>

View File

@@ -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<string, long>();
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<char> 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);

View File

@@ -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<string, string>();
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<char> 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);

View File

@@ -0,0 +1,15 @@
namespace PoyoLang.Translator.SourceGenerator;
public class Node
{
public char Letter { get; }
public string Target { get; }
public List<Node> Nodes { get; } = [];
public Node(char letter, string target)
{
Letter = letter;
Target = target;
}
}

View File

@@ -0,0 +1,31 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<LangVersion>default</LangVersion>
<IncludeBuildOutput>false</IncludeBuildOutput>
<IsRoslynComponent>true</IsRoslynComponent>
<EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.11.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.13.0" />
<PackageReference Include="PolySharp" Version="1.15.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="System.Text.Json" Version="9.0.5" PrivateAssets="all" GeneratePathProperty="true" />
</ItemGroup>
<ItemGroup>
<None Remove="dictionary.json" />
</ItemGroup>
</Project>

View File

@@ -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<string, string>>(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<Node> BuildPrefixTree(Dictionary<string, string> dictionary)
{
var rootNodes = new List<Node>();
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<Node> 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<char> 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<Node> 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);
}

View File

@@ -0,0 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\PoyoLang.Translator.SourceGenerator\PoyoLang.Translator.SourceGenerator.csproj" ReferenceOutputAssembly="false" OutputItemType="Analyzer" />
</ItemGroup>
<ItemGroup>
<None Remove="dictionary.json" />
<AdditionalFiles Include="dictionary.json" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,6 @@
namespace PoyoLang.Translator;
public partial class PoyoLangTranslator
{
}

View File

@@ -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"
}

View File

@@ -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