Python 词法分析 识别数字



( 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()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值