Make interpreter accept tokenized input, this solves a problem with IF A > B THEN...
authorNick Downing <nick@ndcode.org>
Tue, 17 May 2022 11:10:26 +0000 (21:10 +1000)
committerNick Downing <nick@ndcode.org>
Tue, 17 May 2022 11:19:06 +0000 (21:19 +1000)
applesoft_basic.l
applesoft_basic.py
applesoft_basic.t
applesoft_basic.y

index 8739728..578bd35 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018 Nick Downing <nick@ndcode.org>
+ * Copyright (C) 2022 Nick Downing <nick@ndcode.org>
  * SPDX-License-Identifier: GPL-2.0-only
  *
  * This program is free software; you can redistribute it and/or modify it
   " "
 }
 <INITIAL>{
-  X\ *P\ *L\ *O\ *T/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_XPLOT
-  }
-  X\ *D\ *R\ *A\ *W/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_XDRAW
-  }
-  W\ *A\ *I\ *T/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_WAIT
-  }
-  V\ *T\ *A\ *B/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_VTAB
-  }
-  V\ *L\ *I\ *N/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_VLIN
-  }
-  V\ *A\ *L/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_VAL
-  }
-  U\ *S\ *R/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_USR
-  }
-  T\ *R\ *A\ *C\ *E/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_TRACE
-  }
-  T\ *O/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_TO
-  }
-  T\ *H\ *E\ *N/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_THEN
-  }
-  T\ *E\ *X\ *T/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_TEXT
-  }
-  T\ *A\ *N/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_TAN
-  }
-  T\ *A\ *B\ *\( {
-    return y_tab.KEYWORD_TAB_LPAREN
-  }
-  S\ *T\ *R\ *\$ {
-    return y_tab.KEYWORD_STR_DOLLAR
-  }
-  S\ *T\ *O\ *R\ *E/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_STORE
-  }
-  S\ *T\ *O\ *P/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_STOP
-  }
-  S\ *T\ *E\ *P/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_STEP
-  }
-  S\ *Q\ *R/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_SQR
-  }
-  S\ *P\ *E\ *E\ *D\ *= {
-    return y_tab.KEYWORD_SPEED_EQUAL
-  }
-  S\ *P\ *C\ *\( {
-    return y_tab.KEYWORD_SPC_LPAREN
-  }
-  S\ *I\ *N/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_SIN
-  }
-  S\ *H\ *L\ *O\ *A\ *D/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_SHLOAD
-  }
-  S\ *G\ *N/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_SGN
-  }
-  S\ *C\ *R\ *N\ *\( {
-    return y_tab.KEYWORD_SCRN_LPAREN
-  }
-  S\ *C\ *A\ *L\ *E\ *= {
-    return y_tab.KEYWORD_SCALE_EQUAL
-  }
-  S\ *A\ *V\ *E/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_SAVE
-  }
-  R\ *I\ *G\ *H\ *T\ *\$ {
-    return y_tab.KEYWORD_RIGHT_DOLLAR
-  }
-  R\ *E\ *T\ *U\ *R\ *N/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_RETURN
-  }
-  R\ *E\ *S\ *U\ *M\ *E/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_RESUME
-  }
-  R\ *E\ *S\ *T\ *O\ *R\ *E/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_RESTORE
-  }
-  R\ *E\ *M/(\ *[A-Z0-9])*(\ *[$%])? {
-    BEGIN(REM)
-    return y_tab.KEYWORD_REM
-  }
-  R\ *E\ *C\ *A\ *L\ *L/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_RECALL
-  }
-  R\ *E\ *A\ *D/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_READ
-  }
-  P\ *R\ *I\ *N\ *T/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_PRINT
-  }
-  P\ *R\ *# {
-    return y_tab.KEYWORD_PR_NUMBER
-  }
-  P\ *O\ *S/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_POS
-  }
-  P\ *O\ *P/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_POP
-  }
-  P\ *O\ *K\ *E/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_POKE
-  }
-  P\ *L\ *O\ *T/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_PLOT
-  }
-  P\ *E\ *E\ *K/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_PEEK
-  }
-  P\ *D\ *L/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_PDL
-  }
-  O\ *R/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_OR
-  }
-  O\ *N\ *E\ *R\ *R/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_ONERR
-  }
-  O\ *N/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_ON
-  }
-  N\ *O\ *T\ *R\ *A\ *C\ *E/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_NOTRACE
-  }
-  N\ *O\ *T/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_NOT
-  }
-  N\ *O\ *R\ *M\ *A\ *L/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_NORMAL
-  }
-  N\ *E\ *X\ *T/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_NEXT
-  }
-  N\ *E\ *W/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_NEW
-  }
-  M\ *I\ *D\ *\$ {
-    return y_tab.KEYWORD_MID_DOLLAR
-  }
-  L\ *O\ *M\ *E\ *M\ *: {
-    return y_tab.KEYWORD_LOMEM_COLON
-  }
-  L\ *O\ *G/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_LOG
-  }
-  L\ *O\ *A\ *D/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_LOAD
-  }
-  L\ *I\ *S\ *T/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_LIST
-  }
-  L\ *E\ *T/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_LET
-  }
-  L\ *E\ *N/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_LEN
-  }
-  L\ *E\ *F\ *T\ *\$ {
-    return y_tab.KEYWORD_LEFT_DOLLAR
-  }
-  I\ *N\ *V\ *E\ *R\ *S\ *E/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_INVERSE
-  }
-  I\ *N\ *T/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_INT
-  }
-  I\ *N\ *P\ *U\ *T/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_INPUT
-  }
-  I\ *N\ *# {
-    return y_tab.KEYWORD_IN_NUMBER
-  }
-  I\ *F/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_IF
-  }
-  H\ *T\ *A\ *B/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_HTAB
-  }
-  H\ *P\ *L\ *O\ *T/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_HPLOT
-  }
-  H\ *O\ *M\ *E/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_HOME
-  }
-  H\ *L\ *I\ *N/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_HLIN
-  }
-  H\ *I\ *M\ *E\ *M\ *: {
-    return y_tab.KEYWORD_HIMEM_COLON
-  }
-  H\ *G\ *R\ *2/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_HGR2
-  }
-  H\ *G\ *R/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_HGR
-  }
-  H\ *C\ *O\ *L\ *O\ *R\ *= {
-    return y_tab.KEYWORD_HCOLOR_EQUAL
-  }
-  G\ *R/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_GR
-  }
-  G\ *O\ *T\ *O/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_GOTO
-  }
-  G\ *O\ *S\ *U\ *B/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_GOSUB
-  }
-  G\ *E\ *T/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_GET
-  }
-  F\ *R\ *E/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_FRE
-  }
-  F\ *O\ *R/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_FOR
-  }
-  F\ *N/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_FN
-  }
-  F\ *L\ *A\ *S\ *H/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_FLASH
-  }
-  E\ *X\ *P/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_EXP
-  }
-  E\ *N\ *D/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_END
-  }
-  D\ *R\ *A\ *W/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_DRAW
-  }
-  D\ *I\ *M/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_DIM
-  }
-  D\ *E\ *L/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_DEL
-  }
-  D\ *E\ *F/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_DEF
-  }
-  D\ *A\ *T\ *A/(\ *[A-Z0-9])*(\ *[$%])? {
+  \x83 {
     BEGIN(DATA)
-    return y_tab.KEYWORD_DATA
-  }
-  C\ *O\ *S/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_COS
+    return ord(yytext)
   }
-  C\ *O\ *N\ *T/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_CONT
-  }
-  C\ *O\ *L\ *O\ *R\ *= {
-    return y_tab.KEYWORD_COLOR_EQUAL
-  }
-  C\ *L\ *E\ *A\ *R/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_CLEAR
-  }
-  C\ *H\ *R\ *\$ {
-    return y_tab.KEYWORD_CHR_DOLLAR
-  }
-  C\ *A\ *L\ *L/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_CALL
-  }
-  A\ *T\ *N/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_ATN
-  }
-  A\ *T/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_AT
-  }
-  A\ *S\ *C/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_ASC
-  }
-  A\ *N\ *D/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_AND
-  }
-  A\ *B\ *S/(\ *[A-Z0-9])*(\ *[$%])? {
-    return y_tab.KEYWORD_ABS
+  \xb2 {
+    BEGIN(REM)
+    return ord(yytext)
   }
   (?E{t_def.IntLiteral}(?E{t_def.Text.Char}[0-9])(\ *(?E{t_def.Text.Char}[0-9]))*) {
     return y_tab.INT_LITERAL
   \"(?E{t_def.StrLiteral}[^"\n]*)\" {
     return y_tab.STR_LITERAL
   }
+  \"(?E{t_def.StrLiteral}[^"\n]*)$ {
+    return y_tab.STR_LITERAL
+  }
 }
 <INITIAL>{
   \>\ *=|=\ *\> {
index c439d56..4f1347b 100755 (executable)
@@ -31,7 +31,7 @@ EXIT_FAILURE = 1
 #assert False
 
 if len(sys.argv) < 2:
-  print(f'usage: {sys.argv[0]:s} program.bas')
+  print(f'usage: {sys.argv[0]:s} program.tok')
   sys.exit(EXIT_FAILURE)
 program_bas = sys.argv[1]
 
index a6f5f6d..e0b6666 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2019 Nick Downing <nick@ndcode.org>
+ * Copyright (C) 2022 Nick Downing <nick@ndcode.org>
  * SPDX-License-Identifier: GPL-2.0-only
  *
  * This program is free software; you can redistribute it and/or modify it
index df99187..0793bb3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018 Nick Downing <nick@ndcode.org>
+ * Copyright (C) 2022 Nick Downing <nick@ndcode.org>
  * SPDX-License-Identifier: GPL-2.0-only
  *
  * This program is free software; you can redistribute it and/or modify it
 %locations
 
 %token DATA_TEXT
-%token KEYWORD_ABS
-%token KEYWORD_AND
-%token KEYWORD_ASC
-%token KEYWORD_AT
-%token KEYWORD_ATN
-%token KEYWORD_CALL
-%token KEYWORD_CHR_DOLLAR
-%token KEYWORD_CLEAR
-%token KEYWORD_COLOR_EQUAL
-%token KEYWORD_CONT
-%token KEYWORD_COS
-%token KEYWORD_DATA
-%token KEYWORD_DEF
-%token KEYWORD_DEL
-%token KEYWORD_DIM
-%token KEYWORD_DRAW
-%token KEYWORD_END
-%token KEYWORD_EXP
-%token KEYWORD_FLASH
-%token KEYWORD_FN
-%token KEYWORD_FOR
-%token KEYWORD_FRE
-%token KEYWORD_GET
-%token KEYWORD_GOSUB
-%token KEYWORD_GOTO
-%token KEYWORD_GR
-%token KEYWORD_HCOLOR_EQUAL
-%token KEYWORD_HGR
-%token KEYWORD_HGR2
-%token KEYWORD_HIMEM_COLON
-%token KEYWORD_HLIN
-%token KEYWORD_HOME
-%token KEYWORD_HPLOT
-%token KEYWORD_HTAB
-%token KEYWORD_IF
-%token KEYWORD_IN_NUMBER
-%token KEYWORD_INPUT
-%token KEYWORD_INT
-%token KEYWORD_INVERSE
-%token KEYWORD_LEFT_DOLLAR
-%token KEYWORD_LEN
-%token KEYWORD_LET
-%token KEYWORD_LIST
-%token KEYWORD_LOAD
-%token KEYWORD_LOG
-%token KEYWORD_LOMEM_COLON
-%token KEYWORD_MID_DOLLAR
-%token KEYWORD_NEW
-%token KEYWORD_NEXT
-%token KEYWORD_NORMAL
-%token KEYWORD_NOT
-%token KEYWORD_NOTRACE
-%token KEYWORD_ON
-%token KEYWORD_ONERR
-%token KEYWORD_OR
-%token KEYWORD_PDL
-%token KEYWORD_PEEK
-%token KEYWORD_PLOT
-%token KEYWORD_POKE
-%token KEYWORD_POP
-%token KEYWORD_POS
-%token KEYWORD_PR_NUMBER
-%token KEYWORD_PRINT
-%token KEYWORD_READ
-%token KEYWORD_RECALL
-%token KEYWORD_REM
-%token KEYWORD_RESTORE
-%token KEYWORD_RESUME
-%token KEYWORD_RETURN
-%token KEYWORD_RIGHT_DOLLAR
-%token KEYWORD_SAVE
-%token KEYWORD_SCALE_EQUAL
-%token KEYWORD_SCRN_LPAREN
-%token KEYWORD_SGN
-%token KEYWORD_SHLOAD
-%token KEYWORD_SIN
-%token KEYWORD_SPC_LPAREN
-%token KEYWORD_SPEED_EQUAL
-%token KEYWORD_SQR
-%token KEYWORD_STEP
-%token KEYWORD_STOP
-%token KEYWORD_STORE
-%token KEYWORD_STR_DOLLAR
-%token KEYWORD_TAB_LPAREN
-%token KEYWORD_TAN
-%token KEYWORD_TEXT
-%token KEYWORD_THEN
-%token KEYWORD_TO
-%token KEYWORD_TRACE
-%token KEYWORD_USR
-%token KEYWORD_VAL
-%token KEYWORD_VLIN
-%token KEYWORD_VTAB
-%token KEYWORD_WAIT
-%token KEYWORD_XDRAW
-%token KEYWORD_XPLOT
 %token INT_LITERAL
 %token FLOAT_LITERAL
 %token OPERATOR_GE
 %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 KEYWORD_OR
-%left KEYWORD_AND
-%left '<' '=' '>' OPERATOR_GE OPERATOR_LE OPERATOR_NE
-%left '+' '-'
-%left '*' '/'
-%left '^'
-%right UNARY KEYWORD_NOT
+%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
 
 %%
 
@@ -155,43 +166,43 @@ statement_list
 
 statement_opt
   :
-  | %space (?E{t_def.StatementLet}lvalue '=' rvalue)
-  | %space (?E{t_def.StatementLet}KEYWORD_LET lvalue '=' rvalue)
-  | %space (?E{t_def.StatementPrint, semicolon = False}KEYWORD_PRINT print_item_list0)
-  | %space (?E{t_def.StatementPrint, semicolon = True}KEYWORD_PRINT print_item_list1)
-  | %space (?E{t_def.StatementGoto}KEYWORD_GOTO INT_LITERAL)
-  | %space (?E{t_def.StatementIf}KEYWORD_IF rvalue KEYWORD_THEN) statement_opt
-  | %space (?E{t_def.StatementIf}KEYWORD_IF rvalue KEYWORD_THEN) %space (?E{t_def.StatementGoto}INT_LITERAL)
-  | %space (?E{t_def.StatementEnd}KEYWORD_END)
-  | %space (?E{t_def.StatementGosub}KEYWORD_GOSUB INT_LITERAL)
-  | %space (?E{t_def.StatementReturn}KEYWORD_RETURN)
-  | %space (?E{t_def.StatementFor}KEYWORD_FOR VARIABLE_NAME '=' rvalue KEYWORD_TO rvalue)
-  | %space (?E{t_def.StatementFor}KEYWORD_FOR VARIABLE_NAME '=' rvalue KEYWORD_TO rvalue KEYWORD_STEP rvalue)
-  | %space (?E{t_def.StatementNext}KEYWORD_NEXT)
-  | %space (?E{t_def.StatementNext}KEYWORD_NEXT VARIABLE_NAME)
-  | %space (?E{t_def.StatementRead}KEYWORD_READ lvalue_list)
-  | %space (?E{t_def.StatementRestore}KEYWORD_RESTORE)
-  | %space (?E{t_def.StatementRestore}KEYWORD_RESTORE INT_LITERAL)
-  | %space (?E{t_def.StatementData}KEYWORD_DATA data_item_list)
-  | %space (?E{t_def.StatementHome}KEYWORD_HOME)
-  | %space (?E{t_def.StatementNormal}KEYWORD_NORMAL)
-  | %space (?E{t_def.StatementInverse}KEYWORD_INVERSE)
-  | %space (?E{t_def.StatementFlash}KEYWORD_FLASH)
-  | %space (?E{t_def.StatementHTab}KEYWORD_HTAB rvalue)
-  | %space (?E{t_def.StatementVTab}KEYWORD_VTAB rvalue)
-  | %space (?E{t_def.StatementGet}KEYWORD_GET lvalue)
-  | %space (?E{t_def.StatementInput}KEYWORD_INPUT lvalue)
-  | %space (?E{t_def.StatementInput}KEYWORD_INPUT STR_LITERAL ';' lvalue)
-  | %space (?E{t_def.StatementDim}KEYWORD_DIM dim_item_list)
-  | %space (?E{t_def.StatementPoke}KEYWORD_POKE rvalue ',' rvalue)
-  | %space (?E{t_def.StatementCall}KEYWORD_CALL rvalue)
-  | %space (?E{t_def.StatementText}KEYWORD_TEXT)
-  | %space (?E{t_def.StatementGr}KEYWORD_GR)
-  | %space (?E{t_def.StatementColorEqual}KEYWORD_COLOR_EQUAL rvalue)
-  | %space (?E{t_def.StatementPlot}KEYWORD_PLOT rvalue ',' rvalue)
-  | %space (?E{t_def.StatementHLin}KEYWORD_HLIN rvalue ',' rvalue KEYWORD_AT rvalue)
-  | %space (?E{t_def.StatementVLin}KEYWORD_VLIN rvalue ',' rvalue KEYWORD_AT rvalue)
-  | %space (?E{t_def.StatementRem}KEYWORD_REM REM_TEXT)
+  | %space (?E{t_def.StatementLet}lvalue TOKEN_EQUAL rvalue)
+  | %space (?E{t_def.StatementLet}TOKEN_LET lvalue TOKEN_EQUAL 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.StatementGoto}TOKEN_GOTO INT_LITERAL)
+  | %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.StatementEnd}TOKEN_END)
+  | %space (?E{t_def.StatementGosub}TOKEN_GOSUB INT_LITERAL)
+  | %space (?E{t_def.StatementReturn}TOKEN_RETURN)
+  | %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.StatementRead}TOKEN_READ lvalue_list)
+  | %space (?E{t_def.StatementRestore}TOKEN_RESTORE)
+  | %space (?E{t_def.StatementRestore}TOKEN_RESTORE INT_LITERAL)
+  | %space (?E{t_def.StatementData}TOKEN_DATA data_item_list)
+  | %space (?E{t_def.StatementHome}TOKEN_HOME)
+  | %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.StatementHTab}TOKEN_HTAB rvalue)
+  | %space (?E{t_def.StatementVTab}TOKEN_VTAB rvalue)
+  | %space (?E{t_def.StatementGet}TOKEN_GET lvalue)
+  | %space (?E{t_def.StatementInput}TOKEN_INPUT lvalue)
+  | %space (?E{t_def.StatementInput}TOKEN_INPUT STR_LITERAL ';' lvalue)
+  | %space (?E{t_def.StatementDim}TOKEN_DIM dim_item_list)
+  | %space (?E{t_def.StatementPoke}TOKEN_POKE rvalue ',' rvalue)
+  | %space (?E{t_def.StatementCall}TOKEN_CALL rvalue)
+  | %space (?E{t_def.StatementText}TOKEN_TEXT)
+  | %space (?E{t_def.StatementGr}TOKEN_GR)
+  | %space (?E{t_def.StatementColorEqual}TOKEN_COLOR_EQUAL 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.StatementRem}TOKEN_REM REM_TEXT)
   ;
 
 print_item_list0
@@ -207,7 +218,7 @@ print_item_list1
 
 print_item
   : rvalue
-  | %space (?E{t_def.RValueTabLParen}KEYWORD_TAB_LPAREN rvalue ')')
+  | %space (?E{t_def.RValueTabLParen}TOKEN_TAB_LPAREN rvalue ')')
   ;
 
 lvalue_list
@@ -246,25 +257,25 @@ 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.RValueNot}KEYWORD_NOT rvalue)
-  | %space (?E{t_def.RValueSign, sign = 1}'+' rvalue) %prec UNARY
-  | %space (?E{t_def.RValueSign, sign = -1}'-' rvalue) %prec UNARY
-  | %space (?E{t_def.RValuePower}rvalue '^' rvalue)
-  | %space (?E{t_def.RValueDivide}rvalue '/' rvalue)
-  | %space (?E{t_def.RValueMultiply}rvalue '*' rvalue)
-  | %space (?E{t_def.RValueSubtract}rvalue '-' rvalue)
-  | %space (?E{t_def.RValueAdd}rvalue '+' 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.RValuePower}rvalue TOKEN_CARET rvalue)
+  | %space (?E{t_def.RValueDivide}rvalue TOKEN_SLASH rvalue)
+  | %space (?E{t_def.RValueMultiply}rvalue TOKEN_ASTERISK rvalue)
+  | %space (?E{t_def.RValueSubtract}rvalue TOKEN_MINUS rvalue)
+  | %space (?E{t_def.RValueAdd}rvalue TOKEN_PLUS rvalue)
   | %space (?E{t_def.RValueNE}rvalue OPERATOR_NE rvalue)
   | %space (?E{t_def.RValueLE}rvalue OPERATOR_LE rvalue)
   | %space (?E{t_def.RValueGE}rvalue OPERATOR_GE rvalue)
-  | %space (?E{t_def.RValueGT}rvalue '>' rvalue)
-  | %space (?E{t_def.RValueEqual}rvalue '=' rvalue)
-  | %space (?E{t_def.RValueLT}rvalue '<' rvalue)
-  | %space (?E{t_def.RValueAnd}rvalue KEYWORD_AND rvalue)
-  | %space (?E{t_def.RValueOr}rvalue KEYWORD_OR rvalue)
-  | %space (?E{t_def.RValueStrDollar}KEYWORD_STR_DOLLAR '(' rvalue ')')
-  | %space (?E{t_def.RValueVal}KEYWORD_VAL '(' rvalue ')')
-  | %space (?E{t_def.RValuePeek}KEYWORD_PEEK '(' 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.RValueAnd}rvalue TOKEN_AND rvalue)
+  | %space (?E{t_def.RValueOr}rvalue TOKEN_OR rvalue)
+  | %space (?E{t_def.RValueStrDollar}TOKEN_STR_DOLLAR '(' rvalue ')')
+  | %space (?E{t_def.RValueVal}TOKEN_VAL '(' rvalue ')')
+  | %space (?E{t_def.RValuePeek}TOKEN_PEEK '(' rvalue ')')
   ;
 
 lvalue