import sys from collections import namedtuple from pegpy.tpeg import grammar, generate import hashlib import puppytypes as ts import nobuai as nlp peg = grammar('puppy2.tpeg') parser = generate(peg) const = True mutable = False Symbol = namedtuple('Symbol', 'target local types') class Env(object): __slots__ = ['env', 'stacks'] def __init__(self, env): self.env = env.env if isinstance(env, Env) else env self.stacks = [] def __enter__(self): return self def __getitem__(self, key): return self.env[key] if key in self.env else None def __setitem__(self, key, value): if not key.startswith('@@'): self.stacks.append((key, self.env.get(key, None)))
import pegpy.tpeg as pegpy #peg = pegpy.grammar(''' #Expression = Product (^{ '+' Product #Add})* #Product = Value (^{ '*' Value #Mul})* #Value = { [0-9]+ #Int } #''') #"math.tpeg"ファイルで定義された文法を呼び出す peg = pegpy.grammar('chibi.tpeg') parser = pegpy.generate(peg) #上記で呼び出した文法に基づいてパーサを生成する ''' t = parser('1+2*3') print(repr(t)) t = parser('@2') #Syntax Errorになってほしい print(repr(t)) ''' #以下、run()を使う場合に必要になるExpr(式)クラスの定義をする class Expr(object): @classmethod def new(cls, v): if isinstance(v, Expr): return v return Val(v) class Val(Expr): __slot__ = ['value']
import pegpy.tpeg as pegpy grammar = pegpy.grammar('math.tpeg') parser = pegpy.generate(grammar) t = parser('1+2*3') print(repr(t)) t = parser('(1+2)*3') print(repr(t))
import pegpy.tpeg as pegpy peg = pegpy.grammar('chibi.tpeg') parser = pegpy.generate(peg) class Expr(object): # 上位クラス def eval(self): pass # 下位クラスに共通のメソッド 定義の内容は下位クラスごとに違うのでここでは定義しない def expr(e): #Expr(式)クラスであるかどうか判定する関数 if not isinstance(e, Expr): e = Val(e) return e class Binary(Expr): __slots__ = ['left', 'right'] def __init__(self, left, right): self.left = left self.right = right def eval(self): pass # 定義の内容は下位クラスごとに違うのでここでは定義しない def __repr__(self): classname = self.__class__.__name__ return f'{classname}({self.left}, {self.right})'