done documenting

This commit is contained in:
hellerve
2015-07-11 23:37:51 +02:00
parent e7d02e0e92
commit 6dd5fe7be9

View File

@@ -18,11 +18,25 @@ BOOLEAN_PRECEDENCE = [
#Helper #Helper
def precedence(value_parser, precedences, combine): def precedence(value_parser, precedences, combine):
"""
Given a parser, a list of precedenses and
a combination function, it build a parser
matching the precedences.
value_parser -- the parser
precedences -- the list (possibly nested) of
operators, ordered by precedences
combine -- the combination function
returns -- a parser able to parse any operator
given, respecting its' respective
precedence
"""
def op_parser(precedence): def op_parser(precedence):
return any_op_in_list(precedence) ^ combine return any_op_in_list(precedence) ^ combine
parser = value_parser * op_parser(precedences[0]) parser = value_parser * op_parser(precedences[0])
for precedence in precedences[1:]: for prec in precedences[1:]:
parser = parser * op_parser(precedence) parser = parser * op_parser(prec)
return parser return parser
def process_binop(op): def process_binop(op):
@@ -71,6 +85,14 @@ def process_logic(op):
raise RuntimeError('unknown logic operator: ' + op) raise RuntimeError('unknown logic operator: ' + op)
def process_group(parsed): def process_group(parsed):
"""
Takes a tuple of the form ((foo, important), bar)
and only returns the important part.
parsed -- a tuple of the form ((foo, important), bar)
returns -- the middle part (denoted as important)
"""
((_, p), _) = parsed ((_, p), _) = parsed
return p return p
@@ -118,6 +140,11 @@ def arithmetic_value():
(imp_id ^ (lambda v: VarArithmeticExp(v)))) (imp_id ^ (lambda v: VarArithmeticExp(v))))
def read_statement(): def read_statement():
"""
Builds a parser for read statements.
returns -- a parser for read statements
"""
def internal(parsed): def internal(parsed):
return ReadStatement() return ReadStatement()
return keyword('read') ^ internal return keyword('read') ^ internal
@@ -184,12 +211,22 @@ def boolean_exp():
process_logic) process_logic)
def assign_statement(): def assign_statement():
"""
Builds a parser for assignment statements.
returns -- a parser for assignment statements
"""
def internal(parsed): def internal(parsed):
((name, _), exp) = parsed ((name, _), exp) = parsed
return AssignStatement(name, exp) return AssignStatement(name, exp)
return imp_id + keyword(':=') + arithmetic_exp() ^ internal return imp_id + keyword(':=') + arithmetic_exp() ^ internal
def if_statement(): def if_statement():
"""
Builds a parser for if statements.
returns -- a parser for if statements
"""
def internal(parsed): def internal(parsed):
(((((_, condition), _), on_true), false_parsed), _) = parsed (((((_, condition), _), on_true), false_parsed), _) = parsed
if false_parsed: if false_parsed:
@@ -203,6 +240,11 @@ def if_statement():
+ keyword('end') ^ internal) + keyword('end') ^ internal)
def while_statement(): def while_statement():
"""
Builds a parser for while statements.
returns -- a parser for while statements
"""
def internal(parsed): def internal(parsed):
((((_, condition), _), body), _) = parsed ((((_, condition), _), body), _) = parsed
return WhileStatement(condition, body) return WhileStatement(condition, body)