1#!/usr/bin/tclsh
2#
3# This script appends additional token codes to the end of the
4# parse.h file that lemon generates.  These extra token codes are
5# not used by the parser.  But they are used by the tokenizer and/or
6# the code generator.
7#
8#
9set in [open [lindex $argv 0] rb]
10set max 0
11while {![eof $in]} {
12  set line [gets $in]
13  if {[regexp {^#define TK_} $line]} {
14    puts $line
15    set x [lindex $line 2]
16    if {$x>$max} {set max $x}
17  }
18}
19close $in
20
21# The following are the extra token codes to be added.  SPACE and
22# ILLEGAL *must* be the last two token codes and they must be in that order.
23#
24set extras {
25  TO_TEXT
26  TO_BLOB
27  TO_NUMERIC
28  TO_INT
29  TO_REAL
30  ISNOT
31  END_OF_FILE
32  UNCLOSED_STRING
33  FUNCTION
34  COLUMN
35  AGG_FUNCTION
36  AGG_COLUMN
37  UMINUS
38  UPLUS
39  REGISTER
40  VECTOR
41  SELECT_COLUMN
42  IF_NULL_ROW
43  ASTERISK
44  SPAN
45  SPACE
46  ILLEGAL
47}
48if {[lrange $extras end-1 end]!="SPACE ILLEGAL"} {
49  error "SPACE and ILLEGAL must be the last two token codes and they\
50         must be in that order"
51}
52foreach x $extras {
53  incr max
54  puts [format "#define TK_%-29s %4d" $x $max]
55}
56
57# Some additional #defines related to token codes.
58#
59puts "\n/* The token codes above must all fit in 8 bits */"
60puts [format "#define %-20s %-6s" TKFLG_MASK 0xff]
61puts "\n/* Flags that can be added to a token code when it is not"
62puts "** being stored in a u8: */"
63foreach {fg val comment} {
64  TKFLG_DONTFOLD  0x100  {/* Omit constant folding optimizations */}
65} {
66  puts [format "#define %-20s %-6s %s" $fg $val $comment]
67}
68