aboutsummaryrefslogtreecommitdiff
path: root/examples/calc.g
diff options
context:
space:
mode:
authorsienkiew <sienkiew@d34015c8-bcbb-4646-8ac8-8ba5febf221d>2011-07-21 11:17:58 -0400
committersienkiew <sienkiew@d34015c8-bcbb-4646-8ac8-8ba5febf221d>2011-07-21 11:17:58 -0400
commitbe5a70d3aa1c30d7c86d77649b747de2838566ce (patch)
tree7c27103a4d37b61f5dba748672f0685536e667d0 /examples/calc.g
parent77ce1e78848ba9eead2566e3bc55523aab4547e8 (diff)
downloadexyapps-be5a70d3aa1c30d7c86d77649b747de2838566ce.tar.gz
initial import of yapps from debian sources
git-svn-id: http://svn.stsci.edu/svn/ssb/etal/exyapps/trunk@356 d34015c8-bcbb-4646-8ac8-8ba5febf221d
Diffstat (limited to 'examples/calc.g')
-rw-r--r--examples/calc.g64
1 files changed, 64 insertions, 0 deletions
diff --git a/examples/calc.g b/examples/calc.g
new file mode 100644
index 0000000..5432855
--- /dev/null
+++ b/examples/calc.g
@@ -0,0 +1,64 @@
+globalvars = {} # We will store the calculator's variables here
+
+def lookup(map, name):
+ for x,v in map:
+ if x == name: return v
+ if not globalvars.has_key(name): print 'Undefined (defaulting to 0):', name
+ return globalvars.get(name, 0)
+
+def stack_input(scanner,ign):
+ """Grab more input"""
+ scanner.stack_input(raw_input(">?> "))
+
+%%
+parser Calculator:
+ ignore: "[ \r\t\n]+"
+ ignore: "[?]" {{ stack_input }}
+
+ token END: "$"
+ token NUM: "[0-9]+"
+ token VAR: "[a-zA-Z_]+"
+
+ # Each line can either be an expression or an assignment statement
+ rule goal: expr<<[]>> END {{ print '=', expr }}
+ {{ return expr }}
+ | "set" VAR expr<<[]>> END {{ globalvars[VAR] = expr }}
+ {{ print VAR, '=', expr }}
+ {{ return expr }}
+
+ # An expression is the sum and difference of factors
+ rule expr<<V>>: factor<<V>> {{ n = factor }}
+ ( "[+]" factor<<V>> {{ n = n+factor }}
+ | "-" factor<<V>> {{ n = n-factor }}
+ )* {{ return n }}
+
+ # A factor is the product and division of terms
+ rule factor<<V>>: term<<V>> {{ v = term }}
+ ( "[*]" term<<V>> {{ v = v*term }}
+ | "/" term<<V>> {{ v = v/term }}
+ )* {{ return v }}
+
+ # A term is a number, variable, or an expression surrounded by parentheses
+ rule term<<V>>:
+ NUM {{ return int(NUM) }}
+ | VAR {{ return lookup(V, VAR) }}
+ | "\\(" expr "\\)" {{ return expr }}
+ | "let" VAR "=" expr<<V>> {{ V = [(VAR, expr)] + V }}
+ "in" expr<<V>> {{ return expr }}
+%%
+if __name__=='__main__':
+ print 'Welcome to the calculator sample for Yapps 2.'
+ print ' Enter either "<expression>" or "set <var> <expression>",'
+ print ' or just press return to exit. An expression can have'
+ print ' local variables: let x = expr in expr'
+ # We could have put this loop into the parser, by making the
+ # `goal' rule use (expr | set var expr)*, but by putting the
+ # loop into Python code, we can make it interactive (i.e., enter
+ # one expression, get the result, enter another expression, etc.)
+ while 1:
+ try: s = raw_input('>>> ')
+ except EOFError: break
+ if not s.strip(): break
+ parse('goal', s)
+ print 'Bye.'
+