private void PassOperator(Lexema lexema) { while (PeekIsOperator()) { var peek = shuntingMachine.Peek(); bool lexemaIsUnar = lexema.Token == Token.Unar; bool peekIsUnar = peek.Token == Token.Unar; var lexemaPriority = DefaultOperator.GetPriority(lexema.Represents, lexemaIsUnar); var peekPriority = DefaultOperator.GetPriority(peek.Represents, peekIsUnar); var lexemaOrder = DefaultOperator.GetAssociativity(lexema.Represents, lexemaIsUnar); var peekOrder = DefaultOperator.GetAssociativity(peek.Represents, peekIsUnar); bool allowPass = lexemaOrder == Associativity.Left && lexemaPriority <= peekPriority || lexemaOrder == Associativity.Right && lexemaPriority < peekPriority; if (allowPass) { outSequence.Enqueue(shuntingMachine.Pop()); } else { break; } } shuntingMachine.Push(lexema); }
private void ProcessNextToken() { foreach (var rule in lexica.Rules) { var matched = rule.Matcher.Match(current.ExpressionString); if (matched > 0) { position += matched; var matchedString = current.ExpressionString.Substring(0, matched); var lexema = new Lexema(matchedString, rule.Token) { Position = position }; current.ExpressionString = current.ExpressionString.Substring(matched); current.LexicalQueue.AddLast(lexema); SwitchStateForReceived(lexema.Token); ProcessNextToken(); } } }
private void PassOperand(Lexema lexema) { outSequence.Enqueue(lexema); if (wereArguments.Count != 0 && !wereArguments.Peek()) { wereArguments.Pop(); wereArguments.Push(true); } }
private void PassFunction(Lexema lexema) { shuntingMachine.Push(lexema); var argsCount = MathWrapper.GetFunctorFor(lexema.Represents).ParamsCount; argumentsCountMachine.Push(argsCount); argumentsRecievedMachine.Push(0); if (wereArguments.Count != 0) { wereArguments.Pop(); wereArguments.Push(true); } wereArguments.Push(false); }
public Expression CreateCalculationStack() { variableToken = inner.DequeueHead(); assignOperatorToken = inner.DequeueHead(); if (type == typeof(Iterator)) { PresetIterator(); } else { PresetVariable(); } CreateAssignment(); ShuntExpression(); BuildExpression(); return(result); }
public static void EnqueueTail(this LinkedList <Lexema> list, Lexema lexema) => list.AddLast(lexema);
public static void EnqueueHead(this LinkedList <Lexema> list, Lexema lexema) => list.AddFirst(lexema);