PLY (ang. Python Lex-Yacc) – narzędzie służące do tworzenia kompilatorów oraz translatorów z opisu gramatyki zawierającego akcje w języku Python. Autorem jest David Beazley.
Cechy Zasadniczo PLY to bezpośrednia implementacja idei programów Lex oraz Yacc w języku Python Implementacja całowicie w Pythonie Używa parsera LR cechującego się rozsądną wydajnością oraz dobrą wsparciem dużych gramatyk. PLY obsługuje większość standardowych możliwości lex/yacc włączając w to reguły pierwszeństwa, usuwanie błędów, obsługę niejednoznacznych gramatyk i pustych wyrażeń.
Przykład Poniższy przykład, pochodzący z dokumentacji PLY, zawiera implementację prostego kalkulatora operującego na liczbach całkowitych. import ply.lex as lex import ply.yacc as yacc
# Lex
tokens = ( 'NUMBER', 'PLUS', 'MINUS', 'TIMES', 'DIVIDE', 'LPAREN', 'RPAREN', )
t_PLUS = r'\+' t_MINUS = r'-' t_TIMES = r'\*' t_DIVIDE = r'/' t_LPAREN = r'\(' t_RPAREN = r'\)'
def t_NUMBER(t): r'[-+]?\d+' try: t.value = int(t.value) except ValueError: print "Line %d: Number %s is too large!" % (t.lineno,t.value) t.value = 0 return t
def t_newline(t): r'\n+' t.lexer.lineno += len(t.value)
t_ignore = ' \t'
def t_error(t): print "Illegal character '%s'" % t.value t.lexer.skip(1)
# Yacc