自前 Lexer の指定

yacc.parse(s, lexer = Lexer())」

#!/usr/bin/env python

tokens = (
  'A',
  'B',
  'C',
)

class LexToken:
    def __init__(self, t, value, lineno, lexpos):
        self.type   = t
        self.value  = value
        self.lineno = lineno
        self.lexpos = lexpos

class Lexer:
    def input(self, data):
        self.data = list(data)
    
    def token(self):
        if len(self.data) > 0:
            r = self.data.pop(0)
        else:
            return None
        
        while r == ' ':
            if len(self.data) > 0:
                r = self.data.pop(0)
                self.data = self.data[1:]
            else:
                return None
        return LexToken(r, r, 1, 1)


import ply.yacc as yacc

def p_input(p):
    'input : A B C'

def p_error(p):
    print "Syntax error at '%s'" % p.value

yacc.yacc()


while 1:
    try:
        s = raw_input('input > ')
    except EOFError:
        break
    if not s: continue
    yacc.parse(s, lexer = Lexer())

で、

input > A B C
input > D E F
Syntax error at 'D'

実装は手抜き