diff --git a/documentation/plthy.pdf b/documentation/plthy.pdf index 18f97b3..e1b4856 100644 Binary files a/documentation/plthy.pdf and b/documentation/plthy.pdf differ 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