我不理解ply(python lex yacc)规则

时间:2015-08-27 13:06:18

标签: python ply

我正在学习PLY,但我的学习不起作用。

问题是 我不了解yacc规则。 哪个在下面?

输入

xor ebx ecx
pop ecx 
add ebx edi
mov eax ebx
pop ebx 
push 67E0h

输出

LexToken(MOV,'mov',12,34)
LexToken(R_EAX,'eax',12,38)
LexToken(R_EBX,'ebx',12,43)
Syntax error at 'mov'

代码

tokens = (
    'MOV', 'PUSH', 'INC', 'SHR', 'HEX_NUMBER', 'DEC_NUMBER', 
    'R_EAX', 'R_AX', 'R_ECX', 'R_CX', 'R_EBX', 'R_BX', 
    'R_EDX', 'R_DX', 'R_EDI', 'R_DI', 'R_ESI', 'R_SI', 
    'R_EBP', 'R_BP', 'R_ESP', 'R_SP', )
t_MOV = r'mov'
t_PUSH = r'push'
t_INC = r'inc'
t_SHR = r'shr'
t_R_EAX = r'eax'
t_R_ECX = r'ecx'
The rest is omitted.

我不知道这些规则是否正确。

def p_statement(t):
'''statement : statement 
        | reg32
        | reg16 
        | number 
        '''
def p_number(t):
''' number : HEX_NUMBER
    | DEC_NUMBER
'''
    t[0] = t[1] 
def p_regs32(t):
''' reg32 : R_EAX
        | R_EBX
        | R_ECX
        | R_EDX
        | R_ESI
        | R_EDI
        | R_ESP
        | R_EBP
        '''
    t[0] = t[1] 

def p_reg16(t):
''' reg16 : R_AX    
        | R_CX
        | R_DX
        | R_BX
        | R_DI
        | R_SI
        | R_SP
        | R_BP
'''
    t[0] = t[1] 


def p_mov(t):
''' statement : MOV reg32 number
'''
    regs[t[2]] = t[3]
#do mov

def p_error(t):
    print( "Syntax error at '%s'" % t.value )

我无法理解这个yacc规则。 有没有这方面的教程?

0 个答案:

没有答案