20
20
switch (parseNode.Kind)
22
case ParseNodeKind.Operation:
23
return FromOperationParseNode(parseNode);
24
case ParseNodeKind.FunctionCall:
25
return FromFunctionCallParseNode(parseNode);
22
case ParseNodeKind.PrefixOperator:
23
return FromPrefixCallParseNode(parseNode);
24
case ParseNodeKind.InfixOperator:
25
return FromInfixOperatorParseNode(parseNode);
26
case ParseNodeKind.PostfixOperator:
27
return FromPostfixOperatorParseNode(parseNode);
26
28
case ParseNodeKind.Token:
27
29
return new ExpressionNode(parseNode.Token.Symbol, parseNode.Token.Value);
34
public static ExpressionNode FromOperationParseNode(ParseNode parseNode)
36
public static ExpressionNode FromPrefixCallParseNode(ParseNode parseNode)
36
38
if (parseNode.Children.Count == 1)
38
40
return FromParseNode(parseNode.Children[0]);
40
else if (parseNode.Children.Count == 3)
42
var node = new ExpressionNode(parseNode.Children[1].Token.Symbol, new[] {
43
FromParseNode(parseNode.Children[0]), FromParseNode(parseNode.Children[2])});
48
throw new InvalidOperationException(string.Format(
49
errMsgWrongNumberOfChildren, parseNode.Kind, parseNode.Children.Count));
53
public static ExpressionNode FromFunctionCallParseNode(ParseNode parseNode)
55
if (parseNode.Children.Count >= 2)
42
else if (parseNode.Children.Count >= 2)
57
44
var children = new List<ExpressionNode>(parseNode.Children.Count - 1);
58
45
var arguments = new List<ExpressionNode>(parseNode.Children.Count - 1);
73
60
errMsgWrongNumberOfChildren, parseNode.Kind, parseNode.Children.Count));
64
public static ExpressionNode FromInfixOperatorParseNode(ParseNode parseNode)
66
if (parseNode.Children.Count == 1)
68
return FromParseNode(parseNode.Children[0]);
70
else if (parseNode.Children.Count == 3)
72
var node = new ExpressionNode(parseNode.Children[1].Token.Symbol, new[] {
73
FromParseNode(parseNode.Children[0]), FromParseNode(parseNode.Children[2])});
78
throw new InvalidOperationException(string.Format(
79
errMsgWrongNumberOfChildren, parseNode.Kind, parseNode.Children.Count));
83
public static ExpressionNode FromPostfixOperatorParseNode(ParseNode parseNode)
85
if (parseNode.Children.Count == 1)
87
return FromParseNode(parseNode.Children[0]);
89
else if (parseNode.Children.Count >= 2)
91
var children = new List<ExpressionNode>(parseNode.Children.Count - 1);
92
ParseNode childParseNode;
93
for (int i = 0; i < parseNode.Children.Count - 1; i++)
95
childParseNode = parseNode.Children[i];
96
children.Add(FromParseNode(childParseNode));
98
return new ExpressionNode(parseNode.Children[parseNode.Children.Count - 1].Token.Symbol, children);
102
throw new InvalidOperationException(string.Format(
103
errMsgWrongNumberOfChildren, parseNode.Kind, parseNode.Children.Count));