add: basic grammar parser including expression and program.
This commit is contained in:
31
CanonSharp.Tests/Utils/GrammarParserTestBase.cs
Normal file
31
CanonSharp.Tests/Utils/GrammarParserTestBase.cs
Normal file
@@ -0,0 +1,31 @@
|
||||
using CanonSharp.Combinator.Abstractions;
|
||||
using CanonSharp.Pascal.Parser;
|
||||
using CanonSharp.Pascal.Scanner;
|
||||
using CanonSharp.Pascal.SyntaxTree;
|
||||
|
||||
namespace CanonSharp.Tests.Utils;
|
||||
|
||||
public abstract class GrammarParserTestBase
|
||||
{
|
||||
protected static T RunParser<T>(IParser<LexicalToken, SyntaxNodeBase> parser, string input) where T : SyntaxNodeBase
|
||||
{
|
||||
LexicalScanner scanner = new();
|
||||
LexicalTokenReadState state = new(scanner.Tokenize(new StringReadState(input)));
|
||||
IParseResult<LexicalToken, SyntaxNodeBase> parseResult = parser.Parse(state);
|
||||
|
||||
return parseResult.Value.Convert<T>();
|
||||
}
|
||||
|
||||
protected static List<T> RunParser<T>(IParser<LexicalToken, IEnumerable<SyntaxNodeBase>> parser,
|
||||
string input) where T : SyntaxNodeBase
|
||||
{
|
||||
LexicalScanner scanner = new();
|
||||
LexicalTokenReadState state = new(scanner.Tokenize(new StringReadState(input)));
|
||||
IParseResult<LexicalToken, IEnumerable<SyntaxNodeBase>> parseResult = parser.Parse(state);
|
||||
|
||||
return parseResult.Value.Select(node => node.Convert<T>()).ToList();
|
||||
}
|
||||
|
||||
protected static Program ProgramParse(string input)
|
||||
=> RunParser<Program>(GrammarParser.ProgramParser(), input);
|
||||
}
|
||||
Reference in New Issue
Block a user