X-Git-Url: https://code.kerkeslager.com/?p=fur;a=blobdiff_plain;f=parsing.py;h=f2198adaa65defe537b3dc49473565db7158f0c4;hp=e2bd9d0681f9cbd13bae8cb0493d40b22769c134;hb=a96e96f3f783930707122f691cd6a08a90416a74;hpb=ad72a3204cb66766dcebb847b42512494199d15a diff --git a/parsing.py b/parsing.py index e2bd9d0..f2198ad 100644 --- a/parsing.py +++ b/parsing.py @@ -74,6 +74,15 @@ FurInfixExpression = collections.namedtuple( ], ) +FurIfExpression = collections.namedtuple( + 'FurIfExpression', + [ + 'condition_expression', + 'if_statement_list', + 'else_statement_list', + ], +) + def _integer_literal_expression_parser(index, tokens): failure = (False, index, None) @@ -315,7 +324,57 @@ def _function_call_expression_parser(index, tokens): return True, index, function -_expression_parser = _or_level_expression_parser +def _if_expression_parser(index, tokens): + failure = (False, index, None) + + if tokens[index].match == 'if': + index += 1 + else: + return failure + + success, index, condition_expression = _or_level_expression_parser(index, tokens) + + if not success: + raise Exception('Expected condition after "if" on line {}'.format(tokens[index].line)) + + if tokens[index].match == 'do': + index += 1 + else: + raise Exception('Expected "do" after "if" on line {}'.format(tokens[index].line)) + + + success, index, if_statement_list = _zero_or_more_parser(tuple, _statement_parser)(index, tokens) + _, index, _ = consume_newlines(index, tokens) + + if tokens[index].match == 'else': + index += 1 + success, index, else_statement_list = _zero_or_more_parser(tuple, _statement_parser)(index, tokens) + _, index, _ = consume_newlines(index, tokens) + else: + else_statement_list = () + + if tokens[index].match == 'end': + index += 1 + else: + raise Exception('Expected "end" after "if" on line {}'.format(tokens[index].line)) + + return ( + True, + index, + FurIfExpression( + condition_expression=condition_expression, + if_statement_list=if_statement_list, + else_statement_list=else_statement_list, + ), + ) + + + + +_expression_parser = _or_parser( + _or_level_expression_parser, + _if_expression_parser, # This should always be at the top level +) def _expression_statement_parser(index, tokens): failure = (False, index, None)