コード例 #1
0
ファイル: puppy.py プロジェクト: y-akinobu/puppy
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)))
コード例 #2
0
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']
コード例 #3
0
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))
コード例 #4
0
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})'