lex を試す。状態の管理

begin でなく、push_state, pop_state を使うこともできる。

#!/usr/bin/env python

import ply.lex as lex

states = (
 ('foo', 'exclusive'),
)

tokens = (
  'A',
  'PLUS',
)

t_A          = r'a'
t_ANY_PLUS   = r'\+'
t_ANY_ignore = ' \t\n'

t_foo_A      = r'b'

def t_begin_foo(t):
    r'start_foo'
    t.lexer.push_state('foo')

def t_foo_end(t):
    r'end_foo'
    t.lexer.pop_state()

def t_error(t):
    print "Illegal character '%s'" % t.value[0]
    t.lexer.skip(1)

def t_foo_error(t):
    print "Illegal character '%s'" % t.value[0]
    t.lexer.skip(1)

lexer = lex.lex()
lexer.input("""
a+a
start_foo
b+b
end_foo
a+a
""")

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

で、

LexToken(A,'a',1,1)
LexToken(PLUS,'+',1,2)
LexToken(A,'a',1,3)
LexToken(A,'b',1,15)
LexToken(PLUS,'+',1,16)
LexToken(A,'b',1,17)
LexToken(A,'a',1,27)
LexToken(PLUS,'+',1,28)
LexToken(A,'a',1,29)