Coming from this question, I now wanted to write an implementation of the parser.
// Handles * and /
private static void Summand(Scanner scanner, ref TermNode currentTree, ref Token currentToken)
{
Factor(scanner, ref currentTree, ref currentToken);
while (currentToken is OperatorToken && _multiplicationOperators.Contains(((OperatorToken)currentToken).OperatorChar)) // So long as the token is * or /
{
TermNode node = new TermNode(currentTree, null, currentToken);
currentTree = null;
scanner.MoveNext();
currentToken = scanner.Current;
Factor(scanner, ref currentTree, ref currentToken); // Handles ^
node.RightChild = currentTree;
currentTree = node;
}
}
// I think this one might be wrong...
private static void Factor(Scanner scanner, ref TermNode currentTree, ref Token currentToken)
{
Exponent(scanner, ref currentTree, ref currentToken);
while (currentToken is OperatorToken && ((OperatorToken)currentToken).OperatorChar == '^') // So long as the token is ^
{
TermNode node = new TermNode(currentTree, null, currentToken);
currentTree = null;
scanner.MoveNext();
currentToken = scanner.Current;
Exponent(scanner, ref currentTree, ref currentToken);
node.RightChild = currentTree;
currentTree = node;
}
}
private static void Exponent(Scanner scanner, ref TermNode currentTree, ref Token currentToken)
{
if (currentToken is BracketToken)
{
BracketToken bracketToken = (BracketToken)currentToken;
if (bracketToken.IsOpening)
{
scanner.MoveNext();
currentToken = scanner.Current;
Term(scanner, ref currentTree, ref currentToken);
if (currentToken is BracketToken && !((BracketToken)currentToken).IsOpening)
{
scanner.MoveNext();
currentToken = scanner.Current;
}
else
throw new ParseException("Unbalanced brackets!");
}
}
else
{
node = new TermNode(null, null, currentToken);
if (currentToken is OperatorToken)
{
currentTree = null;
scanner.MoveNext();
currentToken = scanner.Current;
Exponent(scanner, ref currentTree, ref currentToken, false);
node.RightChild = currentTree;
currentTree = node;
}
else if (currentToken is VariableToken || currentToken is ConstantToken)
{
currentTree = node;
scanner.MoveNext();
currentToken = scanner.Current;
}
else if (currentToken is FunctionToken)
{
currentTree = null;
scanner.MoveNext();
currentToken = scanner.Current;
Exponent(scanner, ref currentTree, ref currentToken, false);
node.RightChild = currentTree;
currentTree = node;
}
}
}
Now I was wondering how I would have to change this method in order to allow expressions such as 3(a+b)
... And also whether this approach and the function are the correct way to archieve this.