From f394a9cde2f0d18ce26f7e5eccee164b309da0e0 Mon Sep 17 00:00:00 2001 From: Nikolaj Gade Date: Thu, 22 Feb 2024 10:37:18 +0100 Subject: [PATCH] :sparkles: --- documentation/plthy.pdf | Bin 22597 -> 22678 bytes documentation/plthy.tex | 2 ++ plthy | 2 +- plthy_impl/parser.py | 78 ++++++++++++++++++++-------------------- tests/19_until.expected | 10 ++++++ tests/19_until.plthy | 7 ++++ 6 files changed, 60 insertions(+), 39 deletions(-) create mode 100644 tests/19_until.expected create mode 100644 tests/19_until.plthy diff --git a/documentation/plthy.pdf b/documentation/plthy.pdf index 18f97b3010f4681b15c6af8327d6a09f2a3adf54..e1b48560767fe9bc5f0751a50bc5c51a7be6832f 100644 GIT binary patch delta 6569 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 OOGp3%0FYIa!}t%(TyXgS diff --git a/documentation/plthy.tex b/documentation/plthy.tex index 7ddf0cc..556dfcb 100644 --- a/documentation/plthy.tex +++ b/documentation/plthy.tex @@ -37,7 +37,9 @@ \textit{expression} & $\rightarrow$ & \textit{expression} \texttt{\{} \textit{expression} \texttt{\}} \\ \hline \textit{expression} & $\rightarrow$ & \texttt{(} \textit{expression} \texttt{)} \\ \hline \textit{expression} & $\rightarrow$ & \textit{expression} \textbf{binop} \textit{expression} \\ \hline + \textit{expression} & $\rightarrow$ & \textbf{unop} \textit{expression} \\ \hline \textit{expression} & $\rightarrow$ & \texttt{variable} \textbf{id}\\ \hline + \textit{expression} & $\rightarrow$ & \texttt{argument} \textbf{arg} \\ \hline \textit{expression} & $\rightarrow$ & \textit{statement} \\ \hline \end{tabular} \end{center} diff --git a/plthy b/plthy index aeb860a..559430f 100755 --- a/plthy +++ b/plthy @@ -1,4 +1,4 @@ -#! /home/nikolaj/.pyenv/shims/python +#!/usr/bin/env python """ Usage: plthy (-h| --help) diff --git a/plthy_impl/parser.py b/plthy_impl/parser.py index 2d4f7d5..14826ae 100644 --- a/plthy_impl/parser.py +++ b/plthy_impl/parser.py @@ -37,17 +37,21 @@ class Parser(): def statement_skip(tokens): return ast_nodes.StatementSkip() - @self.pg.production('statement : KEYWORD_SET expression SYMBOL_SET ID') - def statement_set(tokens): - return ast_nodes.StatementSet(tokens[1], tokens[3].value) + @self.pg.production('statement : KEYWORD_MAYBE statement') + def statement_maybe(tokens): + return ast_nodes.Maybe(tokens[1]) @self.pg.production('statement : KEYWORD_DO command') def statement_do(tokens): return ast_nodes.Do(tokens[1]) - @self.pg.production('statement : KEYWORD_MAYBE statement') - def statement_maybe(tokens): - return ast_nodes.Maybe(tokens[1]) + @self.pg.production('statement : SYMBOL_LBRACKET statements SYMBOL_RBRACKET') + def statement_scope(tokens): + return ast_nodes.Scope(tokens[1]) + + @self.pg.production('statement : KEYWORD_SET expression SYMBOL_SET ID') + def statement_set(tokens): + return ast_nodes.StatementSet(tokens[1], tokens[3].value) @self.pg.production('statement : KEYWORD_DEFINE ID SYMBOL_LT DATA_INT SYMBOL_GT KEYWORD_AS statement', precedence="KEYWORD_DEFINE") def statement_define(tokens): @@ -57,19 +61,7 @@ class Parser(): def statement_return(tokens): return ast_nodes.StatementReturn(tokens[1]) - @self.pg.production('statement : SYMBOL_LBRACKET statements SYMBOL_RBRACKET') - def statement_scope(tokens): - return ast_nodes.Scope(tokens[1]) - ## command ## - @self.pg.production('command : BUILTIN SYMBOL_LT expressions SYMBOL_GT') - def command_builtin(tokens): - return ast_nodes.Builtin(tokens[0], tokens[2]) - - @self.pg.production('command : SYMBOL_QUOTE ID SYMBOL_QUOTE SYMBOL_LT expressions SYMBOL_GT') - def command_call(tokens): - return ast_nodes.Call(tokens[1].value,tokens[4]) - @self.pg.production('command : statement KEYWORD_IF expression') def command_if(tokens): return ast_nodes.CommandIf(tokens[0], tokens[2]) @@ -86,6 +78,14 @@ class Parser(): def command_until(tokens): return ast_nodes.CommandUntil(tokens[0],tokens[2]) + @self.pg.production('command : BUILTIN SYMBOL_LT expressions SYMBOL_GT') + def command_builtin(tokens): + return ast_nodes.Builtin(tokens[0], tokens[2]) + + @self.pg.production('command : SYMBOL_QUOTE ID SYMBOL_QUOTE SYMBOL_LT expressions SYMBOL_GT') + def command_call(tokens): + return ast_nodes.Call(tokens[1].value,tokens[4]) + ## expressions ## @self.pg.production('expressions : ') def expressions_none(_): @@ -96,29 +96,31 @@ class Parser(): return [tokens[0]] + tokens[2] ## expression ## + @self.pg.production('expression : DATA_STRING') + def exp_string(tokens): + return ast_nodes.ExpString(tokens[0].value[1:-1]) + @self.pg.production('expression : DATA_INT') def exp_int(tokens): return ast_nodes.ExpInt(int(tokens[0].value)) - @self.pg.production('expression : SYMBOL_LPARENS expression SYMBOL_RPARENS') - def exp_paren(tokens): - return tokens[1] - @self.pg.production('expression : DATA_FLOAT') def exp_float(tokens): return ast_nodes.ExpInt(float(tokens[0].value)) - @self.pg.production('expression : DATA_STRING') - def exp_string(tokens): - return ast_nodes.ExpString(tokens[0].value[1:-1]) + # Boolean - @self.pg.production('expression : statement', precedence="KEYWORD_IF") - def exp_statement(tokens): - return(tokens[0]) + @self.pg.production('expression : SYMBOL_LCURL expressions SYMBOL_RCURL') + def exp_list(tokens): + return ast_nodes.ExpList(tokens[1]) - @self.pg.production('expression : KEYWORD_VARIABLE ID') - def exp_variable(tokens): - return ast_nodes.ExpVariable(tokens[1].value) + @self.pg.production('expression : expression SYMBOL_LCURL expression SYMBOL_RCURL') + def exp_index(tokens): + return ast_nodes.ExpIndex(tokens[0],tokens[2]) + + @self.pg.production('expression : SYMBOL_LPARENS expression SYMBOL_RPARENS') + def exp_paren(tokens): + return tokens[1] @self.pg.production('expression : expression SYMBOL_PLUS expression') @self.pg.production('expression : expression SYMBOL_MINUS expression') @@ -139,17 +141,17 @@ class Parser(): def exp_not(tokens): pass + @self.pg.production('expression : KEYWORD_VARIABLE ID') + def exp_variable(tokens): + return ast_nodes.ExpVariable(tokens[1].value) + @self.pg.production('expression : KEYWORD_ARGUMENT ARG') def exp_arg(tokens): return ast_nodes.ExpArg(int(tokens[1].value[1:])) - @self.pg.production('expression : SYMBOL_LCURL expressions SYMBOL_RCURL') - def exp_list(tokens): - return ast_nodes.ExpList(tokens[1]) - - @self.pg.production('expression : expression SYMBOL_LCURL expression SYMBOL_RCURL') - def exp_index(tokens): - return ast_nodes.ExpIndex(tokens[0],tokens[2]) + @self.pg.production('expression : statement') + def exp_statement(tokens): + return(tokens[0]) ## Error Handling ## @self.pg.error diff --git a/tests/19_until.expected b/tests/19_until.expected new file mode 100644 index 0000000..8b1acc1 --- /dev/null +++ b/tests/19_until.expected @@ -0,0 +1,10 @@ +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 diff --git a/tests/19_until.plthy b/tests/19_until.plthy new file mode 100644 index 0000000..748eeee --- /dev/null +++ b/tests/19_until.plthy @@ -0,0 +1,7 @@ +hello| +set 0 -> x| +do [ + do print| + set variable x+1 -> x| +] until variable x = 10| +goodbye| \ No newline at end of file