Created
February 27, 2018 03:14
-
-
Save anonymous/17377f26ffe518a3cc6af604833bf36e to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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