Add translator source generator
This commit is contained in:
Binary file not shown.
@@ -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>
|
|
||||||
@@ -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);
|
|
||||||
|
|
||||||
@@ -1,9 +1,63 @@
|
|||||||
// See https://aka.ms/new-console-template for more information
|
// See https://aka.ms/new-console-template for more information
|
||||||
|
|
||||||
|
using System.Text;
|
||||||
using PoyoLang.Dictionary;
|
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);
|
|
||||||
15
PoyoLang.Translator.SourceGenerator/Node.cs
Normal file
15
PoyoLang.Translator.SourceGenerator/Node.cs
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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>
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
18
PoyoLang.Translator/PoyoLang.Translator.csproj
Normal file
18
PoyoLang.Translator/PoyoLang.Translator.csproj
Normal 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>
|
||||||
6
PoyoLang.Translator/PoyoLangTranslator.cs
Normal file
6
PoyoLang.Translator/PoyoLangTranslator.cs
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
namespace PoyoLang.Translator;
|
||||||
|
|
||||||
|
public partial class PoyoLangTranslator
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
322
PoyoLang.Translator/dictionary.json
Normal file
322
PoyoLang.Translator/dictionary.json
Normal 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"
|
||||||
|
}
|
||||||
12
PoyoLang.sln
12
PoyoLang.sln
@@ -6,6 +6,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PoyoLang.Test", "PoyoLang.T
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PoyoLang.Dictionary.Generation", "PoyoLang.Dictionary.Generation\PoyoLang.Dictionary.Generation.csproj", "{43FFCEF2-A4AA-49A1-9731-CB6DAD9863F2}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PoyoLang.Dictionary.Generation", "PoyoLang.Dictionary.Generation\PoyoLang.Dictionary.Generation.csproj", "{43FFCEF2-A4AA-49A1-9731-CB6DAD9863F2}"
|
||||||
EndProject
|
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
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
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}.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.ActiveCfg = Release|Any CPU
|
||||||
{43FFCEF2-A4AA-49A1-9731-CB6DAD9863F2}.Release|Any CPU.Build.0 = 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
|
EndGlobalSection
|
||||||
EndGlobal
|
EndGlobal
|
||||||
|
|||||||
Reference in New Issue
Block a user