From 581be4f10df8c27df7ae545bcf715816f14c9677 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Tue, 30 Aug 2011 12:02:52 -0400 Subject: [PATCH] add "unit" top-level parsing target --- parser/nodes.py | 6 ++++++ parser/parserules.py | 20 ++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/parser/nodes.py b/parser/nodes.py index 998508c..4c08228 100644 --- a/parser/nodes.py +++ b/parser/nodes.py @@ -2,6 +2,8 @@ class Node(object): def __init__(self, children=None): self.children = children + if self.children is None: + self.children = [] class StatementNode(Node): def __init__(self, children=None): @@ -15,3 +17,7 @@ class CExprNode(ExprNode): def __init__(self, cstring): ExprNode.__init__(self) self.cstring = cstring + +class UnitNode(Node): + def __init__(self, children=None): + Node.__init__(self, children) diff --git a/parser/parserules.py b/parser/parserules.py index 4da62f9..9c72947 100644 --- a/parser/parserules.py +++ b/parser/parserules.py @@ -2,6 +2,22 @@ from lexrules import tokens from nodes import * +def p_unit(p): + 'unit : unit_items' + p[0] = UnitNode([p[1]]) + +def p_unit_items(p): + 'unit_items : unit_item unit_items' + p[0] = Node([p[1]] + p[2].children) + +def p_unit_items_empty(p): + 'unit_items : empty' + p[0] = p[1] + +def p_unit_item_c_stmt(p): + 'unit_item : c_expr SEMICOLON' + p[0] = p[1] + def p_statement(p): 'statement : expr SEMICOLON' p[0] = StatementNode([p[1]]) @@ -13,3 +29,7 @@ def p_expr(p): def p_c_expr(p): 'c_expr : C LPAREN STRING RPAREN' p[0] = CExprNode(p[3]) + +def p_empty(p): + 'empty :' + p[0] = Node()