lex を試す。複数の lexer 再び
(複数の lexer に限った話ではないけど)
d:id:noritsugu:20080309:parser で自分なりにやっていたが、マニュアルにも記述があった。
ルールだけ書けば良かったようだ。
lexer ルール 1
tokens = ( 'A', 'PLUS', ) t_A = r'a' t_PLUS = r'\+' def t_error(t): print "Illegal character '%s'" % t.value[0] t.lexer.skip(1)
lexer ルール 2
tokens = ( 'B', 'PLUS', ) t_B = r'b' t_PLUS = r'\+' def t_error(t): print "Illegal character '%s'" % t.value[0] t.lexer.skip(1)
呼び出し
#!/usr/bin/env python import ply.lex as lex import m20080322_ply01 import m20080322_ply02 def lex_data(lexer, data): lexer.input(data) while 1: tok = lexer.token() if not tok: break # No more input print tok lexer1 = lex.lex(module=m20080322_ply01) lexer2 = lex.lex(module=m20080322_ply02) lex_data(lexer1, "a+a") lex_data(lexer2, "b+b")
で、
LexToken(A,'a',1,0) LexToken(PLUS,'+',1,1) LexToken(A,'a',1,2) LexToken(B,'b',1,0) LexToken(PLUS,'+',1,1) LexToken(B,'b',1,2)