Skip to content

Commit

Permalink
Add trquery.
Browse files Browse the repository at this point in the history
  • Loading branch information
kaby76 committed Jul 29, 2023
1 parent 9db1e9c commit 312e812
Show file tree
Hide file tree
Showing 14 changed files with 470 additions and 337 deletions.
6 changes: 6 additions & 0 deletions Trash.sln
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "trcover", "src\trcover\trco
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "trcaret", "src\trcaret\trcaret.csproj", "{3325A532-9EFE-44D9-A814-E50BEC805135}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "trquery", "src\trquery\trquery.csproj", "{E7AF9D4A-AE01-4DC2-8194-DD323DF99206}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -481,6 +483,10 @@ Global
{3325A532-9EFE-44D9-A814-E50BEC805135}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3325A532-9EFE-44D9-A814-E50BEC805135}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3325A532-9EFE-44D9-A814-E50BEC805135}.Release|Any CPU.Build.0 = Release|Any CPU
{E7AF9D4A-AE01-4DC2-8194-DD323DF99206}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E7AF9D4A-AE01-4DC2-8194-DD323DF99206}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E7AF9D4A-AE01-4DC2-8194-DD323DF99206}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E7AF9D4A-AE01-4DC2-8194-DD323DF99206}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down
11 changes: 11 additions & 0 deletions src/trconvert/Command.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System.Collections;
using System.Text.RegularExpressions;
using trconvert;

namespace Trash
{
Expand Down Expand Up @@ -121,6 +122,16 @@ public void Execute(Config config)

case "Bison":
{
ConvertBison.ToAntlr4(trees, parser, lexer, fn);
var tuple = new ParsingResultSet()
{
Text = ParseTreeEditing.UnvParseTreeDOM.TreeEdits.Reconstruct(trees),
FileName = new Regex("[^.]+$").Replace(fn, "g4"),
Nodes = trees,
Lexer = lexer,
Parser = parser
};
results.Add(tuple);
break;
}

Expand Down
335 changes: 7 additions & 328 deletions src/trconvert/ConvertBison.cs

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion src/trconvert/Properties/launchSettings.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"trconvert": {
"commandName": "Project",
"commandLineArgs": "-f o.pt",
"workingDirectory": "c:\\Users\\Kenne\\Documents\\GitHub\\Domemtech.Trash\\_tests\\trconvert\\antlr3"
"workingDirectory": "c:\\Users\\Kenne\\Documents\\GitHub\\Domemtech.Trash\\src\\grammars\\bison\\examples"
}
}
}
5 changes: 1 addition & 4 deletions src/trdelete/Command.cs
Original file line number Diff line number Diff line change
@@ -1,14 +1,11 @@
namespace Trash
{
using Antlr4.Runtime.Tree;
using AntlrJson;
using ParseTreeEditing.UnvParseTreeDOM;
using org.eclipse.wst.xml.xpath2.processor.util;
using LoggerNs;
using ParseTreeEditing.UnvParseTreeDOM;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.Json;

class Command
Expand Down
5 changes: 3 additions & 2 deletions src/trgen/Command.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1452,7 +1452,7 @@ public void GenerateViaConfig(Config config)
.Where(f => f is FileInfo && !f.Attributes.HasFlag(FileAttributes.Directory))
.Select(f => f.FullName.Replace('\\', '/'))
.ToList();
GenFromTemplates(this, config, test);
GenFromTemplates(config, test);
AddSource(config, test);
}
}
Expand Down Expand Up @@ -1600,7 +1600,7 @@ static void CopyDirectory(string sourceDir, string destinationDir, bool recursiv
}
}

private void GenFromTemplates(Command p, Config config, Test test)
private void GenFromTemplates(Config config, Test test)
{
var append_namespace = (!(test.target == "CSharp" || test.target == "Antlr4cs"));
List<string> template_directory_files_to_copy;
Expand Down Expand Up @@ -1765,6 +1765,7 @@ private void GenFromTemplates(Command p, Config config, Test test)
.Substring(output_dir.Length))
.Where(t => t.Contains(Suffix(test.target)))
.ToList();
t.Add("target", test.target);
t.Add("additional_sources", yo1);
t.Add("additional_targets", test.all_target_files.Where(xx =>
{
Expand Down
4 changes: 2 additions & 2 deletions src/trgen/Properties/launchSettings.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
"profiles": {
"dotnet-antlr": {
"commandName": "Project",
"commandLineArgs": "-t Cpp",
"workingDirectory": "c:\\msys64\\home\\Kenne\\issues\\g4-3539\\python\\python3"
"commandLineArgs": "-t CSharp",
"workingDirectory": "c:\\msys64\\home\\Kenne\\targ-agn-expr"
}
}
}
186 changes: 186 additions & 0 deletions src/trquery/Command.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,186 @@
namespace Trash
{
using Antlr4.Runtime;
using AntlrJson;
using org.eclipse.wst.xml.xpath2.processor.util;
using ParseTreeEditing.UnvParseTreeDOM;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.Json;

class Command
{
public string Help()
{
using (Stream stream = this.GetType().Assembly.GetManifestResourceStream("trquery.readme.md"))
using (StreamReader reader = new StreamReader(stream))
{
return reader.ReadToEnd();
}
}

public void Execute(Config config)
{
var file_name = config.Query.FirstOrDefault();
string inp = null;
ICharStream str = null;
if (file_name == null && config.Input != null)
{
inp = config.Input;
str = CharStreams.fromString(inp);
}
else if (file_name != null)
{
FileStream fs = new FileStream(file_name, FileMode.Open);
str = new Antlr4.Runtime.AntlrInputStream(fs);
}
if (config.Verbose)
{
System.Console.Error.WriteLine("Query = >>>" + file_name + "<<<");
}
var slexer = new ParseTreeScriptLexer(str);
var stokens = new CommonTokenStream(slexer);
var sparser = new ParseTreeScriptParser(stokens);
var stree = sparser.commands();

string lines = null;
if (!(config.File != null && config.File != ""))
{
if (config.Verbose)
{
System.Console.Error.WriteLine("reading from stdin");
}
for (; ; )
{
lines = System.Console.In.ReadToEnd();
if (lines != null && lines != "") break;
}
lines = lines.Trim();
}
else
{
if (config.Verbose)
{
System.Console.Error.WriteLine("reading from file >>>" + config.File + "<<<");
}
lines = File.ReadAllText(config.File);
}
var serializeOptions = new JsonSerializerOptions();
serializeOptions.Converters.Add(new AntlrJson.ParsingResultSetSerializer());
serializeOptions.WriteIndented = config.Format;
serializeOptions.MaxDepth = 10000;
if (config.Verbose) LoggerNs.TimedStderrOutput.WriteLine("starting deserialization");
var data = JsonSerializer.Deserialize<AntlrJson.ParsingResultSet[]>(lines, serializeOptions);
if (config.Verbose) LoggerNs.TimedStderrOutput.WriteLine("deserialized");
var results = new List<ParsingResultSet>();
foreach (var parse_info in data)
{
var trees = parse_info.Nodes;
var text = parse_info.Text;
var fn = parse_info.FileName;
var parser = parse_info.Parser;
var lexer = parse_info.Lexer;
if (config.Verbose)
{
foreach (var n in trees)
LoggerNs.TimedStderrOutput.WriteLine(TreeOutput.OutputTree(n, lexer, parser).ToString());
}
org.eclipse.wst.xml.xpath2.processor.Engine engine = new org.eclipse.wst.xml.xpath2.processor.Engine();
var ate = new ParseTreeEditing.UnvParseTreeDOM.ConvertToDOM();
using (ParseTreeEditing.UnvParseTreeDOM.AntlrDynamicContext dynamicContext = ate.Try(trees, parser))
{
foreach (var scommand in stree.command())
{
var command = scommand.GetChild(0).GetText();
if (command == "inserta")
{
var expr = RemoveQuotes(scommand.GetChild(1).GetText());
var value = RemoveQuotes(scommand.GetChild(2).GetText());
var nodes = engine.parseExpression(expr,
new StaticContextBuilder()).evaluate(dynamicContext,
new object[] { dynamicContext.Document })
.Select(x => (x.NativeValue as ParseTreeEditing.UnvParseTreeDOM.UnvParseTreeElement))
.ToList();
if (config.Verbose)
LoggerNs.TimedStderrOutput.WriteLine("Found " + nodes.Count + " nodes.");
foreach (var node in nodes)
{
TreeEdits.InsertAfter(node, value);
}
}
else if (command == "insertb")
{
var expr = RemoveQuotes(scommand.GetChild(1).GetText());
var value = RemoveQuotes(scommand.GetChild(2).GetText());
var nodes = engine.parseExpression(expr,
new StaticContextBuilder()).evaluate(dynamicContext,
new object[] { dynamicContext.Document })
.Select(x => (x.NativeValue as ParseTreeEditing.UnvParseTreeDOM.UnvParseTreeElement))
.ToList();
if (config.Verbose)
LoggerNs.TimedStderrOutput.WriteLine("Found " + nodes.Count + " nodes.");
foreach (var node in nodes)
{
TreeEdits.InsertBefore(node, value);
}
}
else if (command == "replace")
{
var expr = RemoveQuotes(scommand.GetChild(1).GetText());
var value = RemoveQuotes(scommand.GetChild(2).GetText());
var nodes = engine.parseExpression(expr,
new StaticContextBuilder()).evaluate(dynamicContext,
new object[] { dynamicContext.Document })
.Select(x => (x.NativeValue as ParseTreeEditing.UnvParseTreeDOM.UnvParseTreeElement))
.ToList();
if (config.Verbose)
LoggerNs.TimedStderrOutput.WriteLine("Found " + nodes.Count + " nodes.");
foreach (var node in nodes)
{
TreeEdits.Replace(node, value);
}
}
else if (command == "delete")
{
var expr = RemoveQuotes(scommand.GetChild(1).GetText());
var nodes = engine.parseExpression(expr,
new StaticContextBuilder()).evaluate(dynamicContext,
new object[] { dynamicContext.Document })
.Select(x => (x.NativeValue as ParseTreeEditing.UnvParseTreeDOM.UnvParseTreeElement))
.ToList();
TreeEdits.Delete(nodes);
}
}

var tuple = new ParsingResultSet()
{
Text = text,
FileName = fn,
Nodes = trees,
Lexer = lexer,
Parser = parser
};
results.Add(tuple);
if (config.Verbose)
{
foreach (var node in trees)
System.Console.Error.WriteLine(TreeOutput.OutputTree(node, lexer, parser).ToString());
}
}
}
if (config.Verbose) LoggerNs.TimedStderrOutput.WriteLine("starting serialization");
string js1 = JsonSerializer.Serialize(results.ToArray(), serializeOptions);
if (config.Verbose) LoggerNs.TimedStderrOutput.WriteLine("serialized");
System.Console.WriteLine(js1);
}

private string RemoveQuotes(string v)
{
var v2 = v.Substring(1);
var v3 = v2.Substring(0, v2.Length - 1);
return v3;
}
}
}
23 changes: 23 additions & 0 deletions src/trquery/Config.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using System.Collections.Generic;
using CommandLine;

namespace Trash
{
public class Config
{
[Option('f', "file", Required = false, HelpText = "Read parse tree data from file instead of stdin.")]
public string File { get; set; }

[Option("fmt", Required = false, HelpText = "Output formatted parsing results set.")]
public bool Format { get; set; }

[Option('i', "input", Required = false, HelpText = "Query as input string.")]
public string Input { get; set; }

[Option('v', "verbose", Required = false)]
public bool Verbose { get; set; }

[Value(0)]
public IEnumerable<string> Query { get; set; }
}
}
43 changes: 43 additions & 0 deletions src/trquery/ParseTreeScript.g4
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
grammar ParseTreeScript;

commands : (command ';')* EOF;
command : 'inserta' string string | 'insertb' string string | 'delete' string | 'replace' string;
string : String;
WS : [ \n\r\t]+ -> channel(HIDDEN);
String
: '"' DoubleStringCharacter* '"'
| '\'' SingleStringCharacter* '\''
;
WhiteSpaces
: [\t\u000B\u000C\u0020\u00A0]+ -> channel(HIDDEN)
;
MultiLineComment
: '/*' .*? '*/' -> channel(HIDDEN)
;
SingleLineComment
: '//' ~[\r\n\u2028\u2029]* -> channel(HIDDEN)
;
fragment DoubleStringCharacter
: ~["\\\r\n]
| '\\' EscapeSequence
;
fragment SingleStringCharacter
: ~['\\\r\n]
| '\\' EscapeSequence
;
fragment EscapeSequence
: CharacterEscapeSequence
;
fragment CharacterEscapeSequence
: SingleEscapeCharacter
| NonEscapeCharacter
;
fragment SingleEscapeCharacter
: ['"\\bfnrtv]
;
fragment NonEscapeCharacter
: ~['"\\bfnrtv0-9xu\r\n]
;
fragment EscapeCharacter
: SingleEscapeCharacter
;
Loading

0 comments on commit 312e812

Please sign in to comment.