def build(s_exp): ''' Build Domain AST from the given S-expression ''' assert_node(s_exp, s_expression.List) assert_child(s_exp, 0, s_expression.Symbol, lex_token.DOMAIN) name_expr = assert_child(s_exp, 1, s_expression.Symbol) domain = node_type.Domain() domain.name = lex_token.fixup_name(name_expr.text) for child_expr in s_exp.children[2:]: assert_node(child_expr, s_expression.List) symbol = assert_child(child_expr, 0, s_expression.Symbol) if symbol.text == lex_token.METHOD: method = build_method(child_expr) domain.children.append(method) domain.method_map[method.name] = method if symbol.text == lex_token.MODULE: module_name = assert_child(child_expr, 1, s_expression.Symbol).text if len(child_expr.children) == 3: symbol_name = assert_child(child_expr, 2, s_expression.Symbol).text else: symbol_name = None domain.modules.append((module_name, symbol_name)) if lex_token.is_constant(symbol.text): rhs_expr = assert_child(child_expr, 1, [s_expression.List, s_expression.Symbol, s_expression.Number]) domain.constants[symbol.text] = term.build(rhs_expr) return domain
def build(s_expr): node = node_type.Term() if match_node(s_expr, s_expression.List): assert_child(s_expr, 0, s_expression.Symbol, [lex_token.CALL, lex_token.VAR_REF]) if match_child(s_expr, 0, s_expression.Symbol, lex_token.CALL): node.term_type = node_type.TERM_CALL node.name = assert_child(s_expr, 1, s_expression.Symbol).text for child_expr in s_expr.children[2:]: child_node = build(child_expr) node.children.append(child_node) return node if match_child(s_expr, 0, s_expression.Symbol, lex_token.VAR_REF): node.term_type = node_type.TERM_VAR_REF node.name = assert_child(s_expr, 1, s_expression.Symbol).text return node if match_node(s_expr, s_expression.Number): node.name = s_expr.value node.term_type = node_type.TERM_NUMBER return node if match_node(s_expr, s_expression.Symbol): node.name = s_expr.text if lex_token.is_variable(s_expr.text): node.term_type = node_type.TERM_VAR return node if lex_token.is_constant(s_expr.text): node.term_type = node_type.TERM_CONST_REF return node node.term_type = node_type.TERM_SYMBOL return node
def build(s_exp): ''' Build Domain AST from the given S-expression ''' assert_node(s_exp, s_expression.List) assert_child(s_exp, 0, s_expression.Symbol, lex_token.DOMAIN) name_expr = assert_child(s_exp, 1, s_expression.Symbol) domain = node_type.Domain() domain.name = lex_token.fixup_name(name_expr.text) for child_expr in s_exp.children[2:]: assert_node(child_expr, s_expression.List) symbol = assert_child(child_expr, 0, s_expression.Symbol) if symbol.text == lex_token.METHOD: method = build_method(child_expr) domain.children.append(method) domain.method_map[method.name] = method if symbol.text == lex_token.MODULE: module_name = assert_child(child_expr, 1, s_expression.Symbol).text if len(child_expr.children) == 3: symbol_name = assert_child(child_expr, 2, s_expression.Symbol).text else: symbol_name = None domain.modules.append((module_name, symbol_name)) if lex_token.is_constant(symbol.text): rhs_expr = assert_child( child_expr, 1, [s_expression.List, s_expression.Symbol, s_expression.Number]) domain.constants[symbol.text] = term.build(rhs_expr) return domain