( LETTER, DIGIT, POINT, OTHER, POWER, PLUS, MINUS ) = ( 0, 1, 2, 3, 4, 5, 6 )
( END, NULL ) = ( -1, -1 )
( ICON, FCON ) = ( 0, 0 )
w = n = p = e = d = 0
digit_arr = [ str( i ) for i in range( 10 ) ]
graph = {
0 : {
DIGIT : [ "n = 0; p = 0; e = 1; w = d", 1 ],
POINT : [ "w = 0; n = 0; p = 0; e = 1", 3 ],
OTHER : [ "ERROR()", NULL ]
},
1 : {
DIGIT : [ "w = w * 10 + d", 1 ],
POINT : [ "", 2 ],
POWER : [ "", 4 ],
OTHER : [ "ICON = w", END ]
},
2 : {
DIGIT : [ "n += 1; w = w * 10 + d", 2 ],
POWER : [ "", 4 ],
OTHER : [ "FCON = w * pow( 10, e * p - n )", END ]
},
3 : {
DIGIT : [ "n += 1; w = w * 10 + d", 2 ],
OTHER : [ "ERROR()", NULL ]
},
4 : {
DIGIT : [ "p = p * 10 + d", 6 ],
PLUS : [ "", 5 ],
MINUS : [ "e = -1", 5 ],
OTHER : [ "ERROR()", NULL ]
},
5 : {
DIGIT : [ "p = p * 10 + d", 6 ],
OTHER : [ "ERROR()", NULL ]
},
6 : {
DIGIT : [ "p = p * 10 + d", 6 ],
OTHER : [ "FCON = w * pow( 10, e * p - n )", END ]
}
}
def getchar( char ):
if char == '.': return POINT
elif char == 'E' or char == 'e': return POWER
elif char == '+': return PLUS
elif char == '-': return MINUS
elif char in digit_arr:
global d
d = int( char )
return DIGIT
else: return OTHER
def execute():
cur_state = 0
index = 0
while cur_state != END:
char = getchar( experssion[index] )
cmd, cur_state = graph[cur_state][char]
exec( cmd )
index += 1
if ICON: print ICON
if FCON: print FCON
def ERROR(): print 'ERROR'
if __name__ == '__main__':
experssion = '123.55E5#'
execute()