public static ADVariableAssignment IDAssign(bool dereference) { var token = MainFSM.GetNextToken(); if (token.Type != TokenType.idType) { ParserFunctions.SyntaxError("Byla ocekavana promenna."); } var record = ParserFunctions.STSearch(token.Attribute); if (record == null) { ParserFunctions.SemanticError($"Promenna {token.Attribute} nebyla deklarovana"); } var asgnOperator = MainFSM.GetNextToken(); if (!IsAssignOperator(asgnOperator.Type)) { ParserFunctions.SyntaxError("Byl ocekavan prirazovaci operator"); } var assign = new ADVariableAssignment() { Dereference = dereference, STRecord = record, AssignOperator = asgnOperator.Type }; bool nextDereference = false; if (MainFSM.PeekNextToken().Type == TokenType.starType) { nextDereference = true; MainFSM.GetNextToken(); } if (MainFSM.PeekNextToken().Type == TokenType.idType) { if (IsAssignOperator(MainFSM.PeekNextToken(2).Type)) { assign.Expression = IDAssign(nextDereference); } else { assign.Expression = PrecedenceSyntaxAnalysis.Precedence(TokenType.semiType); } } else { assign.Expression = PrecedenceSyntaxAnalysis.Precedence(TokenType.semiType); } return(assign); }
public static void PrintVariableAssignment(ADVariableAssignment asgn, string tab) { Console.WriteLine($"{tab}|- Assign:"); if (asgn.STRecord != null) { Console.WriteLine($"{tab}|\tName: {asgn.STRecord.Name}"); } Console.WriteLine($"{tab}|\tOperator: {asgn.AssignOperator}"); if (asgn.Expression != null) { Console.WriteLine($"{tab}|\tExpression:"); PrintExpression(asgn.Expression, tab + "\t\t"); } if (asgn.Dereference) { Console.WriteLine($"{tab}|\tType: Dereference"); } }