9
9
using Xunit ;
10
10
using ParserTests . Issue184 ;
11
11
using sly . parser . generator . visitor ;
12
+ using sly . parser . syntax . tree ;
12
13
using ExpressionToken = expressionparser . ExpressionToken ;
13
14
14
15
namespace ParserTests
@@ -26,6 +27,32 @@ public double BinaryTermExpression(double left, Token<ExpressionToken> operation
26
27
}
27
28
28
29
}
30
+
31
+ public class PrefixOperation
32
+ {
33
+ [ Prefix ( "'##'" , Associativity . Left , 10 ) ]
34
+ [ NodeName ( "hash-hash" ) ]
35
+ public string prefixHashHash ( Token < SimpleExpressionToken > token , string operand )
36
+ {
37
+ return $ "{ token . Value } ::{ operand } ";
38
+ }
39
+
40
+ [ Prefix ( "'@@'" , Associativity . Left , 10 ) ]
41
+ [ NodeName ( "at-at" ) ]
42
+ public string prefixAtAt ( Token < SimpleExpressionToken > token , string operand )
43
+ {
44
+ return $ "{ token . Value } ::{ operand } ";
45
+ }
46
+
47
+
48
+
49
+ [ Operand ]
50
+ [ Production ( "testOperand: INT" ) ]
51
+ public string Operand ( Token < SimpleExpressionToken > token )
52
+ {
53
+ return token . Value ;
54
+ }
55
+ }
29
56
30
57
public class ExpressionGeneratorExplicitOperatorAsNames
31
58
{
@@ -48,6 +75,7 @@ public double BinaryTermExpression(double left, Token<SimpleExpressionToken> ope
48
75
}
49
76
50
77
[ Prefix ( ( int ) SimpleExpressionToken . MINUS , Associativity . Right , 100 ) ]
78
+ [ NodeName ( "hash-hash" ) ]
51
79
public double PreFixExpression ( Token < SimpleExpressionToken > operation , double value )
52
80
{
53
81
return - value ;
@@ -430,5 +458,42 @@ public void TestExplicitOperatorAsNames()
430
458
Check . That ( result ) . IsOkParsing ( ) ;
431
459
Check . That ( result . Result ) . IsEqualTo ( - 1 + 2 * ( 5 + 6 ) - 4 ) ;
432
460
}
461
+
462
+ [ Fact ]
463
+ public void TestPrefix ( )
464
+ {
465
+ StartingRule = $ "{ nameof ( PrefixOperation ) } _expressions";
466
+ var parserInstance = new PrefixOperation ( ) ;
467
+ var builder = new ParserBuilder < SimpleExpressionToken , string > ( ) ;
468
+ var buildResult = builder . BuildParser ( parserInstance , ParserType . EBNF_LL_RECURSIVE_DESCENT , StartingRule ) ;
469
+ Check . That ( buildResult ) . IsOk ( ) ;
470
+ var parser = buildResult . Result ;
471
+
472
+ var result = parser . Parse ( "## 42" ) ;
473
+ Check . That ( result ) . IsOkParsing ( ) ;
474
+ Check . That ( result . Result ) . IsEqualTo ( "##::42" ) ;
475
+ var tree = result . SyntaxTree ;
476
+ var syntaxTree = tree as SyntaxNode < SimpleExpressionToken , string > ;
477
+ Check . That ( syntaxTree ) . IsNotNull ( ) ;
478
+ Check . That ( syntaxTree . Children ) . CountIs ( 1 ) ;
479
+ Check . That ( syntaxTree . Name ) . IsEqualTo ( $ "{ nameof ( PrefixOperation ) } _expressions") ;
480
+ var child = syntaxTree . Children [ 0 ] as SyntaxNode < SimpleExpressionToken , string > ;
481
+ Check . That ( child ) . IsNotNull ( ) ;
482
+ Check . That ( child . Name ) . IsEqualTo ( "hash-hash" ) ;
483
+ Check . That ( child . Children ) . CountIs ( 2 ) ;
484
+
485
+ result = parser . Parse ( "@@ 42" ) ;
486
+ Check . That ( result ) . IsOkParsing ( ) ;
487
+ Check . That ( result . Result ) . IsEqualTo ( "@@::42" ) ;
488
+ tree = result . SyntaxTree ;
489
+ syntaxTree = tree as SyntaxNode < SimpleExpressionToken , string > ;
490
+ Check . That ( syntaxTree ) . IsNotNull ( ) ;
491
+ Check . That ( syntaxTree . Children ) . CountIs ( 1 ) ;
492
+ Check . That ( syntaxTree . Name ) . IsEqualTo ( $ "{ nameof ( PrefixOperation ) } _expressions") ;
493
+ child = syntaxTree . Children [ 0 ] as SyntaxNode < SimpleExpressionToken , string > ;
494
+ Check . That ( child ) . IsNotNull ( ) ;
495
+ Check . That ( child . Name ) . IsEqualTo ( "at-at" ) ;
496
+ Check . That ( child . Children ) . CountIs ( 2 ) ;
497
+ }
433
498
}
434
499
}
0 commit comments