aboutsummaryrefslogtreecommitdiff
path: root/pkg/utilities/nttools/stxtools/vexcompile.x
diff options
context:
space:
mode:
authorJoe Hunkeler <jhunkeler@gmail.com>2015-08-11 16:51:37 -0400
committerJoe Hunkeler <jhunkeler@gmail.com>2015-08-11 16:51:37 -0400
commit40e5a5811c6ffce9b0974e93cdd927cbcf60c157 (patch)
tree4464880c571602d54f6ae114729bf62a89518057 /pkg/utilities/nttools/stxtools/vexcompile.x
downloadiraf-osx-40e5a5811c6ffce9b0974e93cdd927cbcf60c157.tar.gz
Repatch (from linux) of OSX IRAF
Diffstat (limited to 'pkg/utilities/nttools/stxtools/vexcompile.x')
-rw-r--r--pkg/utilities/nttools/stxtools/vexcompile.x973
1 files changed, 973 insertions, 0 deletions
diff --git a/pkg/utilities/nttools/stxtools/vexcompile.x b/pkg/utilities/nttools/stxtools/vexcompile.x
new file mode 100644
index 00000000..c7054b2d
--- /dev/null
+++ b/pkg/utilities/nttools/stxtools/vexcompile.x
@@ -0,0 +1,973 @@
+include <lexnum.h>
+include <ctype.h>
+include <fset.h>
+include "vex.h"
+
+#* HISTORY *
+#* B.Simon ?? original
+# Phil Hodge 12-Jul-2005 Add 'int vex_gettok()' and declare 'debug'
+# to be bool rather than int, in vex_compile.
+
+define YYMAXDEPTH 64
+define YYOPLEN 1
+define yyparse vex_parse
+
+# Tokens generated by xyacc have been moved to vex.h
+
+define yyclearin yychar = -1
+define yyerrok yyerrflag = 0
+define YYMOVE call amovi (Memi[$1], Memi[$2], YYOPLEN)
+define YYERRCODE 256
+
+# line 148 "vexcompile.y"
+
+
+# VEX_COMPILE -- Compile an expression, producing pseudocode
+#
+# This procedure takes a string containing a fortran expression and produces
+# pseudocode that can be evaluated by vex_eval(). The pseudocode is stored in
+# structure adressed by the pointer returned as the function value. This
+# structure is freed by calling vex_free(). If the string begins with an @
+# symbol, the rest of the string is treated as a the name of a file which
+# contains the expression. The expression can contain all the fortran
+# operators, including logical and relational operators and supports all the
+# fortran intrinsic functions which can take real arguments. It also supports
+# conditional expressions of the form: if <expr> then <expr> else <expr>
+# Variables must follow the fortran rules, and may be up to 31 characters long.
+# All variables and constants are treated as real numbers. A variable may
+# contain non-alphanumeric characters if it is preceded by a dollar sign, in
+# which case all characters until the next blank are part of the variable name.
+#
+# B.Simon 21-May-90 Original
+# B.Simon 19-Apr-91 Revised to handle multiple types
+# B.Simon 31-Mar-94 Better syntax error message
+# B.Simon 15-Oct-98 Embed strings in pseudocode
+
+pointer procedure vex_compile (expr)
+
+char expr[ARB] # i: Expression to be parsed
+#--
+include "vex.com"
+
+int ic, fd, len
+bool debug
+pointer sp, pcode
+
+data debug / false /
+
+int open(), stropen(), strlen(), fstati(), yyparse()
+
+int vex_gettok()
+extern vex_gettok
+
+begin
+ # Open the expression as a file
+
+ for (ic = 1; IS_WHITE(expr[ic]); ic = ic + 1)
+ ;
+
+ if (expr[ic] == '@') {
+ fd = open (expr[ic+1], READ_ONLY, TEXT_FILE)
+ len = fstati (fd, F_FILESIZE) + 1
+
+ } else {
+ len = strlen (expr[ic]) + 1
+ fd = stropen (expr[ic], len, READ_ONLY)
+ }
+
+ # Create pseudocode structure
+
+ call malloc (pcode, SZ_VEXSTRUCT, TY_STRUCT)
+
+ call malloc (VEX_CODE(pcode), 2 * len, TY_INT)
+ call stk_init (VEX_STACK(pcode))
+
+ # Initialize parsing common block
+
+ call smark (sp)
+ call salloc (line, SZ_LINE, TY_CHAR)
+
+ ch = line
+ Memc[line] = EOS
+
+ ncode = 0
+ maxcode = 2 * len
+ code = VEX_CODE(pcode)
+ stack = VEX_STACK(pcode)
+
+ # Parse expression to produce reverse polish code
+
+ if (yyparse (fd, debug, vex_gettok) == ERR) {
+ call eprintf ("%s\n%*t^\n")
+ call pargstr (Memc[line])
+ call pargi (ch-line)
+
+ call error (1, "Syntax error in expression")
+ }
+
+ # Clean up and return pseudocode structure
+
+ call stk_clear (VEX_STACK(pcode))
+
+ call close (fd)
+ call sfree (sp)
+ return (pcode)
+end
+
+# VEX_GETTOK -- Get the next token from the input
+
+int procedure vex_gettok (fd, value)
+
+int fd # i: File containing expression to be lexed
+pointer value # o: Address on parse stack to store token
+#--
+include "vex.com"
+
+double constant
+int ic, jc, nc, type, index
+int idftype[4], keytype[3], btype[9]
+pointer sp, errmsg, token
+
+string fn1tok FN1STR
+string fn2tok FN2STR
+
+string idftok "indefi indefr indefd indef"
+data idftype / Y_INT, Y_REAL, Y_DOUBLE, Y_REAL /
+
+string keytok "if then else"
+data keytype / Y_IF, Y_THEN, Y_ELSE /
+
+string btoken ".or. .and. .eq. .ne. .lt. .gt. .le. .ge. .not."
+data btype / Y_OR, Y_AND, Y_EQ, Y_NE, Y_LT, Y_GT, Y_LE, Y_GE, Y_NOT /
+
+string badsymb "Operator not recognized (%s)"
+
+int getline(), lexnum(), ctod(), stridxs(), word_match()
+
+begin
+ # Allocate dynamic memory for strings
+
+ call smark (sp)
+ call salloc (errmsg, SZ_LINE, TY_CHAR)
+ call malloc (token, MAX_TOKEN, TY_CHAR)
+
+ # Skip over leading white space and comments
+
+ while (Memc[ch] <= BLANK || Memc[ch] == CMTCHAR) {
+
+ # If all characters have been read from the current line
+ # or a comment character was found, get the next line
+
+ if (Memc[ch] == EOS || Memc[ch] == CMTCHAR) {
+ ch = line
+ if (getline (fd, Memc[line]) == EOF) {
+ Memc[ch] = EOS
+ break
+ }
+ } else {
+ ch = ch + 1
+ }
+ }
+
+ # The token type is determined from the first character in the token
+
+ Memc[token] = EOS
+
+ # End of expression token
+
+ if (Memc[ch] == EOS) {
+ type = Y_DONE
+
+ # Numeric constant is too difficult to parse,
+ # Pass the job to lexnum and ctod
+
+ } else if (IS_DIGIT(Memc[ch])) {
+
+ ic = 1
+ index = lexnum (Memc[ch], ic, nc)
+ if (index != LEX_REAL) {
+ type = Y_INT
+ } else if (nc > 8) {
+ type = Y_DOUBLE
+ } else {
+ jc = stridxs ("dD", Memc[ch])
+ if (jc == 0 || jc > nc) {
+ type = Y_REAL
+ } else {
+ type = Y_DOUBLE
+ }
+ }
+
+ ic = 1
+ nc = ctod (Memc[ch], ic, constant)
+ nc = min (nc, MAX_TOKEN)
+
+ call strcpy (Memc[ch], Memc[token], nc)
+ ch = ch + ic - 1
+
+ # Token is alphanumeric. Determine what type of token
+
+ } else if (IS_ALPHA (Memc[ch])) {
+
+ # Gather characters in token
+
+ for (ic = 1; ic <= MAX_TOKEN; ic = ic + 1) {
+ if (Memc[ch] != '_' && ! IS_ALNUM(Memc[ch]))
+ break
+
+ if (IS_UPPER(Memc[ch]))
+ Memc[token+ic-1] = TO_LOWER(Memc[ch])
+ else
+ Memc[token+ic-1] = Memc[ch]
+ ch = ch + 1
+ }
+ Memc[token+ic-1] = EOS
+
+ # Check to see if token is string "INDEF"
+
+ index = word_match (Memc[token], idftok)
+
+ if (index > 0) {
+ type = idftype[index]
+ call strupr (Memc[token])
+
+ } else {
+
+ # Check to see if token is function or keyword name
+ # If not, add it as a new variable
+
+ index = word_match (Memc[token], fn1tok)
+ if (index > 0) {
+ type = Y_FN1
+
+ } else {
+ index = word_match (Memc[token], fn2tok)
+ if (index > 0) {
+ type = Y_FN2
+
+ } else {
+ index = word_match (Memc[token], keytok)
+ if (index > 0) {
+ type = keytype[index]
+ Memc[token] = EOS
+ } else {
+ type = Y_VAR
+ }
+ }
+ }
+ }
+
+ # Tokens beginning with a dot are numbers or boolean operators
+
+ } else if (Memc[ch] == DOT) {
+
+ if (IS_DIGIT (Memc[ch+1])) {
+ ic = 1
+ index = lexnum (Memc[ch], ic, nc)
+
+ if (index != LEX_REAL) {
+ type = Y_INT
+ } else if (nc < 9) {
+ type = Y_REAL
+ } else {
+ type = Y_DOUBLE
+ }
+
+ ic = 1
+ nc = ctod (Memc[ch], ic, constant)
+ nc = min (nc, MAX_TOKEN)
+
+ call strcpy (Memc[ch], Memc[token], nc)
+ ch = ch + ic - 1
+
+ } else {
+
+ # Gather characters in token
+
+ ch = ch + 1
+ Memc[token] = DOT
+ for (ic = 2; ic < MAX_TOKEN && Memc[ch] != DOT; ic = ic + 1) {
+ if (Memc[ch] == EOS)
+ break
+ if (IS_UPPER(Memc[ch]))
+ Memc[token+ic-1] = TO_LOWER(Memc[ch])
+ else
+ Memc[token+ic-1] = Memc[ch]
+ ch = ch + 1
+ }
+
+ Memc[token+ic-1] = Memc[ch]
+ Memc[token+ic] = EOS
+ ch = ch + 1
+
+ index = word_match (Memc[token], btoken)
+ if (type > 0) {
+ type = btype[index]
+ } else {
+ call sprintf (Memc[errmsg], SZ_LINE, badsymb)
+ call pargstr (Memc[token])
+ call error (1, Memc[errmsg])
+ }
+ }
+
+ # Characters preceded by a dollar sign are identifiers
+
+ } else if (Memc[ch] == DOLLAR) {
+
+ ch = ch + 1
+ for (ic = 1; ic <= MAX_TOKEN && Memc[ch] > BLANK; ic = ic + 1) {
+ if (IS_UPPER(Memc[ch]))
+ Memc[token+ic-1] = TO_LOWER(Memc[ch])
+ else
+ Memc[token+ic-1] = Memc[ch]
+ ch = ch + 1
+ }
+ Memc[token+ic-1] = EOS
+
+ type = Y_VAR
+
+ # Anything else is a symbol
+
+ } else {
+ switch (Memc[ch]) {
+ case '*':
+ if (Memc[ch+1] != '*') {
+ type = Y_MUL
+ } else {
+ type = Y_POW
+ ch = ch + 1
+ }
+ case '/':
+ type = Y_DIV
+ case '+':
+ type = Y_ADD
+ case '-':
+ type = Y_SUB
+ case '(':
+ type = Y_LPAR
+ case ')':
+ type = Y_RPAR
+ case ',':
+ type = Y_COMMA
+ case '<':
+ if (Memc[ch+1] != '=') {
+ type = Y_LT
+ } else {
+ type = Y_LE
+ ch = ch + 1
+ }
+ case '>':
+ if (Memc[ch+1] != '=') {
+ type = Y_GT
+ } else {
+ type = Y_GE
+ ch = ch + 1
+ }
+ case '|':
+ if (Memc[ch+1] != '|') {
+ type = Y_WRONG
+ } else {
+ type = Y_OR
+ ch = ch + 1
+ }
+ case '&':
+ if (Memc[ch+1] != '&') {
+ type = Y_WRONG
+ } else {
+ type = Y_AND
+ ch = ch + 1
+ }
+ case '=':
+ if (Memc[ch+1] != '=') {
+ type = Y_WRONG
+ } else {
+ type = Y_EQ
+ ch = ch + 1
+ }
+ case '!':
+ if (Memc[ch+1] != '=') {
+ type = Y_NOT
+ } else {
+ type = Y_NE
+ ch = ch + 1
+ }
+ default:
+ Memc[ch+1] = EOS
+ call sprintf (Memc[errmsg], SZ_LINE, badsymb)
+ call pargstr (Memc[ch])
+ call error (1, Memc[errmsg])
+ }
+
+ ch = ch + 1
+ }
+
+ #
+ if (Memc[token] == EOS) {
+ call mfree (token, TY_CHAR)
+ token = NULL
+ }
+
+ Memi[value] = token
+ return (type)
+end
+
+# VEX_ADDCODE -- Add an instruction to the code array
+
+procedure vex_addcode (type)
+
+int type # i: Instruction type
+#--
+include "vex.com"
+
+begin
+
+ if (ncode == maxcode)
+ call error (1, "Expression too complex")
+ else {
+ Memi[code] = type
+ code = code + 1
+ ncode = ncode + 1
+ }
+
+end
+
+# VEX_ADDSTR -- Embed a string constant in the pseudo-code
+
+procedure vex_addstr (token)
+
+pointer token # u: Pointer to token string
+#--
+include "vex.com"
+
+int ic
+
+begin
+ if (token == NULL)
+ call error (1, "Expression token missing")
+
+ if (Memc[token] == EOS)
+ call error (1, "Expression token blank")
+
+ ic = 0
+ repeat {
+ ic = ic + 1
+
+ if (ncode == maxcode)
+ call error (1, "Expression too complex")
+ else {
+ Memi[code] = Memc[token+ic-1]
+ code = code + 1
+ ncode = ncode + 1
+ }
+
+ } until (Memc[token+ic-1] == EOS)
+
+ call mfree (token, TY_CHAR)
+end
+
+# VEX_GETSTR -- Retrieve a token string from the pseudocode array
+
+procedure vex_getstr (op, token, maxch)
+
+pointer op # u: Location of token string in pseudocode
+char token[ARB] # o: Token string
+int maxch # i: Maximum length of token
+#--
+int ic
+
+begin
+ # The token begins one position after op and is
+ # termminated by an EOS
+
+ ic = 0
+ repeat {
+ ic = ic + 1
+ op = op + 1
+ if (ic <= maxch)
+ token[ic] = Memi[op]
+
+ } until (Memi[op] == EOS)
+
+end
+define YYNPROD 27
+define YYLAST 264
+# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
+
+# Parser for yacc output, translated to the IRAF SPP language. The contents
+# of this file form the bulk of the source of the parser produced by Yacc.
+# Yacc recognizes several macros in the yaccpar input source and replaces
+# them as follows:
+# A user suppled "global" definitions and declarations
+# B parser tables
+# C user supplied actions (reductions)
+# The remainder of the yaccpar code is not changed.
+
+define yystack_ 10 # statement labels for gotos
+define yynewstate_ 20
+define yydefault_ 30
+define yyerrlab_ 40
+define yyabort_ 50
+
+define YYFLAG (-1000) # defs used in user actions
+define YYERROR goto yyerrlab_
+define YYACCEPT return (OK)
+define YYABORT return (ERR)
+
+
+# YYPARSE -- Parse the input stream, returning OK if the source is
+# syntactically acceptable (i.e., if compilation is successful),
+# otherwise ERR. The parameters YYMAXDEPTH and YYOPLEN must be
+# supplied by the caller in the %{ ... %} section of the Yacc source.
+# The token value stack is a dynamically allocated array of operand
+# structures, with the length and makeup of the operand structure being
+# application dependent.
+
+int procedure yyparse (fd, yydebug, yylex)
+
+int fd # stream to be parsed
+bool yydebug # print debugging information?
+int yylex() # user-supplied lexical input function
+extern yylex()
+
+short yys[YYMAXDEPTH] # parser stack -- stacks tokens
+pointer yyv # pointer to token value stack
+pointer yyval # value returned by action
+pointer yylval # value of token
+int yyps # token stack pointer
+pointer yypv # value stack pointer
+int yychar # current input token number
+int yyerrflag # error recovery flag
+int yynerrs # number of errors
+
+short yyj, yym # internal variables
+pointer yysp, yypvt
+short yystate, yyn
+int yyxi, i
+errchk salloc, yylex
+
+
+
+short yyexca[70]
+data (yyexca(i),i= 1, 8) / -1, 1, 0, -1, -2, 0, -1, 41/
+data (yyexca(i),i= 9, 16) / 276, 0, 277, 0, 278, 0, 279, 0/
+data (yyexca(i),i= 17, 24) / -2, 18, -1, 42, 276, 0, 277, 0/
+data (yyexca(i),i= 25, 32) / 278, 0, 279, 0, -2, 19, -1, 43/
+data (yyexca(i),i= 33, 40) / 276, 0, 277, 0, 278, 0, 279, 0/
+data (yyexca(i),i= 41, 48) / -2, 20, -1, 44, 276, 0, 277, 0/
+data (yyexca(i),i= 49, 56) / 278, 0, 279, 0, -2, 21, -1, 45/
+data (yyexca(i),i= 57, 64) / 274, 0, 275, 0, -2, 22, -1, 46/
+data (yyexca(i),i= 65, 70) / 274, 0, 275, 0, -2, 23/
+short yyact[264]
+data (yyact(i),i= 1, 8) / 58, 22, 23, 24, 25, 20, 21, 18/
+data (yyact(i),i= 9, 16) / 19, 17, 17, 31, 29, 28, 15, 26/
+data (yyact(i),i= 17, 24) / 27, 22, 23, 24, 25, 20, 21, 18/
+data (yyact(i),i= 25, 32) / 19, 55, 17, 29, 28, 30, 26, 27/
+data (yyact(i),i= 33, 40) / 22, 23, 24, 25, 20, 21, 18, 19/
+data (yyact(i),i= 41, 48) / 54, 17, 20, 21, 18, 19, 1, 17/
+data (yyact(i),i= 49, 56) / 0, 0, 0, 29, 28, 0, 26, 27/
+data (yyact(i),i= 57, 64) / 22, 23, 24, 25, 20, 21, 18, 19/
+data (yyact(i),i= 65, 72) / 53, 17, 18, 19, 0, 17, 0, 0/
+data (yyact(i),i= 73, 80) / 0, 0, 2, 0, 29, 28, 0, 26/
+data (yyact(i),i= 81, 88) / 27, 22, 23, 24, 25, 20, 21, 18/
+data (yyact(i),i= 89, 96) / 19, 51, 17, 0, 0, 0, 0, 0/
+data (yyact(i),i= 97,104) / 0, 0, 0, 0, 0, 29, 28, 0/
+data (yyact(i),i=105,112) / 26, 27, 22, 23, 24, 25, 20, 21/
+data (yyact(i),i=113,120) / 18, 19, 35, 17, 0, 29, 28, 0/
+data (yyact(i),i=121,128) / 26, 27, 22, 23, 24, 25, 20, 21/
+data (yyact(i),i=129,136) / 18, 19, 57, 17, 29, 28, 0, 26/
+data (yyact(i),i=137,144) / 27, 22, 23, 24, 25, 20, 21, 18/
+data (yyact(i),i=145,152) / 19, 28, 17, 26, 27, 22, 23, 24/
+data (yyact(i),i=153,160) / 25, 20, 21, 18, 19, 0, 17, 26/
+data (yyact(i),i=161,168) / 27, 22, 23, 24, 25, 20, 21, 18/
+data (yyact(i),i=169,176) / 19, 3, 17, 14, 0, 0, 6, 7/
+data (yyact(i),i=177,184) / 8, 9, 10, 11, 4, 0, 0, 0/
+data (yyact(i),i=185,192) / 14, 0, 13, 6, 7, 8, 9, 10/
+data (yyact(i),i=193,200) / 11, 4, 12, 0, 0, 14, 0, 13/
+data (yyact(i),i=201,208) / 6, 7, 8, 9, 10, 11, 0, 12/
+data (yyact(i),i=209,216) / 5, 0, 0, 0, 13, 16, 0, 0/
+data (yyact(i),i=217,224) / 0, 0, 0, 0, 12, 32, 33, 34/
+data (yyact(i),i=225,232) / 0, 0, 36, 37, 38, 39, 40, 41/
+data (yyact(i),i=233,240) / 42, 43, 44, 45, 46, 47, 48, 49/
+data (yyact(i),i=241,248) / 50, 0, 0, 0, 52, 0, 0, 0/
+data (yyact(i),i=249,256) / 0, 0, 0, 0, 0, 0, 0, 0/
+data (yyact(i),i=257,264) / 0, 0, 0, 0, 0, 0, 0, 56/
+short yypact[59]
+data (yypact(i),i= 1, 8) / -87,-1000,-256,-1000, -61,-139,-1000,-1000/
+data (yypact(i),i= 9, 16) /-1000,-1000,-229,-247, -61, -61, -61,-1000/
+data (yypact(i),i= 17, 24) /-154, -61, -61, -61, -61, -61, -61, -61/
+data (yypact(i),i= 25, 32) / -61, -61, -61, -61, -61, -61, -61, -61/
+data (yypact(i),i= 33, 40) /-276,-115,-170, -61,-276,-276,-276,-216/
+data (yypact(i),i= 41, 48) /-216,-238,-238,-238,-238,-275,-275,-115/
+data (yypact(i),i= 49, 56) /-127,-195,-220,-1000,-244,-1000, -61, -74/
+data (yypact(i),i= 57, 59) /-259,-1000,-1000/
+short yypgo[4]
+data (yypgo(i),i= 1, 4) / 0, 46, 74, 208/
+short yyr1[27]
+data (yyr1(i),i= 1, 8) / 0, 1, 1, 2, 2, 3, 3, 3/
+data (yyr1(i),i= 9, 16) / 3, 3, 3, 3, 3, 3, 3, 3/
+data (yyr1(i),i= 17, 24) / 3, 3, 3, 3, 3, 3, 3, 3/
+data (yyr1(i),i= 25, 27) / 3, 3, 3/
+short yyr2[27]
+data (yyr2(i),i= 1, 8) / 0, 2, 1, 6, 1, 1, 1, 1/
+data (yyr2(i),i= 9, 16) / 1, 4, 6, 2, 2, 3, 3, 3/
+data (yyr2(i),i= 17, 24) / 3, 3, 3, 3, 3, 3, 3, 3/
+data (yyr2(i),i= 25, 27) / 3, 3, 3/
+short yychk[59]
+data (yychk(i),i= 1, 8) /-1000, -1, -2, 256, 267, -3, 261, 262/
+data (yychk(i),i= 9, 16) / 263, 264, 265, 266, 281, 273, 258, 270/
+data (yychk(i),i= 17, 24) / -3, 285, 282, 283, 280, 281, 276, 277/
+data (yychk(i),i= 25, 32) / 278, 279, 274, 275, 272, 271, 258, 258/
+data (yychk(i),i= 33, 40) / -3, -3, -3, 268, -3, -3, -3, -3/
+data (yychk(i),i= 41, 48) / -3, -3, -3, -3, -3, -3, -3, -3/
+data (yychk(i),i= 49, 56) / -3, -3, -3, 259, -3, 259, 260, 269/
+data (yychk(i),i= 57, 59) / -3, -2, 259/
+short yydef[59]
+data (yydef(i),i= 1, 8) / 0, -2, 0, 2, 0, 4, 5, 6/
+data (yydef(i),i= 9, 16) / 7, 8, 0, 0, 0, 0, 0, 1/
+data (yydef(i),i= 17, 24) / 0, 0, 0, 0, 0, 0, 0, 0/
+data (yydef(i),i= 25, 32) / 0, 0, 0, 0, 0, 0, 0, 0/
+data (yydef(i),i= 33, 40) / 11, 12, 0, 0, 13, 14, 15, 16/
+data (yydef(i),i= 41, 48) / 17, -2, -2, -2, -2, -2, -2, 24/
+data (yydef(i),i= 49, 56) / 25, 0, 0, 26, 0, 9, 0, 0/
+data (yydef(i),i= 57, 59) / 0, 3, 10/
+
+begin
+ call smark (yysp)
+ call salloc (yyv, (YYMAXDEPTH+2) * YYOPLEN, TY_STRUCT)
+
+ # Initialization. The first element of the dynamically allocated
+ # token value stack (yyv) is used for yyval, the second for yylval,
+ # and the actual stack starts with the third element.
+
+ yystate = 0
+ yychar = -1
+ yynerrs = 0
+ yyerrflag = 0
+ yyps = 0
+ yyval = yyv
+ yylval = yyv + YYOPLEN
+ yypv = yylval
+
+yystack_
+ # SHIFT -- Put a state and value onto the stack. The token and
+ # value stacks are logically the same stack, implemented as two
+ # separate arrays.
+
+ if (yydebug) {
+ call printf ("state %d, char 0%o\n")
+ call pargs (yystate)
+ call pargi (yychar)
+ }
+ yyps = yyps + 1
+ yypv = yypv + YYOPLEN
+ if (yyps > YYMAXDEPTH) {
+ call sfree (yysp)
+ call eprintf ("yacc stack overflow\n")
+ return (ERR)
+ }
+ yys[yyps] = yystate
+ YYMOVE (yyval, yypv)
+
+yynewstate_
+ # Process the new state.
+ yyn = yypact[yystate+1]
+
+ if (yyn <= YYFLAG)
+ goto yydefault_ # simple state
+
+ # The variable "yychar" is the lookahead token.
+ if (yychar < 0) {
+ yychar = yylex (fd, yylval)
+ if (yychar < 0)
+ yychar = 0
+ }
+ yyn = yyn + yychar
+ if (yyn < 0 || yyn >= YYLAST)
+ goto yydefault_
+
+ yyn = yyact[yyn+1]
+ if (yychk[yyn+1] == yychar) { # valid shift
+ yychar = -1
+ YYMOVE (yylval, yyval)
+ yystate = yyn
+ if (yyerrflag > 0)
+ yyerrflag = yyerrflag - 1
+ goto yystack_
+ }
+
+yydefault_
+ # Default state action.
+
+ yyn = yydef[yystate+1]
+ if (yyn == -2) {
+ if (yychar < 0) {
+ yychar = yylex (fd, yylval)
+ if (yychar < 0)
+ yychar = 0
+ }
+
+ # Look through exception table.
+ yyxi = 1
+ while ((yyexca[yyxi] != (-1)) || (yyexca[yyxi+1] != yystate))
+ yyxi = yyxi + 2
+ for (yyxi=yyxi+2; yyexca[yyxi] >= 0; yyxi=yyxi+2) {
+ if (yyexca[yyxi] == yychar)
+ break
+ }
+
+ yyn = yyexca[yyxi+1]
+ if (yyn < 0) {
+ call sfree (yysp)
+ return (OK) # ACCEPT -- all done
+ }
+ }
+
+
+ # SYNTAX ERROR -- resume parsing if possible.
+
+ if (yyn == 0) {
+ switch (yyerrflag) {
+ case 0, 1, 2:
+ if (yyerrflag == 0) { # brand new error
+ call eprintf ("syntax error\n")
+yyerrlab_
+ yynerrs = yynerrs + 1
+ # fall through...
+ }
+
+ # case 1:
+ # case 2: incompletely recovered error ... try again
+ yyerrflag = 3
+
+ # Find a state where "error" is a legal shift action.
+ while (yyps >= 1) {
+ yyn = yypact[yys[yyps]+1] + YYERRCODE
+ if ((yyn >= 0) && (yyn < YYLAST) &&
+ (yychk[yyact[yyn+1]+1] == YYERRCODE)) {
+ # Simulate a shift of "error".
+ yystate = yyact[yyn+1]
+ goto yystack_
+ }
+ yyn = yypact[yys[yyps]+1]
+
+ # The current yyps has no shift on "error", pop stack.
+ if (yydebug) {
+ call printf ("error recovery pops state %d, ")
+ call pargs (yys[yyps])
+ call printf ("uncovers %d\n")
+ call pargs (yys[yyps-1])
+ }
+ yyps = yyps - 1
+ yypv = yypv - YYOPLEN
+ }
+
+ # ABORT -- There is no state on the stack with an error shift.
+yyabort_
+ call sfree (yysp)
+ return (ERR)
+
+
+ case 3: # No shift yet; clobber input char.
+
+ if (yydebug) {
+ call printf ("error recovery discards char %d\n")
+ call pargi (yychar)
+ }
+
+ if (yychar == 0)
+ goto yyabort_ # don't discard EOF, quit
+ yychar = -1
+ goto yynewstate_ # try again in the same state
+ }
+ }
+
+
+ # REDUCE -- Reduction by production yyn.
+
+ if (yydebug) {
+ call printf ("reduce %d\n")
+ call pargs (yyn)
+ }
+ yyps = yyps - yyr2[yyn+1]
+ yypvt = yypv
+ yypv = yypv - yyr2[yyn+1] * YYOPLEN
+ YYMOVE (yypv + YYOPLEN, yyval)
+ yym = yyn
+
+ # Consult goto table to find next state.
+ yyn = yyr1[yyn+1]
+ yyj = yypgo[yyn+1] + yys[yyps] + 1
+ if (yyj >= YYLAST)
+ yystate = yyact[yypgo[yyn+1]+1]
+ else {
+ yystate = yyact[yyj+1]
+ if (yychk[yystate+1] != -yyn)
+ yystate = yyact[yypgo[yyn+1]+1]
+ }
+
+ # Perform action associated with the grammar rule, if any.
+ switch (yym) {
+
+case 1:
+# line 34 "vexcompile.y"
+{
+ # Normal exit. Code a stop instruction
+ call vex_addcode (Y_DONE)
+ return (OK)
+ }
+case 2:
+# line 39 "vexcompile.y"
+{
+ return (ERR)
+ }
+case 3:
+# line 44 "vexcompile.y"
+{
+ # Code an if instruction
+ call vex_addcode (Y_IF)
+ }
+case 4:
+# line 48 "vexcompile.y"
+{
+ # Null action
+ }
+case 5:
+# line 53 "vexcompile.y"
+{
+ # Code a push variable instruction
+ call vex_addcode (Y_VAR)
+ call vex_addstr (Memi[yypvt])
+ }
+case 6:
+# line 58 "vexcompile.y"
+{
+ # Code a push variable instruction
+ call vex_addcode (Y_INT)
+ call vex_addstr (Memi[yypvt])
+ }
+case 7:
+# line 63 "vexcompile.y"
+{
+ # Code a push variable instruction
+ call vex_addcode (Y_REAL)
+ call vex_addstr (Memi[yypvt])
+ }
+case 8:
+# line 68 "vexcompile.y"
+{
+ # Code a push variable instruction
+ call vex_addcode (Y_DOUBLE)
+ call vex_addstr (Memi[yypvt])
+ }
+case 9:
+# line 73 "vexcompile.y"
+{
+ # Code a single argument function call
+ call vex_addcode (Y_FN1)
+ call vex_addstr (Memi[yypvt-3*YYOPLEN])
+ }
+case 10:
+# line 78 "vexcompile.y"
+{
+ # Code a double argument function call
+ call vex_addcode (Y_FN2)
+ call vex_addstr (Memi[yypvt-5*YYOPLEN])
+ }
+case 11:
+# line 83 "vexcompile.y"
+{
+ # Code a negation instruction
+ call vex_addcode (Y_NEG)
+ }
+case 12:
+# line 87 "vexcompile.y"
+{
+ # Code a logical not
+ call vex_addcode (Y_NOT)
+ }
+case 13:
+# line 91 "vexcompile.y"
+{
+ # Code an exponentiation instruction
+ call vex_addcode (Y_POW)
+ }
+case 14:
+# line 95 "vexcompile.y"
+{
+ # Code a multiply instruction
+ call vex_addcode (Y_MUL)
+ }
+case 15:
+# line 99 "vexcompile.y"
+{
+ # Code a divide instruction
+ call vex_addcode (Y_DIV)
+ }
+case 16:
+# line 103 "vexcompile.y"
+{
+ # Code an addition instruction
+ call vex_addcode (Y_ADD)
+ }
+case 17:
+# line 107 "vexcompile.y"
+{
+ # Code a subtraction instruction
+ call vex_addcode (Y_SUB)
+ }
+case 18:
+# line 111 "vexcompile.y"
+{
+ # Code a less than instruction
+ call vex_addcode (Y_LT)
+ }
+case 19:
+# line 115 "vexcompile.y"
+{
+ # Code a greater than instruction
+ call vex_addcode (Y_GT)
+ }
+case 20:
+# line 119 "vexcompile.y"
+{
+ # Code a less than or equal instruction
+ call vex_addcode (Y_LE)
+ }
+case 21:
+# line 123 "vexcompile.y"
+{
+ # Code a greater than instruction
+ call vex_addcode (Y_GE)
+ }
+case 22:
+# line 127 "vexcompile.y"
+{
+ # Code a logical equality instruction
+ call vex_addcode (Y_EQ)
+ }
+case 23:
+# line 131 "vexcompile.y"
+{
+ # Code a logical inequality instruction
+ call vex_addcode (Y_NE)
+ }
+case 24:
+# line 135 "vexcompile.y"
+{
+ # Code a logical and instruction
+ call vex_addcode (Y_AND)
+ }
+case 25:
+# line 139 "vexcompile.y"
+{
+ # Code a logical or instruction
+ call vex_addcode (Y_OR)
+ }
+case 26:
+# line 143 "vexcompile.y"
+{
+ # Null action
+ } }
+
+ goto yystack_ # stack new state and value
+end