/* * Copyright (C) 2022 Nick Downing * SPDX-License-Identifier: GPL-2.0-only * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., 51 * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ %{ import t_def import sys %} %locations %token DATA_TEXT %token INT_LITERAL %token FLOAT_LITERAL %token OPERATOR_GE %token OPERATOR_LE %token OPERATOR_NE %token REM_TEXT %token STR_LITERAL %token TOKEN_END 128 %token TOKEN_FOR 129 %token TOKEN_NEXT 130 %token TOKEN_DATA 131 %token TOKEN_INPUT 132 %token TOKEN_DEL 133 %token TOKEN_DIM 134 %token TOKEN_READ 135 %token TOKEN_GR 136 %token TOKEN_TEXT 137 %token TOKEN_PR_HASH 138 %token TOKEN_IN_HASH 139 %token TOKEN_CALL 140 %token TOKEN_PLOT 141 %token TOKEN_HLIN 142 %token TOKEN_VLIN 143 %token TOKEN_HGR2 144 %token TOKEN_HGR 145 %token TOKEN_HCOLOR_EQUAL 146 %token TOKEN_HPLOT 147 %token TOKEN_DRAW 148 %token TOKEN_XDRAW 149 %token TOKEN_HTAB 150 %token TOKEN_HOME 151 %token TOKEN_ROT_EQUAL 152 %token TOKEN_SCALE_EQUAL 153 %token TOKEN_SHLOAD 154 %token TOKEN_TRACE 155 %token TOKEN_NOTRACE 156 %token TOKEN_NORMAL 157 %token TOKEN_INVERSE 158 %token TOKEN_FLASH 159 %token TOKEN_COLOR_EQUAL 160 %token TOKEN_POP 161 %token TOKEN_VTAB 162 %token TOKEN_HIMEM_COLON 163 %token TOKEN_LOMEM_COLON 164 %token TOKEN_ONERR 165 %token TOKEN_RESUME 166 %token TOKEN_RECALL 167 %token TOKEN_STORE 168 %token TOKEN_SPEED_EQUAL 169 %token TOKEN_LET 170 %token TOKEN_GOTO 171 %token TOKEN_RUN 172 %token TOKEN_IF 173 %token TOKEN_RESTORE 174 %token TOKEN_AMPERSAND 175 %token TOKEN_GOSUB 176 %token TOKEN_RETURN 177 %token TOKEN_REM 178 %token TOKEN_STOP 179 %token TOKEN_ON 180 %token TOKEN_WAIT 181 %token TOKEN_LOAD 182 %token TOKEN_SAVE 183 %token TOKEN_DEF 184 %token TOKEN_POKE 185 %token TOKEN_PRINT 186 %token TOKEN_CONT 187 %token TOKEN_LIST 188 %token TOKEN_CLEAR 189 %token TOKEN_GET 190 %token TOKEN_NEW 191 %token TOKEN_TAB_LPAREN 192 %token TOKEN_TO 193 %token TOKEN_FN 194 %token TOKEN_SPC_LPAREN 195 %token TOKEN_THEN 196 %token TOKEN_AT 197 %token TOKEN_NOT 198 %token TOKEN_STEP 199 %token TOKEN_PLUS 200 %token TOKEN_MINUS 201 %token TOKEN_ASTERISK 202 %token TOKEN_SLASH 203 %token TOKEN_CARET 204 %token TOKEN_AND 205 %token TOKEN_OR 206 %token TOKEN_GREATER_THAN 207 %token TOKEN_EQUAL 208 %token TOKEN_LESS_THAN 209 %token TOKEN_SGN 210 %token TOKEN_INT 211 %token TOKEN_ABS 212 %token TOKEN_USR 213 %token TOKEN_FRE 214 %token TOKEN_SCRN_LPAREN 215 %token TOKEN_PDL 216 %token TOKEN_POS 217 %token TOKEN_SQR 218 %token TOKEN_RND 219 %token TOKEN_LOG 220 %token TOKEN_EXP 221 %token TOKEN_COS 222 %token TOKEN_SIN 223 %token TOKEN_TAN 224 %token TOKEN_ATN 225 %token TOKEN_PEEK 226 %token TOKEN_LEN 227 %token TOKEN_STR_DOLLAR 228 %token TOKEN_VAL 229 %token TOKEN_ASC 230 %token TOKEN_CHR_DOLLAR 231 %token TOKEN_LEFT_DOLLAR 232 %token TOKEN_RIGHT_DOLLAR 233 %token TOKEN_MID_DOLLAR 234 %token VARIABLE_NAME %left TOKEN_OR %left TOKEN_AND %left TOKEN_LESS_THAN TOKEN_EQUAL TOKEN_GREATER_THAN OPERATOR_GE OPERATOR_LE OPERATOR_NE %left TOKEN_PLUS TOKEN_MINUS %left TOKEN_ASTERISK TOKEN_SLASH %left TOKEN_CARET %right UNARY TOKEN_NOT %% program : | program %space (?E{t_def.Line}INT_LITERAL statement_list) '\n' | error '\n' { yyerror('Syntax error\n') yyerrok() } ; statement_list : statement_opt | statement_list ':' statement_opt ; statement_opt : | %space (?E{t_def.StatementEnd}TOKEN_END) | %space (?E{t_def.StatementFor}TOKEN_FOR VARIABLE_NAME TOKEN_EQUAL rvalue TOKEN_TO rvalue) | %space (?E{t_def.StatementFor}TOKEN_FOR VARIABLE_NAME TOKEN_EQUAL rvalue TOKEN_TO rvalue TOKEN_STEP rvalue) | %space (?E{t_def.StatementNext}TOKEN_NEXT) | %space (?E{t_def.StatementNext}TOKEN_NEXT VARIABLE_NAME) | %space (?E{t_def.StatementData}TOKEN_DATA data_item_list) | %space (?E{t_def.StatementInput}TOKEN_INPUT lvalue) | %space (?E{t_def.StatementInput}TOKEN_INPUT STR_LITERAL ';' lvalue) | %space (?E{t_def.StatementDel}TOKEN_DEL) | %space (?E{t_def.StatementDim}TOKEN_DIM dim_item_list) | %space (?E{t_def.StatementRead}TOKEN_READ lvalue_list) | %space (?E{t_def.StatementGr}TOKEN_GR) | %space (?E{t_def.StatementText}TOKEN_TEXT) | %space (?E{t_def.StatementPrHash}TOKEN_PR_HASH rvalue) | %space (?E{t_def.StatementInHash}TOKEN_IN_HASH rvalue) | %space (?E{t_def.StatementCall}TOKEN_CALL rvalue) | %space (?E{t_def.StatementPlot}TOKEN_PLOT rvalue ',' rvalue) | %space (?E{t_def.StatementHLin}TOKEN_HLIN rvalue ',' rvalue TOKEN_AT rvalue) | %space (?E{t_def.StatementVLin}TOKEN_VLIN rvalue ',' rvalue TOKEN_AT rvalue) | %space (?E{t_def.StatementHGR2}TOKEN_HGR2) | %space (?E{t_def.StatementHGR}TOKEN_HGR) | %space (?E{t_def.StatementHColorEqual}TOKEN_HCOLOR_EQUAL rvalue) | %space (?E{t_def.StatementHPlot}TOKEN_HPLOT) | %space (?E{t_def.StatementDraw}TOKEN_DRAW) | %space (?E{t_def.StatementXDraw}TOKEN_XDRAW) | %space (?E{t_def.StatementHTab}TOKEN_HTAB rvalue) | %space (?E{t_def.StatementHome}TOKEN_HOME) | %space (?E{t_def.StatementRotEqual}TOKEN_ROT_EQUAL rvalue) | %space (?E{t_def.StatementScaleEqual}TOKEN_SCALE_EQUAL rvalue) | %space (?E{t_def.StatementShLoad}TOKEN_SHLOAD) | %space (?E{t_def.StatementTrace}TOKEN_TRACE) | %space (?E{t_def.StatementNoTrace}TOKEN_NOTRACE) | %space (?E{t_def.StatementNormal}TOKEN_NORMAL) | %space (?E{t_def.StatementInverse}TOKEN_INVERSE) | %space (?E{t_def.StatementFlash}TOKEN_FLASH) | %space (?E{t_def.StatementColorEqual}TOKEN_COLOR_EQUAL rvalue) | %space (?E{t_def.StatementPop}TOKEN_POP) | %space (?E{t_def.StatementVTab}TOKEN_VTAB rvalue) | %space (?E{t_def.StatementHimemColon}TOKEN_HIMEM_COLON rvalue) | %space (?E{t_def.StatementLomemColon}TOKEN_LOMEM_COLON rvalue) | %space (?E{t_def.StatementOnErr}TOKEN_ONERR TOKEN_GOTO INT_LITERAL) | %space (?E{t_def.StatementResume}TOKEN_RESUME) | %space (?E{t_def.StatementRecall}TOKEN_RECALL) | %space (?E{t_def.StatementStore}TOKEN_STORE) | %space (?E{t_def.StatementSpeedEqual}TOKEN_SPEED_EQUAL rvalue) | %space (?E{t_def.StatementLet}lvalue TOKEN_EQUAL rvalue) | %space (?E{t_def.StatementLet}TOKEN_LET lvalue TOKEN_EQUAL rvalue) | %space (?E{t_def.StatementGoto}TOKEN_GOTO INT_LITERAL) | %space (?E{t_def.StatementRun}TOKEN_RUN) | %space (?E{t_def.StatementIf}TOKEN_IF rvalue TOKEN_THEN) statement_opt | %space (?E{t_def.StatementIf}TOKEN_IF rvalue TOKEN_THEN) %space (?E{t_def.StatementGoto}INT_LITERAL) | %space (?E{t_def.StatementRestore}TOKEN_RESTORE) | %space (?E{t_def.StatementAmpersand}TOKEN_AMPERSAND) | %space (?E{t_def.StatementGosub}TOKEN_GOSUB INT_LITERAL) | %space (?E{t_def.StatementReturn}TOKEN_RETURN) | %space (?E{t_def.StatementRem}TOKEN_REM REM_TEXT) | %space (?E{t_def.StatementStop}TOKEN_STOP) | %space (?E{t_def.StatementOnGoto}TOKEN_ON rvalue TOKEN_GOTO int_literal_list_opt) | %space (?E{t_def.StatementOnGosub}TOKEN_ON rvalue TOKEN_GOSUB int_literal_list_opt) | %space (?E{t_def.StatementWait}TOKEN_WAIT) | %space (?E{t_def.StatementLoad}TOKEN_LOAD) | %space (?E{t_def.StatementSave}TOKEN_SAVE) | %space (?E{t_def.StatementDef}TOKEN_DEF) | %space (?E{t_def.StatementPoke}TOKEN_POKE rvalue ',' rvalue) | %space (?E{t_def.StatementPrint, semicolon = False}TOKEN_PRINT print_item_list0) | %space (?E{t_def.StatementPrint, semicolon = True}TOKEN_PRINT print_item_list1) | %space (?E{t_def.StatementCont}TOKEN_CONT) | %space (?E{t_def.StatementList}TOKEN_LIST) | %space (?E{t_def.StatementClear}TOKEN_CLEAR) | %space (?E{t_def.StatementGet}TOKEN_GET lvalue) | %space (?E{t_def.StatementNew}TOKEN_NEW) ; print_item_list0 : | print_item_list0 print_item | print_item_list1 print_item ; print_item_list1 : print_item_list0 ';' | print_item_list1 ';' ; print_item : rvalue | %space (?E{t_def.RValueTabLParen}TOKEN_TAB_LPAREN rvalue ')') ; lvalue_list : lvalue | lvalue_list ',' lvalue ; int_literal_list_opt : | int_literal_list ; int_literal_list : INT_LITERAL | int_literal_list ',' INT_LITERAL ; data_item_list : data_item | data_item_list ',' data_item ; data_item : (?E{t_def.DataText} %empty) | DATA_TEXT | STR_LITERAL ; dim_item_list : dim_item | dim_item_list ',' dim_item ; dim_item : %space (?E{t_def.DimItem}VARIABLE_NAME '(' rvalue_list ')') ; rvalue_list : rvalue | rvalue_list ',' rvalue ; rvalue : lvalue | '(' rvalue ')' | %space (?E{t_def.RValueStrLiteral}STR_LITERAL) | %space (?E{t_def.RValueFloatLiteral}FLOAT_LITERAL) | %space (?E{t_def.RValueIntLiteral}INT_LITERAL) | %space (?E{t_def.RValueSpcLParen}TOKEN_SPC_LPAREN rvalue ')') | %space (?E{t_def.RValueNot}TOKEN_NOT rvalue) | %space (?E{t_def.RValueSign, sign = 1}TOKEN_PLUS rvalue) %prec UNARY | %space (?E{t_def.RValueSign, sign = -1}TOKEN_MINUS rvalue) %prec UNARY | %space (?E{t_def.RValueAdd}rvalue TOKEN_PLUS rvalue) | %space (?E{t_def.RValueSubtract}rvalue TOKEN_MINUS rvalue) | %space (?E{t_def.RValueMultiply}rvalue TOKEN_ASTERISK rvalue) | %space (?E{t_def.RValueDivide}rvalue TOKEN_SLASH rvalue) | %space (?E{t_def.RValuePower}rvalue TOKEN_CARET rvalue) | %space (?E{t_def.RValueAnd}rvalue TOKEN_AND rvalue) | %space (?E{t_def.RValueOr}rvalue TOKEN_OR rvalue) | %space (?E{t_def.RValueGT}rvalue TOKEN_GREATER_THAN rvalue) | %space (?E{t_def.RValueEqual}rvalue TOKEN_EQUAL rvalue) | %space (?E{t_def.RValueLT}rvalue TOKEN_LESS_THAN rvalue) | %space (?E{t_def.RValueGE}rvalue OPERATOR_GE rvalue) | %space (?E{t_def.RValueLE}rvalue OPERATOR_LE rvalue) | %space (?E{t_def.RValueNE}rvalue OPERATOR_NE rvalue) | %space (?E{t_def.RValueSgn}TOKEN_SGN '(' rvalue ')') | %space (?E{t_def.RValueInt}TOKEN_INT '(' rvalue ')') | %space (?E{t_def.RValueAbs}TOKEN_ABS '(' rvalue ')') | %space (?E{t_def.RValueUsr}TOKEN_USR '(' rvalue ')' ',' STR_LITERAL) | %space (?E{t_def.RValueFre}TOKEN_FRE '(' rvalue ')') | %space (?E{t_def.RValueScrnLParen}TOKEN_SCRN_LPAREN rvalue ',' rvalue ')') | %space (?E{t_def.RValuePdl}TOKEN_PDL '(' rvalue ')') | %space (?E{t_def.RValuePos}TOKEN_POS '(' rvalue ')') | %space (?E{t_def.RValueSqr}TOKEN_SQR '(' rvalue ')') | %space (?E{t_def.RValueRnd}TOKEN_RND '(' rvalue ')') | %space (?E{t_def.RValueLog}TOKEN_LOG '(' rvalue ')') | %space (?E{t_def.RValueExp}TOKEN_EXP '(' rvalue ')') | %space (?E{t_def.RValueCos}TOKEN_COS '(' rvalue ')') | %space (?E{t_def.RValueSin}TOKEN_SIN '(' rvalue ')') | %space (?E{t_def.RValueTan}TOKEN_TAN '(' rvalue ')') | %space (?E{t_def.RValueAtn}TOKEN_ATN '(' rvalue ')') | %space (?E{t_def.RValuePeek}TOKEN_PEEK '(' rvalue ')') | %space (?E{t_def.RValueLen}TOKEN_LEN '(' rvalue ')') | %space (?E{t_def.RValueStrDollar}TOKEN_STR_DOLLAR '(' rvalue ')') | %space (?E{t_def.RValueVal}TOKEN_VAL '(' rvalue ')') | %space (?E{t_def.RValueAsc}TOKEN_ASC '(' rvalue ')') | %space (?E{t_def.RValueChrDollar}TOKEN_CHR_DOLLAR '(' rvalue ')') | %space (?E{t_def.RValueLeftDollar}TOKEN_LEFT_DOLLAR '(' rvalue ',' rvalue ')') | %space (?E{t_def.RValueRightDollar}TOKEN_RIGHT_DOLLAR '(' rvalue ',' rvalue ')') | %space (?E{t_def.RValueMidDollar}TOKEN_MID_DOLLAR '(' rvalue ',' rvalue ')') | %space (?E{t_def.RValueMidDollar}TOKEN_MID_DOLLAR '(' rvalue ',' rvalue ',' rvalue ')') ; lvalue : %space (?E{t_def.LValueVariable}VARIABLE_NAME) | %space (?E{t_def.LValueArray}VARIABLE_NAME '(' rvalue_list ')') ; %% def yyerror(s): sys.stdout.write('{0:s}\n'.format(s)) sys.exit(1)