def p_while(p): '''while : WHILE expression DO block''' p[0] = ast.WhileNode(expression=p[2], block=p[4])
def p_stmt_while(p): """stmt : WHILE LROUND condn RROUND LCURLY stmt_list RCURLY""" p[0] = ast.WhileNode(p[3], p[6])
def p_Whileblock(p): 'statement : WHILE LPAREN expression RPAREN block' # print("in while grammar") p[0] = tree.WhileNode(p[3], p[5])
def parse_statement(self): token = self.get_current_token() if token.is_type(): lookup2 = self.lookup_for_n(2) if lookup2.word == ';': return self.parse_var_decl() elif lookup2.word == '=': return self.parse_var_decl_and_assign() elif lookup2.word == '[': lookup5 = self.lookup_for_n(5) if lookup5.word == '=': return self.parse_array_decl_and_assign() elif lookup5.word == ';': return self.parse_array_decl() else: raise cmexception.SyntaxException(lookup5, ['=', ';']) else: raise cmexception.SyntaxException(lookup2, [';', '=', '[']) elif token.lexme_type == LexmeType.Variable: lookup1 = self.lookup_for_n(1) if lookup1.word == '[': return self.parse_array_assign() elif lookup1.word == '=': return self.parse_var_assign() elif lookup1.word == '(': node = self.parse_function_call() self.move_for_n(1) return node else: raise cmexception.SyntaxException(lookup1, ['=', '[']) elif token.word == '{': self.move_for_n(1) nodes = self.parse_stmtlist() right_bracket = self.get_current_token() if right_bracket.word == '}': self.move_for_n(1) return nodes else: raise cmexception.SyntaxException(right_bracket, ['}']) elif token.word == 'if': left_brace = self.move_for_n(1) if left_brace.word == '(': self.move_for_n(1) condition_expr = self.parse_expr() right_brace = self.get_current_token() if right_brace.word == ')': self.move_for_n(1) if_node = ast.IfNode(self.context, self.parse_statement()) else_node = self.parse_else_statement() return ast.IfElseNode(self.context, condition_expr, if_node, else_node) else: raise cmexception.SyntaxException(right_brace, [')']) else: raise cmexception.SyntaxException(left_brace, ['(']) elif token.word == 'while': left_brace = self.lookup_for_n(1) if left_brace.word == '(': self.move_for_n(2) expr_node = self.parse_expr() right_brace = self.get_current_token() if right_brace.word == ')': self.move_for_n(1) stmtnode = self.parse_statement() return ast.WhileNode(self.context, expr_node, stmtnode) else: raise cmexception.SyntaxException(right_brace, [')']) else: raise cmexception.SyntaxException(left_brace, ['(']) elif token.word == 'return': s = self.move_for_n(1) if s.word == ';': self.move_for_n(1) return ast.ReturnNode(self.context, token, None) else: node = self.parse_expr_or_string() if self.get_current_token().word == ';': self.move_for_n(1) return ast.ReturnNode(self.context, token, node) else: return cmexception.SyntaxException( self.get_current_token(), [';']) else: raise cmexception.SyntaxException( token, ['<legal identifier>', 'while', 'return', 'if', '<type>'])
def p_structure(p): ''' structure : WHILE expression "{" program "}" ''' p[0] = ast.WhileNode([p[2], p[4]])