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)