Skip to content

Instantly share code, notes, and snippets.

Created February 27, 2018 03:14
Show Gist options
  • Save anonymous/17377f26ffe518a3cc6af604833bf36e to your computer and use it in GitHub Desktop.
Save anonymous/17377f26ffe518a3cc6af604833bf36e to your computer and use it in GitHub Desktop.
from modgrammar import *
from functools import *
from math import *
#grammar_whitespace_mode = 'optional'
NAMESPACE = {}
class NonZeroDigit(Grammar):
grammar = WORD("1-9")
class Digit(Grammar):
grammar = WORD("0-9")
class Integer(Grammar):
grammar = (NonZeroDigit, ZERO_OR_MORE(Digit))
def grammar_elem_init(self, sd):
self.value = int(self.string)
class FloatingPoint(Grammar):
grammar = OR((Integer, '.', ZERO_OR_MORE(Digit)) , ('.', ONE_OR_MORE(Digit)))
def grammar_elem_init(self, sd):
self.value = float(self.string)
class Initial(Grammar):
grammar = WORD('a-z') | WORD('A-Z') | '_'
class Medial(Grammar):
grammar = Initial | Digit
class Var(Grammar):
grammar = (Initial, ZERO_OR_MORE(Medial))
def grammar_elem_init(self, sd):
self.value = NAMESPACE[self.string]
class Val(Grammar):
grammar = Integer | FloatingPoint | Var | ('(',REF("Expression"),')') | REF("Function")
def grammar_elem_init(self, sd):
for i in self:
if i:
self.value = i.value
break
class ValT(Grammar):
grammar = Val | REF("TrigE")
def grammar_elem_init(self, sd):
for i in self:
if i:
self.value = i.value
break
class ExpS(Grammar):
grammar = '^'
class ExpT(Grammar):
grammar = ValT | (ValT, ExpS, REF("NegT"))
def grammar_elem_init(self, sd):
if self[0]:
self.value = self[0].value
else:
self.value = self[1][0].value ** self[1][2].value
class ExpE(Grammar):
grammar = ValT | (Val, ExpS, REF("NegE"))
def grammar_elem_init(self, sd):
if self[0]:
self.value = self[0].value
else:
self.value = self[1][0].value ** self[1][2].value
class NegS(Grammar):
grammar = '_'
class NegT(Grammar):
grammar = ExpT | (NegS, REF("NegT"))
def grammar_elem_init(self, sd):
if self[0]:
self.value = self[0].value
else:
self.value = -self[1][0].value
class NegE(Grammar):
grammar = ExpE | (NegS, REF("RegE"))
def grammar_elem_init(self, sd):
if self[0]:
self.value = self[0].value
else:
self.value = -self[1][0].value
class MulS(Grammar):
grammar = L('*') | '/'
class MulT(Grammar):
grammar = NegT | (REF("MulT"), MulS, NegT)
def grammar_elem_init(self, sd):
if self[0]:
self.value = self[0].value
elif self[1][2].string == '*':
self.value = self[1][0].value * self[1][2].value
elif self[1][2].string == '/':
self.value = self[1][0].value / self[1][2].value
class MulE(Grammar):
grammar = NegE | (REF("MulE"), MulS, NegE)
def grammar_elem_init(self, sd):
if self[0]:
self.value = self[0].value
elif self[1][2].string == '*':
self.value = self[1][0].value * self[1][2].value
elif self[1][2].string == '/':
self.value = self[1][0].value / self[1][2].value
class TrigS(Grammar):
grammar = L('sin') | 'cos' | 'tan' | 'asin' | 'acos' | 'atan'
class TrigE(Grammar):
grammar = (TrigS, ' ', MulE | REF("TrigE"))
def grammar_elem_init(self, sd):
if self[2][0]:
self.value = eval(self[0][0].string)(self[2][0].value)
else:
self.value = eval(self[0][0].string)(self[2][1].value)
class AddS(Grammar):
grammar = L('+') | '-'
class AddE(Grammar):
grammar = MulT | (REF("AddE"), AddS, MulE)
def grammar_elem_init(self, sd):
if self[0]:
self.value = self[0].value
elif self[1][2].string == '+':
self.value = self[1][0].value + self[1][2].value
elif self[1][2].string == '-':
self.value = self[1][0].value - self[1][2].value
class Function(Grammar):
grammar = (Var, '(', REF("Expression"), ZERO_OR_MORE((',',REF("Expression"))), ')')
def grammar_elem_init(self, sd):
res = [self[2].value]
for i in range(len(self[3])):
if i % 2 == 1:
res.append(self[3][i].value)
self.value = NAMESPACE[self[0]](*res)
class Expression(Grammar):
grammar = AddE
def grammar_elem_init(self, sd):
self.value = self[0].value
p = Expression.parser()
print(p.parse_string("0"))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment