Commit 08653e36 authored by Igor Dejanovic's avatar Igor Dejanovic

Changed calc example grammar. Removed logging module from calc example.

parent f594984b
......@@ -13,29 +13,36 @@
from arpeggio import *
from arpeggio.export import PMDOTExport, PTDOTExport
from arpeggio import RegExMatch as _
import logging
def number(): return _(r'\d*\.\d*|\d+')
def factor(): return [number, ("(", expression, ")")]
def factor(): return Optional(["+","-"]), [number,
("(", expression, ")")]
def term(): return factor, ZeroOrMore(["*","/"], factor)
def expression(): return Optional(["+","-"]), term, ZeroOrMore(["+", "-"], term)
def calc(): return expression, EndOfFile
def expression(): return term, ZeroOrMore(["+", "-"], term)
def calc(): return OneOrMore(expression), EndOfFile
# Semantic actions
class ToFloat(SemanticAction):
'''Converts node value to float.'''
def first_pass(self, parser, node, nodes):
logging.debug("Converting %s." % node.value)
print "Converting %s." % node.value
return float(node.value)
class Factor(SemanticAction):
'''Removes parenthesis if exists and returns what was contained inside.'''
def first_pass(self, parser, node, nodes):
logging.debug("Factor %s" % nodes)
if nodes[0] == "(":
return nodes[1]
else:
print "Factor %s" % nodes
if len(nodes) == 1:
return nodes[0]
sign = -1 if nodes[0] == '-' else 1
next = 0
if nodes[0] in ['+', '-']:
next = 1
if nodes[next] == '(':
return sign * nodes[next+1]
else:
return sign * nodes[next]
class Term(SemanticAction):
'''
......@@ -43,14 +50,14 @@ class Term(SemanticAction):
Factor nodes will be already evaluated.
'''
def first_pass(self, parser, node, nodes):
logging.debug("Term %s" % nodes)
print "Term %s" % nodes
term = nodes[0]
for i in range(2, len(nodes), 2):
if nodes[i-1]=="*":
term *= nodes[i]
else:
term /= nodes[i]
logging.debug("Term = %f" % term)
print "Term = %f" % term
return term
class Expr(SemanticAction):
......@@ -59,7 +66,7 @@ class Expr(SemanticAction):
Term nodes will be already evaluated.
'''
def first_pass(self, parser, node, nodes):
logging.debug("Expression %s" % nodes)
print "Expression %s" % nodes
expr = 0
start = 0
# Check for unary + or - operator
......@@ -72,7 +79,7 @@ class Expr(SemanticAction):
else:
expr += nodes[i]
logging.debug("Expression = %f" % expr)
print "Expression = %f" % expr
return expr
class Calc(SemanticAction):
......@@ -88,8 +95,6 @@ calc.sem = Calc()
if __name__ == "__main__":
try:
logging.basicConfig(level=logging.DEBUG)
# First we will make a parser - an instance of the calc parser model.
# Parser model is given in the form of python constructs therefore we
# are using ParserPython class.
......
......@@ -24,9 +24,10 @@ from calc import ToFloat, Factor, Term, Expr, Calc
# Grammar is defined using textual specification based on PEG language.
calc_grammar = """
number <- r'\d*\.\d*|\d+';
factor <- number / "(" expression ")";
factor <- ("+" / "-")?
(number / "(" expression ")");
term <- factor (( "*" / "/") factor)*;
expression <- ("+" / "-")? term (("+" / "-") term)*;
expression <- term (("+" / "-") term)*;
calc <- expression EndOfFile;
"""
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment