Skip to content

Commit da3356c

Browse files
authored
Merge pull request EvilBeaver#1651 from Mr-Rm/v2/optim-parser
Приоритет операторов вместо рекурсивного спуска, другие исправления и оптимизации
2 parents cf3aff3 + 43aac75 commit da3356c

10 files changed

Lines changed: 377 additions & 416 deletions

File tree

src/OneScript.Language/LanguageDef.cs

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,31 @@ public static Token GetToken(string tokText)
282282
public static int GetPriority(Token op)
283283
{
284284
return _priority[op];
285-
}
285+
}
286+
287+
public static int GetBinaryPriority(Token op)
288+
{
289+
return IsBinaryOperator(op) ? _priority[op] : -1;
290+
}
291+
292+
public static int GetUnaryPriority(Token op)
293+
{
294+
return op switch
295+
{
296+
Token.OpenPar => MAX_OPERATION_PRIORITY + 1,
297+
298+
Token.Not => _priority[op],
299+
Token.UnaryMinus => _priority[op],
300+
Token.UnaryPlus => _priority[op],
301+
302+
Token.Minus => _priority[Token.UnaryMinus],
303+
Token.Plus => _priority[Token.UnaryPlus],
304+
305+
_ => MAX_OPERATION_PRIORITY
306+
};
307+
}
308+
309+
286310

287311
[MethodImpl(MethodImplOptions.AggressiveInlining)]
288312
public static bool IsBuiltInFunction(Token token)

src/OneScript.Language/SyntaxAnalysis/AstNodes/BinaryOperationNode.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,13 @@ public BinaryOperationNode(Lexem operation) : base(NodeKind.BinaryOperation, ope
1717
{
1818
Operation = operation.Token;
1919
}
20+
21+
public BinaryOperationNode(BslSyntaxNode firstArg, BslSyntaxNode secondArg, Lexem operation)
22+
: base(NodeKind.BinaryOperation, operation)
23+
{
24+
Operation = operation.Token;
25+
AddChild(firstArg);
26+
AddChild(secondArg);
27+
}
2028
}
2129
}

src/OneScript.Language/SyntaxAnalysis/AstNodes/ConditionNode.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public ConditionNode(Lexem startLexem) : base(NodeKind.Condition, startLexem)
2626
public IEnumerable<BslSyntaxNode> GetAlternatives()
2727
{
2828
if(_alternativesStart == 0)
29-
return new BslSyntaxNode[0];
29+
return System.Array.Empty<BslSyntaxNode>();
3030

3131
return Children
3232
.Skip(_alternativesStart)

src/OneScript.Language/SyntaxAnalysis/AstNodes/LineMarkerNode.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,6 @@ public LineMarkerNode(CodeRange location, NodeKind kind)
1818
Kind = kind;
1919
}
2020

21-
public override IReadOnlyList<BslSyntaxNode> Children => new BslSyntaxNode[0];
21+
public override IReadOnlyList<BslSyntaxNode> Children => System.Array.Empty<BslSyntaxNode>();
2222
}
2323
}

src/OneScript.Language/SyntaxAnalysis/AstNodes/MethodNode.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public MethodNode() : base(NodeKind.Method)
3030
public IReadOnlyList<VariableDefinitionNode> VariableDefinitions()
3131
{
3232
if (VariableSection == default)
33-
return new VariableDefinitionNode[0];
33+
return System.Array.Empty<VariableDefinitionNode>();
3434

3535
return VariableSection.Children
3636
.Cast<VariableDefinitionNode>()

src/OneScript.Language/SyntaxAnalysis/AstNodes/MethodSignatureNode.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public IEnumerable<MethodParameterNode> GetParameters()
2828
{
2929
var paramList = Children.FirstOrDefault(x => x.Kind == NodeKind.MethodParameters);
3030
if (paramList == default)
31-
return new MethodParameterNode[0];
31+
return System.Array.Empty<MethodParameterNode>();
3232

3333
return ((NonTerminalNode) paramList).Children.Cast<MethodParameterNode>();
3434
}

src/OneScript.Language/SyntaxAnalysis/AstNodes/TerminalNode.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@ public TerminalNode(NodeKind kind, Lexem lexem)
2626
Location = lexem.Location;
2727
}
2828

29-
public override IReadOnlyList<BslSyntaxNode> Children => EmptyChildren;
30-
31-
private static readonly BslSyntaxNode[] EmptyChildren = new BslSyntaxNode[0];
29+
public override IReadOnlyList<BslSyntaxNode> Children => System.Array.Empty<BslSyntaxNode>();
3230
}
3331
}

src/OneScript.Language/SyntaxAnalysis/AstNodes/UnaryOperationNode.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,12 @@ public class UnaryOperationNode : NonTerminalNode
1616
public UnaryOperationNode(Lexem operation) : base(NodeKind.UnaryOperation, operation)
1717
{
1818
Operation = operation.Token;
19-
}
19+
}
20+
21+
public UnaryOperationNode(BslSyntaxNode arg, Lexem operation) : base(NodeKind.UnaryOperation, operation)
22+
{
23+
Operation = operation.Token;
24+
AddChild(arg);
25+
}
2026
}
2127
}

0 commit comments

Comments
 (0)