Skip to content

Commit 48f0971

Browse files
authored
Merge pull request #3 from b3b00/dev
Dev
2 parents a0095e3 + ac9337d commit 48f0971

32 files changed

+1144
-59
lines changed

.gitlab-ci.yml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,11 @@ build:
77
stage: build
88
script:
99
- 'dotnet build -c Release -f netcoreapp1.0 '
10-
- 'dotnet pack -c Release sly/sly.csproj'
10+
# - 'dotnet pack -c Release sly/sly.csproj'
1111
artifacts:
1212
paths:
1313
- sly/bin/Release/netcoreapp1.0/
1414
- expressionParser/bin/Release/netcoreapp1.0/
1515
- jsonparser/bin/Release/netcoreapp1.0/
1616
- sly/bin/Release/*.nupkg
17-
only:
18-
- master
17+

ParserExample/ParserExample.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<OutputType>Exe</OutputType>
5-
<TargetFrameworks>netcoreapp1.0;net45</TargetFrameworks>
5+
<TargetFrameworks>netcoreapp1.0</TargetFrameworks>
66
<Authors>b3b00</Authors>
77
</PropertyGroup>
88

ParserExample/Program.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,9 @@ public static object Rec(List<object> args)
8181
static void Main(string[] args)
8282
{
8383
JSONParser jsonparser = new JSONParser();
84-
Parser<JsonToken> yacc = ParserBuilder.BuildParser<JsonToken>(jsonparser, ParserType.LL_RECURSIVE_DESCENT, "root");
84+
ParserBuilder builder = new ParserBuilder();
85+
86+
Parser<JsonToken> yacc = builder.BuildParser<JsonToken>(jsonparser, ParserType.LL_RECURSIVE_DESCENT, "root");
8587

8688

8789
ParseResult<JsonToken> result = yacc.Parse("'hello' 'world!'");

ParserTests/EBNFTests.cs

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
using System.Linq;
2+
using Xunit;
3+
using sly.parser;
4+
using sly.lexer;
5+
using sly.parser.generator;
6+
using System.Collections.Generic;
7+
using expressionparser;
8+
using sly.parser.llparser;
9+
using sly.parser.syntax;
10+
11+
12+
namespace ParserTests
13+
{
14+
15+
public class EBNFTests
16+
{
17+
18+
public enum TokenType
19+
{
20+
a = 1,
21+
b = 2,
22+
c = 3,
23+
WS = 100,
24+
EOL = 101
25+
}
26+
27+
28+
[LexerConfigurationAttribute]
29+
public ILexer<TokenType> BuildJsonLexer(ILexer<TokenType> lexer)
30+
{
31+
lexer.AddDefinition(new TokenDefinition<TokenType>(TokenType.a, "a"));
32+
lexer.AddDefinition(new TokenDefinition<TokenType>(TokenType.b, "b"));
33+
lexer.AddDefinition(new TokenDefinition<TokenType>(TokenType.c, "c"));
34+
35+
lexer.AddDefinition(new TokenDefinition<TokenType>(TokenType.WS, "[ \\t]+", true));
36+
lexer.AddDefinition(new TokenDefinition<TokenType>(TokenType.EOL, "[\\n\\r]+", true, true));
37+
return lexer;
38+
}
39+
40+
41+
[Reduction("R : A B c ")]
42+
public object R(string A, string B, Token<TokenType> c)
43+
{
44+
string result = "R(";
45+
result += A + ",";
46+
result += B + ",";
47+
result += c.Value;
48+
result += ")";
49+
return result;
50+
}
51+
52+
[Reduction("A : a + ")]
53+
public object A(List<Token<TokenType>> astr)
54+
{
55+
string result = "A(";
56+
result +=(string) astr
57+
.Select(a => a.Value)
58+
.Aggregate<string>((a1, a2) => a1 + ", " + a2);
59+
result += ")";
60+
return result;
61+
}
62+
63+
[Reduction("B : b * ")]
64+
public object B(List<Token<TokenType>> bstr)
65+
{
66+
if (bstr.Any())
67+
{
68+
string result = "B(";
69+
result += bstr
70+
.Select(b => b.Value)
71+
.Aggregate<string>((b1, b2) => b1 + ", " + b2);
72+
result += ")";
73+
return result;
74+
}
75+
return "B()";
76+
}
77+
78+
private Parser<TokenType> Parser;
79+
80+
public EBNFTests()
81+
{
82+
83+
}
84+
85+
private Parser<TokenType> BuildParser()
86+
{
87+
EBNFTests parserInstance = new EBNFTests();
88+
EBNFParserBuilder<TokenType> builder = new EBNFParserBuilder<TokenType>();
89+
90+
EBNFTests parserTest = new EBNFTests();
91+
92+
Parser = builder.BuildParser(parserTest, ParserType.EBNF_LL_RECURSIVE_DESCENT, "R");
93+
return Parser;
94+
}
95+
96+
97+
[Fact]
98+
public void TestParseBuild()
99+
{
100+
Parser = BuildParser();
101+
Assert.Equal(typeof(EBNFRecursiveDescentSyntaxParser<TokenType>),Parser.SyntaxParser.GetType());
102+
Assert.Equal(Parser.Configuration.NonTerminals.Count, 3);
103+
NonTerminal<TokenType> nt = Parser.Configuration.NonTerminals["R"];
104+
Assert.Equal(nt.Rules.Count, 1);
105+
nt = Parser.Configuration.NonTerminals["A"];
106+
Assert.Equal(nt.Rules.Count, 1);
107+
Rule<TokenType> rule = nt.Rules[0];
108+
Assert.Equal(rule.Clauses.Count,1);
109+
Assert.IsType(typeof(OneOrMoreClause<TokenType>),rule.Clauses[0]);
110+
nt = Parser.Configuration.NonTerminals["B"];
111+
Assert.Equal(nt.Rules.Count, 1);
112+
rule = nt.Rules[0];
113+
Assert.Equal(rule.Clauses.Count, 1);
114+
Assert.IsType(typeof(ZeroOrMoreClause<TokenType>), rule.Clauses[0]);
115+
;
116+
}
117+
118+
[Fact]
119+
public void TestOneOrMoreWithMany()
120+
{
121+
Parser = BuildParser();
122+
ParseResult<TokenType> result = Parser.Parse("aaa b c");
123+
Assert.False(result.IsError);
124+
Assert.IsType(typeof(string),result.Result);
125+
Assert.Equal("R(A(a,a,a),B(b),c)",result.Result.ToString().Replace(" ",""));
126+
}
127+
128+
[Fact]
129+
public void TestOneOrMoreWithOne()
130+
{
131+
Parser = BuildParser();
132+
ParseResult<TokenType> result = Parser.Parse(" b c");
133+
Assert.True(result.IsError);
134+
}
135+
136+
[Fact]
137+
public void TestZeroOrMoreWithOne()
138+
{
139+
Parser = BuildParser();
140+
ParseResult<TokenType> result = Parser.Parse("a b c");
141+
Assert.False(result.IsError);
142+
Assert.IsType(typeof(string), result.Result);
143+
Assert.Equal("R(A(a),B(b),c)", result.Result.ToString().Replace(" ", ""));
144+
}
145+
146+
[Fact]
147+
public void TestZeroOrMoreWithMany()
148+
{
149+
Parser = BuildParser();
150+
ParseResult<TokenType> result = Parser.Parse("a bb c");
151+
Assert.False(result.IsError);
152+
Assert.IsType(typeof(string), result.Result);
153+
Assert.Equal("R(A(a),B(b,b),c)", result.Result.ToString().Replace(" ", ""));
154+
}
155+
156+
[Fact]
157+
public void TestZeroOrMoreWithNone()
158+
{
159+
Parser = BuildParser();
160+
ParseResult<TokenType> result = Parser.Parse("a c");
161+
Assert.False(result.IsError);
162+
Assert.IsType(typeof(string), result.Result);
163+
Assert.Equal("R(A(a),B(),c)", result.Result.ToString().Replace(" ", ""));
164+
}
165+
166+
167+
168+
169+
170+
}
171+
}

ParserTests/ErrorTests.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ public class ErrorTests
1818
public void TestJsonSyntaxError()
1919
{
2020
JSONParser jsonParser = new JSONParser();
21-
Parser<JsonToken> parser = ParserBuilder.BuildParser<JsonToken>(jsonParser, ParserType.LL_RECURSIVE_DESCENT, "root");
21+
ParserBuilder builder = new ParserBuilder();
22+
Parser<JsonToken> parser = builder.BuildParser<JsonToken>(jsonParser, ParserType.LL_RECURSIVE_DESCENT, "root");
2223

2324

2425
string source = @"{
@@ -43,7 +44,8 @@ public void TestJsonSyntaxError()
4344
public void TestExpressionSyntaxError()
4445
{
4546
ExpressionParser exprParser = new ExpressionParser();
46-
Parser<ExpressionToken> Parser = ParserBuilder.BuildParser<ExpressionToken>(exprParser, ParserType.LL_RECURSIVE_DESCENT, "expression");
47+
ParserBuilder builder = new ParserBuilder();
48+
Parser<ExpressionToken> Parser = builder.BuildParser<ExpressionToken>(exprParser, ParserType.LL_RECURSIVE_DESCENT, "expression");
4749

4850
ParseResult<ExpressionToken> r = Parser.Parse(" 2 + 3 + + 2");
4951
Assert.True(r.IsError);
@@ -64,7 +66,8 @@ public void TestLexicalError()
6466
{
6567
ExpressionParser exprParser = new ExpressionParser();
6668

67-
Parser<ExpressionToken> Parser = ParserBuilder.BuildParser<ExpressionToken>(exprParser, ParserType.LL_RECURSIVE_DESCENT, "root");
69+
ParserBuilder builder = new ParserBuilder();
70+
Parser<ExpressionToken> Parser = builder.BuildParser<ExpressionToken>(exprParser, ParserType.LL_RECURSIVE_DESCENT, "root");
6871
ParseResult<ExpressionToken> r = Parser.Parse("2 @ 2");
6972
Assert.True(r.IsError);
7073
Assert.Null(r.Result);

ParserTests/ExpressionTests.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ public class ExpressionTests
1717
public ExpressionTests()
1818
{
1919
ExpressionParser parserInstance = new ExpressionParser();
20-
Parser = ParserBuilder.BuildParser<ExpressionToken>(parserInstance, ParserType.LL_RECURSIVE_DESCENT, "expression");
20+
ParserBuilder builder = new ParserBuilder();
21+
Parser = builder.BuildParser<ExpressionToken>(parserInstance, ParserType.LL_RECURSIVE_DESCENT, "expression");
2122
}
2223

2324

ParserTests/JsonTests.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ public class JsonTests
1616
public JsonTests()
1717
{
1818
JSONParser jsonParser = new JSONParser();
19-
Parser = ParserBuilder.BuildParser<JsonToken>(jsonParser, ParserType.LL_RECURSIVE_DESCENT, "root");
19+
ParserBuilder builder = new ParserBuilder();
20+
Parser = builder.BuildParser<JsonToken>(jsonParser, ParserType.LL_RECURSIVE_DESCENT, "root");
2021
}
2122

2223

ParserTests/ParserTests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFrameworks>netcoreapp1.0;net45</TargetFrameworks>
4+
<TargetFrameworks>netcoreapp1.0</TargetFrameworks>
55
<Authors>b3b00</Authors>
66
</PropertyGroup>
77

ParserTests/VisitorTests.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,8 @@ public SyntaxNode<TokenType> node(string name, params ISyntaxNode<TokenType>[] l
6161
public void testVisitor()
6262
{
6363
VisitorTests visitorInstance = new VisitorTests();
64-
Parser<TokenType> parser = ParserBuilder.BuildParser<TokenType>(visitorInstance, ParserType.LL_RECURSIVE_DESCENT, "R");
64+
ParserBuilder builder = new ParserBuilder();
65+
Parser<TokenType> parser = builder.BuildParser<TokenType>(visitorInstance, ParserType.LL_RECURSIVE_DESCENT, "R");
6566
SyntaxTreeVisitor<TokenType> visitor = parser.Visitor;
6667

6768
// build a syntax tree
@@ -72,7 +73,7 @@ public void testVisitor()
7273
SyntaxLeaf<TokenType> cT = leaf(TokenType.c, "c", position);
7374

7475
SyntaxNode<TokenType> aN = node("A__a_", aT);
75-
SyntaxNode<TokenType> rN = node("R__A_b_c_", aN,bT,cT);
76+
SyntaxNode<TokenType> rN = node("R__A_b_c", aN,bT,cT);
7677

7778
string r = visitor.VisitSyntaxTree(rN).ToString();
7879
;

expressionParser/expressionParser.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22
<PropertyGroup>
3-
<TargetFrameworks>netcoreapp1.0;net45</TargetFrameworks>
3+
<TargetFrameworks>netcoreapp1.0</TargetFrameworks>
44
<Authors>b3b00</Authors>
55
</PropertyGroup>
66

0 commit comments

Comments
 (0)