Skip to content

Commit dcacb3f

Browse files
committed
many node names for same precedence level
1 parent b615229 commit dcacb3f

File tree

4 files changed

+72
-9
lines changed

4 files changed

+72
-9
lines changed

src/sly/parser/parser/llparser/bnf/RecursiveDescentSyntaxParser.Expressions.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,10 @@ protected SyntaxNode<IN, OUT> ManageExpressionRules(Rule<IN, OUT> rule, SyntaxNo
4444
node.Visitor = operation.VisitorMethod;
4545
node.LambdaVisitor = operation.LambdaVisitor;
4646
node.Operation = operation;
47-
node.Name = operation.NodeName;
47+
if (!string.IsNullOrEmpty(operation.NodeName))
48+
{
49+
node.Name = operation.NodeName;
50+
}
4851
}
4952
}
5053
break;

src/sly/parser/parser/llparser/ebnf/EBNFRecursiveDescentSyntaxParser.Expressions.cs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,6 @@ public virtual SyntaxParseResult<IN, OUT> ParseInfixExpressionRule(IList<Token<I
3737
var second = rule.Clauses[1];
3838
SyntaxParseResult<IN, OUT> secondResult = null;
3939

40-
var op = tokens[position];
41-
string key = op.TokenID.ToString();
42-
if (op.IsExplicit)
43-
{
44-
key = op.Value.ToString();
45-
}
46-
operation = rule.GetOperation(key);
47-
4840
switch (second)
4941
{
5042
case ChoiceClause<IN, OUT> secondChoice:

src/sly/parser/syntax/grammar/Rule.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ public Rule()
2525

2626
public string[] SubNodeNames { get; set; } = null;
2727

28+
private Dictionary<string,string> NodeNamesMap { get; set; } = new Dictionary<string, string>();
29+
2830
public bool IsByPassRule { get; set; } = false;
2931

3032
// visitors for operation rules
@@ -197,6 +199,7 @@ public void SetVisitor(Func<object[],OUT> visitorLambda)
197199

198200
public void SetVisitor(OperationMetaData<IN, OUT> operation)
199201
{
202+
NodeNamesMap[operation.Operatorkey] = operation.NodeName;
200203
if (operation.VisitorMethod != null)
201204
VisitorMethodsForOperation[operation.Operatorkey] = operation;
202205
else if (operation.LambdaVisitor != null)

tests/ParserTests/ExpressionGeneratorTests.cs

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using Xunit;
1010
using ParserTests.Issue184;
1111
using sly.parser.generator.visitor;
12+
using sly.parser.syntax.tree;
1213
using ExpressionToken = expressionparser.ExpressionToken;
1314

1415
namespace ParserTests
@@ -26,6 +27,32 @@ public double BinaryTermExpression(double left, Token<ExpressionToken> operation
2627
}
2728

2829
}
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+
}
2956

3057
public class ExpressionGeneratorExplicitOperatorAsNames
3158
{
@@ -48,6 +75,7 @@ public double BinaryTermExpression(double left, Token<SimpleExpressionToken> ope
4875
}
4976

5077
[Prefix((int) SimpleExpressionToken.MINUS, Associativity.Right, 100)]
78+
[NodeName("hash-hash")]
5179
public double PreFixExpression(Token<SimpleExpressionToken> operation, double value)
5280
{
5381
return -value;
@@ -430,5 +458,42 @@ public void TestExplicitOperatorAsNames()
430458
Check.That(result).IsOkParsing();
431459
Check.That(result.Result).IsEqualTo(-1+2*(5+6)-4);
432460
}
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+
}
433498
}
434499
}

0 commit comments

Comments
 (0)