70 lines
1.1 KiB
Python
70 lines
1.1 KiB
Python
import ply.lex as lex
|
|
|
|
tokens = (
|
|
'INTEGER',
|
|
'FLOAT',
|
|
'ADD_OP',
|
|
'MUL_OP',
|
|
'BRACKET',
|
|
)
|
|
|
|
def t_BRACKET(t):
|
|
r'\(|\)'
|
|
if t.value == '(':
|
|
t.value = "L"
|
|
else:
|
|
t.value = "R"
|
|
return t
|
|
|
|
def t_MUL_OP(t):
|
|
r'\*|/'
|
|
return t
|
|
|
|
|
|
def t_ADD_OP(t):
|
|
r'\+|-'
|
|
return t
|
|
|
|
|
|
def t_FLOAT(t):
|
|
r'\d+\.\d*'
|
|
t.value = float(t.value)
|
|
return t
|
|
|
|
def t_INTEGER(t):
|
|
r'\d+'
|
|
t.value = int(t.value)
|
|
return t
|
|
|
|
|
|
def t_newline(t):
|
|
r'\n+'
|
|
t.lexer.lineno += len(t.value)
|
|
|
|
|
|
t_ignore = ' |\t'
|
|
|
|
|
|
def t_error(t):
|
|
print("Illegalcharacter '%s'" %t.value[0])
|
|
t.lexer.skip(1)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
import sys
|
|
lexer = lex.lex()
|
|
lexer.input(sys.stdin.read())
|
|
lb = 0
|
|
for token in lexer:
|
|
if token.type == "BRACKET":
|
|
if token.value == "L":
|
|
lb += 1
|
|
else:
|
|
lb -= 1
|
|
if lb < 0:
|
|
print("BRACKET missing")
|
|
|
|
print("line %d : %s (%s) " % (token.lineno, token.type, token.value))
|
|
if lb != 0:
|
|
print("BRACKET missing")
|