Skip to content

Instantly share code, notes, and snippets.

@hltbra
Created January 17, 2010 12:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hltbra/279361 to your computer and use it in GitHub Desktop.
Save hltbra/279361 to your computer and use it in GitHub Desktop.
'''
>>> calcular('1')
1
>>> calcular('(+ 1 2)')
3
'''
from pyparsing import Word, White, nums, Literal, OneOrMore, Group
numero = Word(nums)
abre_parenteses = Literal('(').suppress()
fecha_parenteses = Literal(')').suppress()
espacos = OneOrMore(White()).suppress()
mais = Literal('+')
menos = Literal('-')
expr = Group(numero |
(abre_parenteses +
(mais|menos) + espacos + numero + espacos + numero +
fecha_parenteses))
OPERACOES = {
'+': lambda x, y: x + y,
'-': lambda x, y: x - y,
}
def calcular(e):
expr_parseada = expr.parseString(e, True)[0]
if len(expr_parseada) == 1:
return int(expr_parseada[0])
operacao = OPERACOES[expr_parseada[0]]
return operacao(int(expr_parseada[1]), int(expr_parseada[2]))
if __name__ == '__main__':
import doctest
doctest.testmod()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment