lex を試す。複数の lexer

複数の lexer が作れるらしいが、同一ファイル内に書くと
うまくいかなかった。ので、ファイルを分けて書く。

lexer 1

import ply.lex as lex

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 = lex.lex()

lexer 2

import ply.lex as lex

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)

lexer = lex.lex()

呼び出し

#!/usr/bin/env python

import m20080309_ply01
import m20080309_ply02

def lex(lexer, data):
    lexer.input(data)
    
    while 1:
        tok = lexer.token()
        if not tok: break      # No more input
        print tok


lexer1 = m20080309_ply01.lexer
lexer2 = m20080309_ply02.lexer

lex(lexer1, "a+a")
lex(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)