Create setup scaffolding
This commit is contained in:
66
smnp/calc.py
66
smnp/calc.py
@@ -1,66 +0,0 @@
|
||||
from smnp.ast.node.model import Node
|
||||
from smnp.ast.parser import Parser
|
||||
from smnp.token.tokenizer import tokenize
|
||||
from smnp.token.type import TokenType
|
||||
|
||||
|
||||
class Atom(Node):
|
||||
def __init__(self, value, pos):
|
||||
super().__init__(pos)
|
||||
self.children = [value]
|
||||
|
||||
@property
|
||||
def value(self):
|
||||
return self[0]
|
||||
|
||||
class Operation(Node):
|
||||
def __init__(self, left, op, right, pos):
|
||||
super().__init__(pos)
|
||||
self.children = [left, op, right]
|
||||
|
||||
@property
|
||||
def left(self):
|
||||
return self[0]
|
||||
|
||||
@property
|
||||
def operator(self):
|
||||
return self[1]
|
||||
|
||||
@property
|
||||
def right(self):
|
||||
return self[2]
|
||||
|
||||
def atom():
|
||||
return Parser.oneOfTerminals(TokenType.INTEGER, TokenType.NOTE, TokenType.STRING, createNode=lambda val, pos: Atom(val, pos))
|
||||
|
||||
def chain():
|
||||
return Parser.leftAssociativeOperatorParser(atom(), [TokenType.DOT], atom(), lambda left, op, right: Operation(left, op, right, op.pos), name="chain")
|
||||
|
||||
def factor():
|
||||
return Parser.leftAssociativeOperatorParser(chain(), [TokenType.DOUBLE_ASTERISK], chain(), lambda left, op, right: Operation(left, op, right, op.pos), name="factor")
|
||||
|
||||
def term():
|
||||
return Parser.leftAssociativeOperatorParser(factor(), [TokenType.ASTERISK, TokenType.SLASH], factor(), lambda left, op, right: Operation(left, op, right, op.pos), name="term")
|
||||
|
||||
def expr():
|
||||
return Parser.leftAssociativeOperatorParser(term(), [TokenType.PLUS, TokenType.MINUS], term(), lambda left, op, right: Operation(left, op, right, op.pos), name="expr")
|
||||
#
|
||||
def evaluate(node):
|
||||
if type(node) == Atom:
|
||||
return node.value
|
||||
lhs = evaluate(node.left)
|
||||
rhs = evaluate(node.right)
|
||||
return {
|
||||
"+": int(lhs) + int(rhs),
|
||||
"*": int(lhs) * int(rhs),
|
||||
"-": int(lhs) - int(rhs),
|
||||
"/": int(lhs) / int(rhs),
|
||||
"**": int(lhs) ** int(rhs)
|
||||
}[node.operator.value]
|
||||
|
||||
def draft():
|
||||
|
||||
tokens = tokenize(['"fesf fe" + "fsefsef" + "fsefs"'])
|
||||
e = expr()
|
||||
node = e(tokens).node
|
||||
node.print()
|
||||
@@ -1,13 +1,14 @@
|
||||
import argparse
|
||||
import os
|
||||
|
||||
|
||||
def file(file):
|
||||
return open(os.path.join(os.path.dirname(__file__), os.pardir, os.pardir, file)).read()
|
||||
|
||||
VERSION = "0.1"
|
||||
DESCRIPTION = """
|
||||
Simple Music Notation Processor is a command line tool enabling you to do some music stuff using custom domain-specific language.
|
||||
"""
|
||||
|
||||
class CliParser(object):
|
||||
def __init__(self):
|
||||
self.parser = argparse.ArgumentParser(description=DESCRIPTION)
|
||||
self.parser = argparse.ArgumentParser(description=file("__description__.txt"))
|
||||
self.parser.add_argument('file', nargs='*', help='a file containing SMNP code')
|
||||
self.parser.add_argument('-c', '--code', action='append', default=[], type=str, help='a string with SMNP code')
|
||||
self.parser.add_argument('-m', '--mic', action='store_true', help='test microphone level')
|
||||
@@ -17,7 +18,7 @@ class CliParser(object):
|
||||
self.parser.add_argument('--tokens', action='store_true', help='print tokens of parsed code')
|
||||
self.parser.add_argument('--ast', action='store_true', help='print abstract syntax tree of parsed code')
|
||||
self.parser.add_argument('--dry-run', action='store_true', help='don\'t execute passed code')
|
||||
self.parser.version = VERSION
|
||||
self.parser.version = file("__version__.txt")
|
||||
|
||||
def parse(self):
|
||||
return self.parser.parse_args()
|
||||
Reference in New Issue
Block a user