1# -----------------------------------------------------------------------------
2# lex_optimize.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
15# Tokens
16
17t_PLUS    = r'\+'
18t_MINUS   = r'-'
19t_TIMES   = r'\*'
20t_DIVIDE  = r'/'
21t_EQUALS  = r'='
22t_LPAREN  = r'\('
23t_RPAREN  = r'\)'
24t_NAME    = r'[a-zA-Z_][a-zA-Z0-9_]*'
25
26def t_NUMBER(t):
27    r'\d+'
28    try:
29        t.value = int(t.value)
30    except ValueError:
31        print("Integer value too large %s" % t.value)
32        t.value = 0
33    return t
34
35t_ignore = " \t"
36
37def t_newline(t):
38    r'\n+'
39    t.lineno += t.value.count("\n")
40
41def t_error(t):
42    print("Illegal character '%s'" % t.value[0])
43    t.lexer.skip(1)
44
45# Build the lexer
46lex.lex(optimize=1)
47lex.runmain(data="3+4")
48
49
50
51