2 * Copyright (C) 2018 Nick Downing <nick@ndcode.org>
3 * SPDX-License-Identifier: GPL-2.0-only
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the Free
7 * Software Foundation; version 2.
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc., 51
16 * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
32 %token KEYWORD_CHR_DOLLAR
34 %token KEYWORD_COLOR_EQUAL
52 %token KEYWORD_HCOLOR_EQUAL
55 %token KEYWORD_HIMEM_COLON
61 %token KEYWORD_IN_NUMBER
64 %token KEYWORD_INVERSE
65 %token KEYWORD_LEFT_DOLLAR
71 %token KEYWORD_LOMEM_COLON
72 %token KEYWORD_MID_DOLLAR
77 %token KEYWORD_NOTRACE
87 %token KEYWORD_PR_NUMBER
92 %token KEYWORD_RESTORE
95 %token KEYWORD_RIGHT_DOLLAR
97 %token KEYWORD_SCALE_EQUAL
98 %token KEYWORD_SCRN_LPAREN
100 %token KEYWORD_SHLOAD
102 %token KEYWORD_SPC_LPAREN
103 %token KEYWORD_SPEED_EQUAL
108 %token KEYWORD_STR_DOLLAR
109 %token KEYWORD_TAB_LPAREN
132 %left '<' '=' '>' OPERATOR_GE OPERATOR_LE OPERATOR_NE
136 %right UNARY KEYWORD_NOT
142 | program %space (?E{t_def.NodeLine}INT_LITERAL statement_list) '\n'
144 yyerror('Syntax error\n')
151 | statement_list ':' statement_opt
156 | %space (?E{t_def.NodeStatementLet}VARIABLE '=' expression)
157 | %space (?E{t_def.NodeStatementLet}KEYWORD_LET VARIABLE '=' expression)
158 | %space (?E{t_def.NodeStatementPrint, semicolon = False}KEYWORD_PRINT print_expression_list0)
159 | %space (?E{t_def.NodeStatementPrint, semicolon = True}KEYWORD_PRINT print_expression_list1)
160 | %space (?E{t_def.NodeStatementGoto}KEYWORD_GOTO INT_LITERAL)
161 | %space (?E{t_def.NodeStatementIf}KEYWORD_IF expression KEYWORD_THEN) statement_opt
162 | %space (?E{t_def.NodeStatementIf}KEYWORD_IF expression KEYWORD_THEN) %space (?E{t_def.NodeStatementGoto}INT_LITERAL)
163 | %space (?E{t_def.NodeStatementEnd}KEYWORD_END)
166 print_expression_list0
168 | print_expression_list0 expression
169 | print_expression_list1 expression
172 print_expression_list1
173 : print_expression_list0 ';'
174 | print_expression_list1 ';'
178 : %space (?E{t_def.NodeExpressionOr}expression KEYWORD_OR expression)
179 | %space (?E{t_def.NodeExpressionAnd}expression KEYWORD_AND expression)
180 | %space (?E{t_def.NodeExpressionLT}expression '<' expression)
181 | %space (?E{t_def.NodeExpressionEqual}expression '=' expression)
182 | %space (?E{t_def.NodeExpressionGT}expression '>' expression)
183 | %space (?E{t_def.NodeExpressionGE}expression OPERATOR_GE expression)
184 | %space (?E{t_def.NodeExpressionLE}expression OPERATOR_LE expression)
185 | %space (?E{t_def.NodeExpressionNE}expression OPERATOR_NE expression)
186 | %space (?E{t_def.NodeExpressionAdd}expression '+' expression)
187 | %space (?E{t_def.NodeExpressionSubtract}expression '-' expression)
188 | %space (?E{t_def.NodeExpressionMultiply}expression '*' expression)
189 | %space (?E{t_def.NodeExpressionDivide}expression '/' expression)
190 | %space (?E{t_def.NodeExpressionPower}expression '^' expression)
191 | %space (?E{t_def.NodeExpressionSign, sign = -1}'-' expression) %prec UNARY
192 | %space (?E{t_def.NodeExpressionSign, sign = 1}'+' expression) %prec UNARY
193 | %space (?E{t_def.NodeExpressionNot}KEYWORD_NOT expression)
195 | %space (?E{t_def.NodeExpressionIntLiteral}INT_LITERAL)
196 | %space (?E{t_def.NodeExpressionFloatLiteral}FLOAT_LITERAL)
197 | %space (?E{t_def.NodeExpressionStrLiteral}STR_LITERAL)
198 | %space (?E{t_def.NodeExpressionVariable}VARIABLE)
203 sys.stdout.write('{0:s}\n'.format(s))