From 0c34fd260fb39193d00ff758a497e4ed9ac37c46 Mon Sep 17 00:00:00 2001 From: Dan Chen Date: Thu, 21 Mar 2024 16:59:35 +0800 Subject: [PATCH] feat: runtime boolean --- runtime/READMD.md | 2 +- runtime/ast/parser.py | 16 ++++++++++- runtime/ast/runtime.py | 4 ++- runtime/ast/tokenizer.py | 24 +++++++++++------ runtime_example.py | 51 +++++++++++++++++++++++++++++++++++ test_data/runtime_output.mp3 | Bin 0 -> 8448 bytes 6 files changed, 86 insertions(+), 11 deletions(-) create mode 100644 runtime_example.py create mode 100644 test_data/runtime_output.mp3 diff --git a/runtime/READMD.md b/runtime/READMD.md index 51ca1a9..23f850d 100644 --- a/runtime/READMD.md +++ b/runtime/READMD.md @@ -1,5 +1,5 @@ # Runtime -一台VM運行時,用於隔離租戶環境與服務器環境,提供腿本用於調用模型流。 +虛擬運行時,用於隔離租戶環境與服務器環境,提供腿本用於調用模型,組成工作流。 # 語法 ``` // 使用//註解 diff --git a/runtime/ast/parser.py b/runtime/ast/parser.py index 2c2b68e..039391c 100644 --- a/runtime/ast/parser.py +++ b/runtime/ast/parser.py @@ -93,7 +93,7 @@ class Parser: return self.current_token["type"] def _is_literal(self): - return self.current_token["type"] in ["NUMBER", "STRING", "FLOAT"] + return self.current_token["type"] in ["NUMBER", "STRING", "FLOAT", "true", "false"] # variable def variable_statement(self): @@ -126,6 +126,8 @@ class Parser: def literal(self): token_type = self.current_token["type"] + if token_type == "true" or token_type == "false": + return self.boolean_literal() if token_type == "NUMBER": return self.numberic_literal() if token_type == "STRING": @@ -134,6 +136,18 @@ class Parser: return self.float_literal() raise Exception("Unexpected token: " + token_type) + def boolean_literal(self): + if self.token_type() == "true": + self.eat('true') + value = "True" + else: + self.eat("false") + value = "False" + return { + "type": 'BooleanLiteral', + "value": value, + } + def numberic_literal(self): token = self.eat('NUMBER') return { diff --git a/runtime/ast/runtime.py b/runtime/ast/runtime.py index ce977ad..a000724 100644 --- a/runtime/ast/runtime.py +++ b/runtime/ast/runtime.py @@ -69,12 +69,14 @@ class Runtime: return int(ast.get("value")) elif ast.get("type") == "FloatLiteral": return float(ast.get("value")) + elif ast.get("type") == "BooleanLiteral": + return bool(ast.get("value")) def _is_identifier(self, ast): return ast["type"] == "Identifier" def _is_literal(self, ast): - return ast["type"] in ["NumericLiteral", "StringLiteral", "FloatLiteral"] + return ast["type"] in ["NumericLiteral", "StringLiteral", "FloatLiteral", "BooleanLiteral"] def exec_return(self, ast): v = ast.get("value") diff --git a/runtime/ast/tokenizer.py b/runtime/ast/tokenizer.py index 2ff6aae..1a1467f 100644 --- a/runtime/ast/tokenizer.py +++ b/runtime/ast/tokenizer.py @@ -7,10 +7,25 @@ specs = ( # Comments: (re.compile(r"^//.*"), None), + # Symbols: + (re.compile(r"^\("), "("), + (re.compile(r"^\)"), ")"), + (re.compile(r"^\,"), ","), + (re.compile(r"^\{"), "{"), + (re.compile(r"^\}"), "}"), + (re.compile(r"^;"), ";"), + # Keywords: (re.compile(r"^\blet\b"), "let"), (re.compile(r"^\breturn\b"), "return"), - (re.compile(r"^;"), ";"), + (re.compile(r"^\bif\b"), "if"), + (re.compile(r"^\belse\b"), "else"), + (re.compile(r"^\bwhile\b"), "while"), + (re.compile(r"^\bfor\b"), "for"), + (re.compile(r"^\def\b"), "def"), + (re.compile(r"^\btrue\b"), "true"), + (re.compile(r"^\bfalse\b"), "false"), + # Floats: (re.compile(r"^[-+]?[0-9]+\.[0-9]+"), "FLOAT"), @@ -27,13 +42,6 @@ specs = ( # Double-quoted strings (re.compile(r"^\"[^\"]*\""), "STRING"), - # Symbols: - (re.compile(r"^\("), "("), - (re.compile(r"^\)"), ")"), - (re.compile(r"^\,"), ","), - (re.compile(r"^\{"), "{"), - (re.compile(r"^\}"), "}"), - ) class Tokenizer: diff --git a/runtime_example.py b/runtime_example.py new file mode 100644 index 0000000..427f159 --- /dev/null +++ b/runtime_example.py @@ -0,0 +1,51 @@ +from src.blackbox.audio_to_text import AudioToText +from src.blackbox.text_to_audio import TextToAudio +from runtime.ast.parser import Parser +from runtime.ast.runtime import Runtime + +script = """ +let hello = true +let text = audio_to_text(audio) +print(hello) +return tts(text) +""" + +def version(): + return "0.0.1" + +def add(a,b): + return a+b + +def div(a,b): + return a/b + +def minus(a,b): + return a-b + +def mul(a,b): + return a*b + +if __name__ == "__main__": + f = open("./test_data/testone.wav", "rb") + audio_data = f.read() + f.close() + tts = TextToAudio() + audio_to_text = AudioToText() + # 注入函数 + runtime = Runtime(records={ + "add": add, + "div": div, + "minus": minus, + "mul": mul, + "audio_to_text": audio_to_text, + "tts": tts, + "version": version, + "print": print + }) + # 注入數據 + script_output = runtime.run(Parser().parse(script), { + "audio": audio_data + }) + f = open("./test_data/runtime_output.mp3", "wb") + f.write(script_output.read()) + f.close() \ No newline at end of file diff --git a/test_data/runtime_output.mp3 b/test_data/runtime_output.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..9675ea4b245c2c3b6ba9f9ce467a5df689f5099b GIT binary patch literal 8448 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 G?f(beB%7rG literal 0 HcmV?d00001