Skip to content

Commit ad427e4

Browse files
committed
Added pattern matching to Aphid.
1 parent 01d05a7 commit ad427e4

File tree

9 files changed

+115
-23
lines changed

9 files changed

+115
-23
lines changed

.gitattributes

+1
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ Components.Aphid/Parser/NullExpression.cs -text
169169
Components.Aphid/Parser/NumberExpression.cs -text
170170
Components.Aphid/Parser/ObjectExpression.cs -text
171171
Components.Aphid/Parser/PartialFunctionExpression.cs -text
172+
Components.Aphid/Parser/PatternMatchingExpression.cs -text
172173
Components.Aphid/Parser/Statement.cs -text
173174
Components.Aphid/Parser/StringExpression.cs -text
174175
Components.Aphid/Parser/StringParser.cs -text

AphidCodeGenerator/Aphid.alx

+1-2
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,7 @@ ret
6464

6565
{ regex: "\\|>", type: "PipelineOperator" },
6666

67-
{ regex: "$", type: "AsyncOperator" },
68-
{ regex: "$>", type: "JoinOperator" },
67+
{ regex: "$", type: "PatternMatchingOperator" },
6968

7069
{ regex: ";", type: "EndOfStatement" },
7170

Components.Aphid.VSPackage/AphidScanner.cs

+1-2
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ public bool ScanTokenAndProvideInfoAboutIt(TokenInfo tokenInfo, ref int state)
5959
case AphidTokenType.functionOperator:
6060
case AphidTokenType.LoadLibraryOperator:
6161
case AphidTokenType.LoadScriptOperator:
62+
case AphidTokenType.PatternMatchingOperator:
6263

6364
tokenInfo.Type = TokenType.Keyword;
6465
tokenInfo.Color = TokenColor.Keyword;
@@ -67,7 +68,6 @@ public bool ScanTokenAndProvideInfoAboutIt(TokenInfo tokenInfo, ref int state)
6768
case AphidTokenType.AdditionOperator:
6869
case AphidTokenType.AndOperator:
6970
case AphidTokenType.AssignmentOperator:
70-
case AphidTokenType.AsyncOperator:
7171
case AphidTokenType.BinaryAndOperator:
7272
case AphidTokenType.BinaryOrOperator:
7373
case AphidTokenType.ColonOperator:
@@ -80,7 +80,6 @@ public bool ScanTokenAndProvideInfoAboutIt(TokenInfo tokenInfo, ref int state)
8080
case AphidTokenType.GreaterThanOperator:
8181
case AphidTokenType.GreaterThanOrEqualOperator:
8282
case AphidTokenType.IncrementOperator:
83-
case AphidTokenType.JoinOperator:
8483
case AphidTokenType.LessThanOperator:
8584
case AphidTokenType.LessThanOrEqualOperator:
8685
case AphidTokenType.MinusEqualOperator:

Components.Aphid/Components.Aphid.csproj

+1
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@
8787
<Compile Include="Parser\AphidNodeCollection.cs" />
8888
<Compile Include="Parser\AphidParserException.cs" />
8989
<Compile Include="Parser\PartialFunctionExpression.cs" />
90+
<Compile Include="Parser\PatternMatchingExpression.cs" />
9091
<Compile Include="Parser\StringParser.cs" />
9192
<Compile Include="Parser\ThisExpression.cs" />
9293
<Compile Include="Parser\UnaryOperatorExpression.cs" />

Components.Aphid/Interpreter/AphidInterpreter.cs

+34-2
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,8 @@ private AphidObject InterpretOrExpression(BinaryOperatorExpression expression)
9393

9494
private AphidObject InterpretEqualityExpression(BinaryOperatorExpression expression)
9595
{
96-
var left = InterpretExpression(expression.LeftOperand) as AphidObject;
97-
var right = InterpretExpression(expression.RightOperand) as AphidObject;
96+
var left = (AphidObject)InterpretExpression(expression.LeftOperand);
97+
var right = (AphidObject)InterpretExpression(expression.RightOperand);
9898

9999
bool val = left.Value != null ?
100100
left.Value.Equals(right.Value) :
@@ -718,6 +718,34 @@ public AphidObject InterpretThisExpression()
718718
return _currentScope.Variables;
719719
}
720720

721+
public AphidObject InterpretPatternMatchingExpression(PatternMatchingExpression expression)
722+
{
723+
var left = (AphidObject)InterpretExpression(expression.TestExpression);
724+
725+
foreach (var p in expression.Patterns)
726+
{
727+
if (p.Item1 != null)
728+
{
729+
var right = (AphidObject)InterpretExpression(p.Item1);
730+
731+
var b = left.Value != null ?
732+
left.Value.Equals(right.Value) :
733+
(null == right.Value && left.Count == 0 && right.Count == 0);
734+
735+
if (b)
736+
{
737+
return ValueHelper.Wrap(InterpretExpression(p.Item2));
738+
}
739+
}
740+
else
741+
{
742+
return ValueHelper.Wrap(InterpretExpression(p.Item2));
743+
}
744+
}
745+
746+
return new AphidObject();
747+
}
748+
721749
private object InterpretExpression(Expression expression)
722750
{
723751
if (expression is BinaryOperatorExpression)
@@ -801,6 +829,10 @@ private object InterpretExpression(Expression expression)
801829
{
802830
return InterpretThisExpression();
803831
}
832+
else if (expression is PatternMatchingExpression)
833+
{
834+
return InterpretPatternMatchingExpression(expression as PatternMatchingExpression);
835+
}
804836
else
805837
{
806838
throw new AphidRuntimeException("Unexpected expression {0}", expression);

Components.Aphid/Interpreter/AphidObject.g.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//------------------------------------------------------------------------------
22
// <auto-generated>
33
// This code was generated by a tool.
4-
// Runtime Version:4.0.30319.18033
4+
// Runtime Version:4.0.30319.18046
55
//
66
// Changes to this file may cause incorrect behavior and will be lost if
77
// the code is regenerated.

Components.Aphid/Lexer/AphidLexer.cs

+3-16
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ public enum AphidTokenType : short
1717
AdditionOperator,
1818
AndOperator,
1919
AssignmentOperator,
20-
AsyncOperator,
2120
BinaryAndOperator,
2221
BinaryOrOperator,
2322
breakKeyword,
@@ -43,7 +42,6 @@ public enum AphidTokenType : short
4342
ifKeyword,
4443
IncrementOperator,
4544
inKeyword,
46-
JoinOperator,
4745
LeftBrace,
4846
LeftBracket,
4947
LeftParenthesis,
@@ -64,6 +62,7 @@ public enum AphidTokenType : short
6462
Number,
6563
OrEqualOperator,
6664
OrOperator,
65+
PatternMatchingOperator,
6766
PipelineOperator,
6867
PlusEqualOperator,
6968
retKeyword,
@@ -520,21 +519,8 @@ private AphidTokenType GetToken()
520519
return AphidTokenType.NotOperator;
521520

522521
case '$':
523-
if (charIndex < lastIndex)
524-
{
525-
currentChar = text[++charIndex];
526-
527-
switch (currentChar)
528-
{
529-
case '>':
530522

531-
return AphidTokenType.JoinOperator;
532-
533-
}
534-
535-
charIndex--;
536-
}
537-
return AphidTokenType.AsyncOperator;
523+
return AphidTokenType.PatternMatchingOperator;
538524

539525
case ';':
540526

@@ -2129,6 +2115,7 @@ public List<AphidToken> GetAllTokens()
21292115

21302116
tokens.Add(new AphidToken(tokenType, lexeme, index));
21312117

2118+
21322119
lastIndex = charIndex;
21332120
}
21342121

Components.Aphid/Parser/AphidParser.cs

+54
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,60 @@ public Expression ParseFactor()
253253
NextToken();
254254
break;
255255

256+
case AphidTokenType.PatternMatchingOperator:
257+
var matchExp = new PatternMatchingExpression();
258+
NextToken();
259+
Match(AphidTokenType.LeftParenthesis);
260+
matchExp.TestExpression = ParseExpression();
261+
Match(AphidTokenType.RightParenthesis);
262+
263+
while (true)
264+
{
265+
var tests = new List<Expression>();
266+
267+
while (true)
268+
{
269+
tests.Add(ParseExpression());
270+
271+
if (_currentToken.TokenType == AphidTokenType.Comma)
272+
{
273+
NextToken();
274+
}
275+
else
276+
{
277+
break;
278+
}
279+
}
280+
281+
if (_currentToken.TokenType == AphidTokenType.ColonOperator)
282+
{
283+
NextToken();
284+
285+
var b = ParseExpression();
286+
287+
foreach (var t in tests)
288+
{
289+
matchExp.Patterns.Add(new Tuple<Expression, Expression>(t, b));
290+
}
291+
}
292+
else
293+
{
294+
matchExp.Patterns.Add(new Tuple<Expression,Expression>(null, tests[0]));
295+
}
296+
297+
if (_currentToken.TokenType == AphidTokenType.Comma)
298+
{
299+
NextToken();
300+
}
301+
else
302+
{
303+
break;
304+
}
305+
}
306+
307+
exp = matchExp;
308+
break;
309+
256310
default:
257311
throw new AphidParserException(_currentToken);
258312
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
6+
namespace Components.Aphid.Parser
7+
{
8+
public class PatternMatchingExpression : Expression
9+
{
10+
public Expression TestExpression { get; set; }
11+
12+
public List<Tuple<Expression, Expression>> Patterns { get; set; }
13+
14+
public PatternMatchingExpression()
15+
{
16+
Patterns = new List<Tuple<Expression, Expression>>();
17+
}
18+
}
19+
}

0 commit comments

Comments
 (0)