✨
This commit is contained in:
Binary file not shown.
@ -37,7 +37,9 @@
|
|||||||
\textit{expression} & $\rightarrow$ & \textit{expression} \texttt{\{} \textit{expression} \texttt{\}} \\ \hline
|
\textit{expression} & $\rightarrow$ & \textit{expression} \texttt{\{} \textit{expression} \texttt{\}} \\ \hline
|
||||||
\textit{expression} & $\rightarrow$ & \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$ & \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{variable} \textbf{id}\\ \hline
|
||||||
|
\textit{expression} & $\rightarrow$ & \texttt{argument} \textbf{arg} \\ \hline
|
||||||
\textit{expression} & $\rightarrow$ & \textit{statement} \\ \hline
|
\textit{expression} & $\rightarrow$ & \textit{statement} \\ \hline
|
||||||
\end{tabular}
|
\end{tabular}
|
||||||
\end{center}
|
\end{center}
|
||||||
|
2
plthy
2
plthy
@ -1,4 +1,4 @@
|
|||||||
#! /home/nikolaj/.pyenv/shims/python
|
#!/usr/bin/env python
|
||||||
"""
|
"""
|
||||||
Usage:
|
Usage:
|
||||||
plthy (-h| --help)
|
plthy (-h| --help)
|
||||||
|
@ -37,17 +37,21 @@ class Parser():
|
|||||||
def statement_skip(tokens):
|
def statement_skip(tokens):
|
||||||
return ast_nodes.StatementSkip()
|
return ast_nodes.StatementSkip()
|
||||||
|
|
||||||
@self.pg.production('statement : KEYWORD_SET expression SYMBOL_SET ID')
|
@self.pg.production('statement : KEYWORD_MAYBE statement')
|
||||||
def statement_set(tokens):
|
def statement_maybe(tokens):
|
||||||
return ast_nodes.StatementSet(tokens[1], tokens[3].value)
|
return ast_nodes.Maybe(tokens[1])
|
||||||
|
|
||||||
@self.pg.production('statement : KEYWORD_DO command')
|
@self.pg.production('statement : KEYWORD_DO command')
|
||||||
def statement_do(tokens):
|
def statement_do(tokens):
|
||||||
return ast_nodes.Do(tokens[1])
|
return ast_nodes.Do(tokens[1])
|
||||||
|
|
||||||
@self.pg.production('statement : KEYWORD_MAYBE statement')
|
@self.pg.production('statement : SYMBOL_LBRACKET statements SYMBOL_RBRACKET')
|
||||||
def statement_maybe(tokens):
|
def statement_scope(tokens):
|
||||||
return ast_nodes.Maybe(tokens[1])
|
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")
|
@self.pg.production('statement : KEYWORD_DEFINE ID SYMBOL_LT DATA_INT SYMBOL_GT KEYWORD_AS statement', precedence="KEYWORD_DEFINE")
|
||||||
def statement_define(tokens):
|
def statement_define(tokens):
|
||||||
@ -57,19 +61,7 @@ class Parser():
|
|||||||
def statement_return(tokens):
|
def statement_return(tokens):
|
||||||
return ast_nodes.StatementReturn(tokens[1])
|
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 ##
|
## 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')
|
@self.pg.production('command : statement KEYWORD_IF expression')
|
||||||
def command_if(tokens):
|
def command_if(tokens):
|
||||||
return ast_nodes.CommandIf(tokens[0], tokens[2])
|
return ast_nodes.CommandIf(tokens[0], tokens[2])
|
||||||
@ -86,6 +78,14 @@ class Parser():
|
|||||||
def command_until(tokens):
|
def command_until(tokens):
|
||||||
return ast_nodes.CommandUntil(tokens[0],tokens[2])
|
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 ##
|
## expressions ##
|
||||||
@self.pg.production('expressions : ')
|
@self.pg.production('expressions : ')
|
||||||
def expressions_none(_):
|
def expressions_none(_):
|
||||||
@ -96,29 +96,31 @@ class Parser():
|
|||||||
return [tokens[0]] + tokens[2]
|
return [tokens[0]] + tokens[2]
|
||||||
|
|
||||||
## expression ##
|
## 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')
|
@self.pg.production('expression : DATA_INT')
|
||||||
def exp_int(tokens):
|
def exp_int(tokens):
|
||||||
return ast_nodes.ExpInt(int(tokens[0].value))
|
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')
|
@self.pg.production('expression : DATA_FLOAT')
|
||||||
def exp_float(tokens):
|
def exp_float(tokens):
|
||||||
return ast_nodes.ExpInt(float(tokens[0].value))
|
return ast_nodes.ExpInt(float(tokens[0].value))
|
||||||
|
|
||||||
@self.pg.production('expression : DATA_STRING')
|
# Boolean
|
||||||
def exp_string(tokens):
|
|
||||||
return ast_nodes.ExpString(tokens[0].value[1:-1])
|
|
||||||
|
|
||||||
@self.pg.production('expression : statement', precedence="KEYWORD_IF")
|
@self.pg.production('expression : SYMBOL_LCURL expressions SYMBOL_RCURL')
|
||||||
def exp_statement(tokens):
|
def exp_list(tokens):
|
||||||
return(tokens[0])
|
return ast_nodes.ExpList(tokens[1])
|
||||||
|
|
||||||
@self.pg.production('expression : KEYWORD_VARIABLE ID')
|
@self.pg.production('expression : expression SYMBOL_LCURL expression SYMBOL_RCURL')
|
||||||
def exp_variable(tokens):
|
def exp_index(tokens):
|
||||||
return ast_nodes.ExpVariable(tokens[1].value)
|
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_PLUS expression')
|
||||||
@self.pg.production('expression : expression SYMBOL_MINUS expression')
|
@self.pg.production('expression : expression SYMBOL_MINUS expression')
|
||||||
@ -139,17 +141,17 @@ class Parser():
|
|||||||
def exp_not(tokens):
|
def exp_not(tokens):
|
||||||
pass
|
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')
|
@self.pg.production('expression : KEYWORD_ARGUMENT ARG')
|
||||||
def exp_arg(tokens):
|
def exp_arg(tokens):
|
||||||
return ast_nodes.ExpArg(int(tokens[1].value[1:]))
|
return ast_nodes.ExpArg(int(tokens[1].value[1:]))
|
||||||
|
|
||||||
@self.pg.production('expression : SYMBOL_LCURL expressions SYMBOL_RCURL')
|
@self.pg.production('expression : statement')
|
||||||
def exp_list(tokens):
|
def exp_statement(tokens):
|
||||||
return ast_nodes.ExpList(tokens[1])
|
return(tokens[0])
|
||||||
|
|
||||||
@self.pg.production('expression : expression SYMBOL_LCURL expression SYMBOL_RCURL')
|
|
||||||
def exp_index(tokens):
|
|
||||||
return ast_nodes.ExpIndex(tokens[0],tokens[2])
|
|
||||||
|
|
||||||
## Error Handling ##
|
## Error Handling ##
|
||||||
@self.pg.error
|
@self.pg.error
|
||||||
|
10
tests/19_until.expected
Normal file
10
tests/19_until.expected
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
0
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
4
|
||||||
|
5
|
||||||
|
6
|
||||||
|
7
|
||||||
|
8
|
||||||
|
9
|
7
tests/19_until.plthy
Normal file
7
tests/19_until.plthy
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
hello|
|
||||||
|
set 0 -> x|
|
||||||
|
do [
|
||||||
|
do print<variable x;>|
|
||||||
|
set variable x+1 -> x|
|
||||||
|
] until variable x = 10|
|
||||||
|
goodbye|
|
Reference in New Issue
Block a user