1# -----------------------------------------------------------------------------
2# lex_closure.py
3# -----------------------------------------------------------------------------
4import sys
5
6if ".." not in sys.path: sys.path.insert(0,"..")
7import ply.lex as lex
8
9tokens = (
10        'NAME','NUMBER',
11        'PLUS','MINUS','TIMES','DIVIDE','EQUALS',
12        'LPAREN','RPAREN',
13        )
14
15def make_calc():
16
17    # Tokens
18
19    t_PLUS    = r'\+'
20    t_MINUS   = r'-'
21    t_TIMES   = r'\*'
22    t_DIVIDE  = r'/'
23    t_EQUALS  = r'='
24    t_LPAREN  = r'\('
25    t_RPAREN  = r'\)'
26    t_NAME    = r'[a-zA-Z_][a-zA-Z0-9_]*'
27
28    def t_NUMBER(t):
29        r'\d+'
30        try:
31            t.value = int(t.value)
32        except ValueError:
33            print("Integer value too large %s" % t.value)
34            t.value = 0
35        return t
36
37    t_ignore = " \t"
38
39    def t_newline(t):
40        r'\n+'
41        t.lineno += t.value.count("\n")
42
43    def t_error(t):
44        print("Illegal character '%s'" % t.value[0])
45        t.lexer.skip(1)
46
47    # Build the lexer
48    return lex.lex()
49
50make_calc()
51lex.runmain(data="3+4")
52
53
54
55