2015-03-29 4 views
0

Я хочу изменить свой лексер для разбора со списком LexToken, созданным lexer. Мой лексер проанализирует код и создаст список со всеми типами токенов как CHAR, и я хочу изменить его на список токенов с типом как LETTER. (Это пример) Это пример того, что я хочу сделать:PLY разобрать из списка LexToken

# My code to parse 
code = "my text" 

# My only token 
tokens = ("CHAR",) 

# I want to change all token CHAR to LETTER 
t_CHAR = r'.{1}' 

# My lexer 
lexer = lex.lex() 

lexer.input(code) 

# My list of LexToken 
tokens_list = [] 

# This change all token type to LETTER 
for t in lexer: 
    # t return LexToken object 
    t.type = 'LETTER' 

    tokens_list.append(t) 

# My parser rules 
# [...] 
# [...] 
# My parser build from a LexToken list 
parser = yacc.yacc(myLexTokenList=tokens_list) 

# Parse the code 
parser.parse(code) 

Как я могу это сделать?

ответ

1

Вы можете сделать это следующим образом:

code = "my text" 
tokens = ("CHAR",) 

def t_CHAR(t): 
    r'.{1}' 
    t.type = 'LETTER' 

lexer = lex.lex() 
lexer.input(code) 

parser = yacc.yacc() 

# Parse the code 
parser.parse(code) 
0

Кроме того, parser.parse может быть использован с tokenfunc аргументом

tokens = [...] 

def token_func(): 
    if len(tokens): 
     return tokens.pop(0) 

parser = yacc.yacc() 
parser.parse(code, tokenfunc = token_func)