feat: temporary grammar
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
namespace InkBlot.Visitor;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
public partial class Listener : InkBlotAntlrGrammarBaseListener
|
||||
namespace InkBlot.Visitor;
|
||||
|
||||
public partial class Listener(ILogger<Listener> Logger) : InkBlotAntlrGrammarBaseListener
|
||||
{
|
||||
}
|
||||
@@ -1,23 +1,15 @@
|
||||
using System.Text.RegularExpressions;
|
||||
using Antlr4.Runtime.Tree;
|
||||
using InkBlot.ParseHierarchy;
|
||||
|
||||
namespace InkBlot.Visitor;
|
||||
|
||||
public partial class Listener
|
||||
{
|
||||
private readonly ParseTreeProperty<Content> _contentTextValue = new();
|
||||
|
||||
private readonly Regex _escapeRegex = MyRegex();
|
||||
|
||||
[GeneratedRegex(@"\\(.)")]
|
||||
private static partial Regex MyRegex();
|
||||
|
||||
private Content GetContentText(InkBlotAntlrGrammarParser.ContentTextContext context)
|
||||
{
|
||||
return _contentTextValue.Get(context);
|
||||
}
|
||||
|
||||
public override void ExitContentText(InkBlotAntlrGrammarParser.ContentTextContext context)
|
||||
{
|
||||
// escape sequences are captured by this node, but not interpreted
|
||||
@@ -30,6 +22,6 @@ public partial class Listener
|
||||
var content = _escapeRegex.Replace(contentWithEscapes, match => match.Groups[1].Value);
|
||||
|
||||
// save the result
|
||||
_contentTextValue.Put(context, new Content(content));
|
||||
PutStoryNode(context, new Content(content));
|
||||
}
|
||||
}
|
||||
@@ -1,19 +1,97 @@
|
||||
using Antlr4.Runtime.Tree;
|
||||
using InkBlot.ParseHierarchy;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace InkBlot.Visitor;
|
||||
|
||||
internal record MultiDivertArrowsTail(bool LastArrowIsDivert, Identifier? Identifier);
|
||||
|
||||
public partial class Listener
|
||||
{
|
||||
private readonly ParseTreeProperty<MultiDivert> _multiDivertValues = new();
|
||||
private readonly ParseTreeProperty<MultiDivert> _multiDiverts = new();
|
||||
|
||||
private MultiDivert GetMultiDivert(InkBlotAntlrGrammarParser.MultiDivertContext context)
|
||||
private readonly ParseTreeProperty<MultiDivertArrowsTail> _multiDivertsArrowsTail = new();
|
||||
|
||||
public override void ExitMultiDivertThread(InkBlotAntlrGrammarParser.MultiDivertThreadContext context)
|
||||
{
|
||||
return _multiDivertValues.Get(context);
|
||||
var threadDivert = new ThreadDivert(
|
||||
_divertIdentifiers.Get(context.divertIdentifierWithArguments()));
|
||||
_multiDiverts.Put(context.Parent, threadDivert);
|
||||
}
|
||||
|
||||
public override void ExitMultiDivert(InkBlotAntlrGrammarParser.MultiDivertContext context)
|
||||
public override void ExitMultiDivertArrows(InkBlotAntlrGrammarParser.MultiDivertArrowsContext context)
|
||||
{
|
||||
_multiDivertValues.Put(context, new MultiDivert());
|
||||
var divertIdentifiers = context
|
||||
.divertIdentifierWithArguments()
|
||||
.Select(a => _divertIdentifiers.Get(a));
|
||||
var tail = _multiDivertsArrowsTail.Get(context.multiDivertArrows_tail());
|
||||
_multiDiverts.Put(context,
|
||||
tail.LastArrowIsDivert
|
||||
? new DivertsListWithoutReturnFromTunnel(
|
||||
(tail.Identifier != null ? divertIdentifiers.Append(tail.Identifier) : divertIdentifiers).ToArray(),
|
||||
tail.LastArrowIsDivert)
|
||||
: new DivertsListWithReturnFromTunnel(
|
||||
divertIdentifiers.ToArray(),
|
||||
tail.Identifier
|
||||
));
|
||||
}
|
||||
|
||||
public override void ExitMultiDivertArrows_tailDefaultChoice(
|
||||
InkBlotAntlrGrammarParser.MultiDivertArrows_tailDefaultChoiceContext context)
|
||||
{
|
||||
_multiDivertsArrowsTail.Put(context.Parent, new MultiDivertArrowsTail(true, null));
|
||||
}
|
||||
|
||||
public override void ExitMultiDivertArrows_tailDivert(
|
||||
InkBlotAntlrGrammarParser.MultiDivertArrows_tailDivertContext context)
|
||||
{
|
||||
_multiDivertsArrowsTail.Put(context.Parent, new MultiDivertArrowsTail(true,
|
||||
_divertIdentifiers.Get(context.divertIdentifierWithArguments())));
|
||||
}
|
||||
|
||||
public override void ExitMultiDivertArrows_tailTunnelWithReplacement(
|
||||
InkBlotAntlrGrammarParser.MultiDivertArrows_tailTunnelWithReplacementContext context)
|
||||
{
|
||||
_multiDivertsArrowsTail.Put(context.Parent, new MultiDivertArrowsTail(false,
|
||||
_divertIdentifiers.Get(context.divertIdentifierWithArguments())));
|
||||
}
|
||||
|
||||
public override void ExitMultiDivertArrows_tailTunnel(
|
||||
InkBlotAntlrGrammarParser.MultiDivertArrows_tailTunnelContext context)
|
||||
{
|
||||
_multiDivertsArrowsTail.Put(context.Parent, new MultiDivertArrowsTail(false, null));
|
||||
}
|
||||
|
||||
#region divertIdentifierWithArguments_name
|
||||
|
||||
private readonly ParseTreeProperty<string[]> _divertIdentifierNames = new();
|
||||
|
||||
public override void ExitDivertIdentifierWithArguments_name(
|
||||
InkBlotAntlrGrammarParser.DivertIdentifierWithArguments_nameContext context)
|
||||
{
|
||||
var name = context.identifier().Select(identifier => identifier.ToString().AsNotNull()).ToArray();
|
||||
_divertIdentifierNames.Put(context.Parent, name);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region divertIdentifierWithArguments
|
||||
|
||||
private readonly ParseTreeProperty<Identifier> _divertIdentifiers = new();
|
||||
|
||||
public override void ExitDivertIdentifierWithArguments(
|
||||
InkBlotAntlrGrammarParser.DivertIdentifierWithArgumentsContext context)
|
||||
{
|
||||
var c = context.divertIdentifierWithArguments_name();
|
||||
if (c == null)
|
||||
{
|
||||
Logger.LogWarning("found ExitDivertIdentifierWithArguments without name");
|
||||
return;
|
||||
}
|
||||
|
||||
var name = _divertIdentifierNames.Get(c);
|
||||
_divertIdentifiers.Put(context, new Identifier(name));
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -13,15 +13,7 @@ public partial class Listener
|
||||
var storyNodes = context
|
||||
.topLevelStatements()
|
||||
.topLevelStatement()
|
||||
.Select(topLevelStatement =>
|
||||
topLevelStatement.children.Single() switch
|
||||
{
|
||||
InkBlotAntlrGrammarParser.ContentTextContext contentTextContext =>
|
||||
(StoryNode)GetContentText(contentTextContext),
|
||||
InkBlotAntlrGrammarParser.MultiDivertContext multiDivertContext =>
|
||||
GetMultiDivert(multiDivertContext),
|
||||
_ => throw new InvalidOperationException()
|
||||
});
|
||||
.Select(topLevelStatement => GetStoryNode(topLevelStatement.children.Single()));
|
||||
_story = new Story(storyNodes);
|
||||
}
|
||||
}
|
||||
19
InkBlot/Visitor/ListenerStoryNode.cs
Normal file
19
InkBlot/Visitor/ListenerStoryNode.cs
Normal file
@@ -0,0 +1,19 @@
|
||||
using Antlr4.Runtime.Tree;
|
||||
using InkBlot.ParseHierarchy;
|
||||
|
||||
namespace InkBlot.Visitor;
|
||||
|
||||
public partial class Listener
|
||||
{
|
||||
private readonly ParseTreeProperty<IStoryNode> _storyNodeValue = new();
|
||||
|
||||
private void PutStoryNode(IParseTree tree, IStoryNode storyNode)
|
||||
{
|
||||
_storyNodeValue.Put(tree, storyNode);
|
||||
}
|
||||
|
||||
private IStoryNode GetStoryNode(IParseTree tree)
|
||||
{
|
||||
return _storyNodeValue.Get(tree);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user