自前 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'
実装は手抜き