PLY - Google

PLY

Z Wikipedii

Skocz do: nawigacji, szukaj

PLY (ang. Python Lex-Yacc) to 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.

Spis treści

[edytuj] 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 pierszeÅ„stwa, usuwanie błędów, obsÅ‚ugiÄ™ niejednoznacznych gramatyk i pustych wyrażeÅ„.

[edytuj] Przykład

Poniższy przykład, pochodzący z dokumentacji PLY, zawiera implementację prostego kalkulatora operujacego 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[0]
    t.lexer.skip(1)


# Yacc

def p_expression_plus(p):
    'expression : expression PLUS term'
    p[0] = p[1] + p[3]

def p_expression_minus(p):
    'expression : expression MINUS term'
    p[0] = p[1] - p[3]

def p_expression_term(p):
    'expression : term'
    p[0] = p[1]

def p_term_times(p):
    'term : term TIMES factor'
    p[0] = p[1] * p[3]

def p_term_div(p):
    'term : term DIVIDE factor'
    p[0] = p[1] / p[3]

def p_term_factor(p):
    'term : factor'
    p[0] = p[1]

def p_factor_num(p):
    'factor : NUMBER'
    p[0] = p[1]

def p_factor_expr(p):
    'factor : LPAREN expression RPAREN'
    p[0] = p[2]

def p_error(p):
    print "Syntax error in input!"


if __name__ == '__main__':
    lex.lex()
    yacc.yacc()

    while 1:
        try:
            s = raw_input('calc > ')
        except EOFError:
            break
        if not s: continue
        result = yacc.parse(s)
        print result


[edytuj] Zobacz też


[edytuj] Linki zewnętrzne


Prezydent Kaczyński nazwany homofobem
Prezydent Kaczyński został napiętnowany przez Human Rights Watch, organizację broniącą praw człowieka, "za odmawianie ludziom szacunku dla ich rodzin". Bezpośrednim powodem było słynne orędzie z gejowską parą małżeńską.
Nowe wstrzÄ…sy w Chinach
O nowych wstrząsach w południowo zachodnich Chinach poinformowało w sobotę amerykańskie centrum geologiczne (USGS). Trzęsienie o sile 6,1 w skali Richtera nastąpiło na granicy prowincji Syczuan i Gansu.
Pijany rosyjski statek na mieliźnie
Na mieliznę lub na podwodne skały wpłynął na Bałtyku koło Bornholmu rosyjski statek do transportu odpadów atomowych. Kapitana jednostki zatrzymano; policja podejrzewa, że był pod wpływem alkoholu, podobnie jak inni członkowie załogi.
ÅšWIAT 24/7
Tragiczne trzęsienie ziemi w Chinach, wybory parlamentarne w Serbii i 60. lecie Państwa Izrael, to najważniejsze tematy, o których pisaliśmy w zeszłym tygodniu w tvn24.pl
Ostatni Kennedy trafił do szpitala
Senator Edward Kennedy z objawami udaru trafił w sobotę do szpitala w Bostonie w stanie Massachusetts - poinformowała agencja Reutera powołując się na doniesienia telewizji CNN.
Linki: Strona g³ówna