lex を試す。トークンのアトリビュート

トークンオブジェクトに追加的なアトリビュートを付加しないこと」というのは分かるのだが、「それ故、貴方が付加するその他のあらゆるアトリビュートはアクセスできなくなっている」という部分が良く分からなかった。「yacc.pyモジュールは」となっているので、yacc の部分を使ったら分かるのかもしれない。

#!/usr/bin/env python

import ply.lex as lex

tokens = (
  'ID',
)

def t_ID(t):
    r'[a-zA-Z_][a-zA-Z_0-9]*'
    t.hoge = t.value.upper()
    print t.hoge
    return t

t_ignore = ' \t'

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

lex.lex()
lex.input("if then end")

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

で、

IF
LexToken(ID,'if',1,0)
THEN
LexToken(ID,'then',1,3)
END
LexToken(ID,'end',1,8)