ref: 3cb33dffa28e39fde7e716ec16936060a437a320
parent: 6828f7bf493cd4c9c332ea769e6e38fbbe258821
author: Jacob Moody <[email protected]>
date: Sat Feb 25 13:54:55 EST 2023
initial plan9 port
--- a/include/asm/section.h
+++ b/include/asm/section.h
@@ -77,6 +77,6 @@
void sect_PushSection(void);
void sect_PopSection(void);
-bool sect_IsSizeKnown(struct Section const NONNULL(name));
+bool sect_IsSizeKnown(struct Section const *name);
#endif // RGBDS_SECTION_H
--- a/include/asm/symbol.h
+++ b/include/asm/symbol.h
@@ -113,7 +113,7 @@
struct Symbol *sym_AddLocalLabel(char const *symName);
struct Symbol *sym_AddLabel(char const *symName);
struct Symbol *sym_AddAnonLabel(void);
-void sym_WriteAnonLabelName(char buf[MIN_NB_ELMS(MAXSYMLEN + 1)], uint32_t ofs, bool neg);
+void sym_WriteAnonLabelName(char *buf, uint32_t ofs, bool neg);
void sym_Export(char const *symName);
struct Symbol *sym_AddEqu(char const *symName, int32_t value);
struct Symbol *sym_RedefEqu(char const *symName, int32_t value);
--- a/include/error.h
+++ b/include/error.h
@@ -16,11 +16,20 @@
extern "C" {
#endif
+#ifdef __plan9__
+void warn(char const *fmt, ...);
+void warnx(char const *fmt, ...);
+void err(char const *fmt, ...);
+void errx(char const *fmt, ...);
+#else
+
void warn(char const NONNULL(fmt), ...) format_(printf, 1, 2);
void warnx(char const NONNULL(fmt), ...) format_(printf, 1, 2);
_Noreturn void err(char const NONNULL(fmt), ...) format_(printf, 1, 2);
_Noreturn void errx(char const NONNULL(fmt), ...) format_(printf, 1, 2);
+
+#endif
#ifdef __cplusplus
}
--- a/include/hashmap.h
+++ b/include/hashmap.h
@@ -15,7 +15,6 @@
#define HASH_NB_BITS 32
#define HALF_HASH_NB_BITS 16
-static_assert(HALF_HASH_NB_BITS * 2 == HASH_NB_BITS, "");
#define HASHMAP_NB_BUCKETS (1 << HALF_HASH_NB_BITS)
// HashMapEntry is internal, please do not attempt to use it
--- a/include/helpers.h
+++ b/include/helpers.h
@@ -25,6 +25,10 @@
#else
#define unreachable_ __builtin_trap
#endif
+#elif defined(__plan9__)
+ #define format_(archetype, str_index, first_arg)
+ #define attr_(...)
+ #define _Noreturn
#else
// Unsupported, but no need to throw a fit
#define format_(archetype, str_index, first_arg)
--- /dev/null
+++ b/mkfile
@@ -1,0 +1,21 @@
+</$objtype/mkfile
+
+DIRS=\
+ asm\
+ link\
+ fix\
+
+all:V:
+ for(i in $DIRS)@{
+ cd src/^$i && mk
+ }
+
+install:V:
+ for(i in $DIRS)@{
+ cd src/^$i && mk install
+ }
+
+clean:V:
+ for(i in $DIRS)@{
+ cd src/^$i && mk clean
+ }
--- /dev/null
+++ b/src/asm/error.c
@@ -1,0 +1,1 @@
+#include "../error.c"
--- /dev/null
+++ b/src/asm/getopt.c
@@ -1,0 +1,1 @@
+#include "../extern/getopt.c"
--- /dev/null
+++ b/src/asm/hashmap.c
@@ -1,0 +1,1 @@
+#include "../hashmap.c"
--- a/src/asm/lexer.c
+++ b/src/asm/lexer.c
@@ -64,6 +64,29 @@
} while (0)
# define munmap(ptr, size) UnmapViewOfFile((ptr))
+#elif defined(__plan9__)
+
+#define MAP_FAILED NULL
+
+// ay carãmba!
+# define mapFile(ptr, fd, path, size) do { \
+ (ptr) = MAP_FAILED; \
+ (ptr) = mallocz(size, 1); \
+ ulong __n, __pos, __size; \
+ __size = size; \
+ __n = __pos = 0; \
+ do{ \
+ __n = read(fd, (ptr) + __pos, __size); \
+ if(__n < 0) \
+ sysfatal("read: %r"); \
+ __pos += __n; \
+ __size -= __n; \
+ } while(__size != 0); \
+} while (0)
+
+#define munmap(ptr, size) free(ptr)
+
+
#else // defined(_MSC_VER) || defined(__MINGW32__)
# include <sys/mman.h>
@@ -290,9 +313,9 @@
#define LEXER_BUF_SIZE 42 // TODO: determine a sane value for this
// The buffer needs to be large enough for the maximum `peekInternal` lookahead distance
-static_assert(LEXER_BUF_SIZE > 1, "Lexer buffer size is too small");
+//static_assert(LEXER_BUF_SIZE > 1, "Lexer buffer size is too small");
// This caps the size of buffer reads, and according to POSIX, passing more than SSIZE_MAX is UB
-static_assert(LEXER_BUF_SIZE <= SSIZE_MAX, "Lexer buffer size is too large");
+//static_assert(LEXER_BUF_SIZE <= SSIZE_MAX, "Lexer buffer size is too large");
struct Expansion {
struct Expansion *parent;
@@ -471,7 +494,7 @@
// Important: do NOT assign to `state->ptr` directly, to avoid a cast that may
// alter an eventual `MAP_FAILED` value. It would also invalidate `state->fd`,
// being on the other side of the union.
- void *mappingAddr;
+ char *mappingAddr;
mapFile(mappingAddr, state->fd, state->path, fileInfo.st_size);
if (mappingAddr == MAP_FAILED) {
--- /dev/null
+++ b/src/asm/linkdefs.c
@@ -1,0 +1,1 @@
+#include "../linkdefs.c"
--- a/src/asm/macro.c
+++ b/src/asm/macro.c
@@ -50,8 +50,10 @@
struct MacroArgs *macro_NewArgs(void)
{
- struct MacroArgs *args = malloc(SIZEOF_ARGS(INITIAL_ARG_SIZE));
+ struct MacroArgs *args;
+ args = malloc(sizeof(*args) + sizeof(args->args[0]) * INITIAL_ARG_SIZE);
+
if (!args)
fatalerror("Unable to register macro arguments: %s\n", strerror(errno));
@@ -73,7 +75,7 @@
// Check that overflow didn't roll us back
if (macArgs->capacity <= macArgs->nbArgs)
fatalerror("Failed to add new macro argument: capacity overflow\n");
- macArgs = realloc(macArgs, SIZEOF_ARGS(macArgs->capacity));
+ macArgs = realloc(macArgs, sizeof(*macArgs) + sizeof(macArgs->args[0]) * macArgs->capacity);
if (!macArgs)
fatalerror("Error adding new macro argument: %s\n", strerror(errno));
}
--- a/src/asm/main.c
+++ b/src/asm/main.c
@@ -73,7 +73,7 @@
char *dest = escaped_str;
if (escaped_str == NULL)
- err("%s: Failed to allocate memory", __func__);
+ err("%r: Failed to allocate memory");
while (*str) {
// All dollars needs to be doubled
--- /dev/null
+++ b/src/asm/mkfile
@@ -1,0 +1,35 @@
+</$objtype/mkfile
+
+TARG=rgbasm
+BIN=$home/bin/$objtype
+
+# ThIs MaKeS It PoRtAbLe
+POSIX=-D PRIu32="%ud" -DPRId32="%d" -DPRIx32="%x" -DPRIX32="%X" -DPRIo32="%o" -DSTDOUT_FILENO=1 -DSTDIN_FILENO=0 -DPRIu8="%ud" -DPRIu16="%ud" -DPRId16="%d" -DPRIx16="%x" -DPRIX16="%X" -DMB_LEN_MAX=4 -DUINT32_C='(uint32_t)'
+
+CFLAGS=-Fpw -I ../../include -I/sys/include/npe -D__plan9__ -D__${objtype}__ $POSIX
+
+OFILES=\
+ charmap.$O \
+ fixpoint.$O \
+ format.$O \
+ fstack.$O \
+ lexer.$O \
+ macro.$O \
+ main.$O \
+ opt.$O \
+ output.$O \
+ parser.$O \
+ rpn.$O \
+ section.$O \
+ symbol.$O \
+ util.$O \
+ warning.$O \
+ getopt.$O \
+ utf8decoder.$O \
+ error.$O \
+ hashmap.$O \
+ linkdefs.$O \
+ opmath.$O \
+ version.$O \
+
+</sys/src/cmd/mkone
--- /dev/null
+++ b/src/asm/opmath.c
@@ -1,0 +1,1 @@
+#include "../opmath.c"
--- a/src/asm/opt.c
+++ b/src/asm/opt.c
@@ -147,7 +147,7 @@
case 'r': {
++s; // Skip 'r'
- while (isblank(*s))
+ while (isspace(*s))
++s; // Skip leading whitespace
if (s[0] == '\0') {
--- a/src/asm/output.c
+++ b/src/asm/output.c
@@ -172,6 +172,7 @@
}
fatalerror("Unknown section '%s'\n", sect->name);
+ return -1;
}
static uint32_t getSectIDIfAny(struct Section const *sect)
--- /dev/null
+++ b/src/asm/parser.c
@@ -1,0 +1,6308 @@
+/* A Bison parser, made by GNU Bison 3.8.2. */
+
+/* Bison implementation for Yacc-like parsers in C
+
+ Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation,
+ Inc.
+
+ 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, either version 3 of the License, or
+ (at your option) any later version.
+
+ 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, see <https://www.gnu.org/licenses/>. */
+
+/* As a special exception, you may create a larger work that contains
+ part or all of the Bison parser skeleton and distribute that work
+ under terms of your choice, so long as that work isn't itself a
+ parser generator using the skeleton or a modified version thereof
+ as a parser skeleton. Alternatively, if you modify or redistribute
+ the parser skeleton itself, you may (at your option) remove this
+ special exception, which will cause the skeleton and the resulting
+ Bison output files to be licensed under the GNU General Public
+ License without this special exception.
+
+ This special exception was added by the Free Software Foundation in
+ version 2.2 of Bison. */
+
+/* C LALR(1) parser skeleton written by Richard Stallman, by
+ simplifying the original so-called "semantic" parser. */
+
+/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,
+ especially those whose name start with YY_ or yy_. They are
+ private implementation details that can be changed or removed. */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+ infringing on user name space. This should be done even for local
+ variables, as they might otherwise be expanded by user macros.
+ There are some unavoidable exceptions within include files to
+ define necessary library symbols; they are noted "INFRINGES ON
+ USER NAME SPACE" below. */
+
+/* Identify Bison output, and Bison version. */
+#define YYBISON 30802
+
+/* Bison version string. */
+#define YYBISON_VERSION "3.8.2"
+
+/* Skeleton name. */
+#define YYSKELETON_NAME "yacc.c"
+
+/* Pure parsers. */
+#define YYPURE 0
+
+/* Push parsers. */
+#define YYPUSH 0
+
+/* Pull parsers. */
+#define YYPULL 1
+
+
+
+
+/* First part of user prologue. */
+#line 9 "src/asm/parser.y"
+
+#include <ctype.h>
+#include <errno.h>
+#include <inttypes.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "asm/charmap.h"
+#include "asm/fixpoint.h"
+#include "asm/format.h"
+#include "asm/fstack.h"
+#include "asm/lexer.h"
+#include "asm/macro.h"
+#include "asm/main.h"
+#include "asm/opt.h"
+#include "asm/output.h"
+#include "asm/rpn.h"
+#include "asm/section.h"
+#include "asm/symbol.h"
+#include "asm/util.h"
+#include "asm/warning.h"
+
+#include "extern/utf8decoder.h"
+
+#include "linkdefs.h"
+#include "platform.h" // strncasecmp, strdup
+
+static struct CaptureBody captureBody; // Captures a REPT/FOR or MACRO
+
+static void upperstring(char *dest, char const *src)
+{
+ while (*src)
+ *dest++ = toupper(*src++);
+ *dest = '\0';
+}
+
+static void lowerstring(char *dest, char const *src)
+{
+ while (*src)
+ *dest++ = tolower(*src++);
+ *dest = '\0';
+}
+
+static uint32_t str2int2(uint8_t *s, uint32_t length)
+{
+ if (length > 4)
+ warning(WARNING_NUMERIC_STRING_1,
+ "Treating string as a number ignores first %" PRIu32 " character%s\n",
+ length - 4, length == 5 ? "" : "s");
+ else if (length > 1)
+ warning(WARNING_NUMERIC_STRING_2,
+ "Treating %" PRIu32 "-character string as a number\n", length);
+
+ uint32_t r = 0;
+
+ for (uint32_t i = length < 4 ? 0 : length - 4; i < length; i++) {
+ r <<= 8;
+ r |= s[i];
+ }
+
+ return r;
+}
+
+static const char *strrstr(char const *s1, char const *s2)
+{
+ size_t len1 = strlen(s1);
+ size_t len2 = strlen(s2);
+
+ if (len2 > len1)
+ return NULL;
+
+ for (char const *p = s1 + len1 - len2; p >= s1; p--)
+ if (!strncmp(p, s2, len2))
+ return p;
+
+ return NULL;
+}
+
+static void errorInvalidUTF8Byte(uint8_t byte, char const *functionName)
+{
+ error("%s: Invalid UTF-8 byte 0x%02hhX\n", functionName, byte);
+}
+
+static size_t strlenUTF8(char const *s)
+{
+ size_t len = 0;
+ uint32_t state = 0;
+
+ for (uint32_t codep = 0; *s; s++) {
+ uint8_t byte = *s;
+
+ switch (decode(&state, &codep, byte)) {
+ case 1:
+ errorInvalidUTF8Byte(byte, "STRLEN");
+ state = 0;
+ // fallthrough
+ case 0:
+ len++;
+ break;
+ }
+ }
+
+ // Check for partial code point.
+ if (state != 0)
+ error("STRLEN: Incomplete UTF-8 character\n");
+
+ return len;
+}
+
+static void strsubUTF8(char *dest, size_t destLen, char const *src, uint32_t pos, uint32_t len)
+{
+ size_t srcIndex = 0;
+ size_t destIndex = 0;
+ uint32_t state = 0;
+ uint32_t codep = 0;
+ uint32_t curLen = 0;
+ uint32_t curPos = 1;
+
+ // Advance to starting position in source string.
+ while (src[srcIndex] && curPos < pos) {
+ switch (decode(&state, &codep, src[srcIndex])) {
+ case 1:
+ errorInvalidUTF8Byte(src[srcIndex], "STRSUB");
+ state = 0;
+ // fallthrough
+ case 0:
+ curPos++;
+ break;
+ }
+ srcIndex++;
+ }
+
+ // A position 1 past the end of the string is allowed, but will trigger the
+ // "Length too big" warning below if the length is nonzero.
+ if (!src[srcIndex] && pos > curPos)
+ warning(WARNING_BUILTIN_ARG,
+ "STRSUB: Position %" PRIu32 " is past the end of the string\n", pos);
+
+ // Copy from source to destination.
+ while (src[srcIndex] && destIndex < destLen - 1 && curLen < len) {
+ switch (decode(&state, &codep, src[srcIndex])) {
+ case 1:
+ errorInvalidUTF8Byte(src[srcIndex], "STRSUB");
+ state = 0;
+ // fallthrough
+ case 0:
+ curLen++;
+ break;
+ }
+ dest[destIndex++] = src[srcIndex++];
+ }
+
+ if (curLen < len)
+ warning(WARNING_BUILTIN_ARG, "STRSUB: Length too big: %" PRIu32 "\n", len);
+
+ // Check for partial code point.
+ if (state != 0)
+ error("STRSUB: Incomplete UTF-8 character\n");
+
+ dest[destIndex] = '\0';
+}
+
+static size_t charlenUTF8(char const *s)
+{
+ size_t len;
+
+ for (len = 0; charmap_ConvertNext(&s, NULL); len++)
+ ;
+
+ return len;
+}
+
+static void charsubUTF8(char *dest, char const *src, uint32_t pos)
+{
+ size_t charLen = 1;
+
+ // Advance to starting position in source string.
+ for (uint32_t curPos = 1; charLen && curPos < pos; curPos++)
+ charLen = charmap_ConvertNext(&src, NULL);
+
+ char const *start = src;
+
+ if (!charmap_ConvertNext(&src, NULL))
+ warning(WARNING_BUILTIN_ARG,
+ "CHARSUB: Position %" PRIu32 " is past the end of the string\n", pos);
+
+ // Copy from source to destination.
+ memcpy(dest, start, src - start);
+
+ dest[src - start] = '\0';
+}
+
+static uint32_t adjustNegativePos(int32_t pos, size_t len, char const *functionName)
+{
+ // STRSUB and CHARSUB adjust negative `pos` arguments the same way,
+ // such that position -1 is the last character of a string.
+ if (pos < 0)
+ pos += len + 1;
+ if (pos < 1) {
+ warning(WARNING_BUILTIN_ARG, "%s: Position starts at 1\n", functionName);
+ pos = 1;
+ }
+ return (uint32_t)pos;
+}
+
+static void strrpl(char *dest, size_t destLen, char const *src, char const *old, char const *rep)
+{
+ size_t oldLen = strlen(old);
+ size_t repLen = strlen(rep);
+ size_t i = 0;
+
+ if (!oldLen) {
+ warning(WARNING_EMPTY_STRRPL, "STRRPL: Cannot replace an empty string\n");
+ strcpy(dest, src);
+ return;
+ }
+
+ for (char const *next = strstr(src, old); next && *next; next = strstr(src, old)) {
+ // Copy anything before the substring to replace
+ unsigned int lenBefore = next - src;
+
+ memcpy(dest + i, src, lenBefore < destLen - i ? lenBefore : destLen - i);
+ i += next - src;
+ if (i >= destLen)
+ break;
+
+ // Copy the replacement substring
+ memcpy(dest + i, rep, repLen < destLen - i ? repLen : destLen - i);
+ i += repLen;
+ if (i >= destLen)
+ break;
+
+ src = next + oldLen;
+ }
+
+ if (i < destLen) {
+ size_t srcLen = strlen(src);
+
+ // Copy anything after the last replaced substring
+ memcpy(dest + i, src, srcLen < destLen - i ? srcLen : destLen - i);
+ i += srcLen;
+ }
+
+ if (i >= destLen) {
+ warning(WARNING_LONG_STR, "STRRPL: String too long, got truncated\n");
+ i = destLen - 1;
+ }
+ dest[i] = '\0';
+}
+
+static void initStrFmtArgList(struct StrFmtArgList *args)
+{
+ args->nbArgs = 0;
+ args->capacity = INITIAL_STRFMT_ARG_SIZE;
+ args->args = malloc(args->capacity * sizeof(*args->args));
+ if (!args->args)
+ fatalerror("Failed to allocate memory for STRFMT arg list: %s\n",
+ strerror(errno));
+}
+
+static size_t nextStrFmtArgListIndex(struct StrFmtArgList *args)
+{
+ if (args->nbArgs == args->capacity) {
+ args->capacity = (args->capacity + 1) * 2;
+ args->args = realloc(args->args, args->capacity * sizeof(*args->args));
+ if (!args->args)
+ fatalerror("realloc error while resizing STRFMT arg list: %s\n",
+ strerror(errno));
+ }
+ return args->nbArgs++;
+}
+
+static void freeStrFmtArgList(struct StrFmtArgList *args)
+{
+ free(args->format);
+ for (size_t i = 0; i < args->nbArgs; i++)
+ if (!args->args[i].isNumeric)
+ free(args->args[i].string);
+ free(args->args);
+}
+
+static void strfmt(char *dest, size_t destLen, char const *fmt, size_t nbArgs, struct StrFmtArg *args)
+{
+ size_t a = 0;
+ size_t i = 0;
+
+ while (i < destLen) {
+ int c = *fmt++;
+
+ if (c == '\0') {
+ break;
+ } else if (c != '%') {
+ dest[i++] = c;
+ continue;
+ }
+
+ c = *fmt++;
+
+ if (c == '%') {
+ dest[i++] = c;
+ continue;
+ }
+
+ struct FormatSpec spec = fmt_NewSpec();
+
+ while (c != '\0') {
+ fmt_UseCharacter(&spec, c);
+ if (fmt_IsFinished(&spec))
+ break;
+ c = *fmt++;
+ }
+
+ if (fmt_IsEmpty(&spec)) {
+ error("STRFMT: Illegal '%%' at end of format string\n");
+ dest[i++] = '%';
+ break;
+ } else if (!fmt_IsValid(&spec)) {
+ error("STRFMT: Invalid format spec for argument %zu\n", a + 1);
+ dest[i++] = '%';
+ a++;
+ continue;
+ } else if (a >= nbArgs) {
+ // Will warn after formatting is done.
+ dest[i++] = '%';
+ a++;
+ continue;
+ }
+
+ struct StrFmtArg *arg = &args[a++];
+ static char buf[MAXSTRLEN + 1];
+
+ if (arg->isNumeric)
+ fmt_PrintNumber(buf, sizeof(buf), &spec, arg->number);
+ else
+ fmt_PrintString(buf, sizeof(buf), &spec, arg->string);
+
+ i += snprintf(&dest[i], destLen - i, "%s", buf);
+ }
+
+ if (a < nbArgs)
+ error("STRFMT: %zu unformatted argument(s)\n", nbArgs - a);
+ else if (a > nbArgs)
+ error("STRFMT: Not enough arguments for format spec, got: %zu, need: %zu\n", nbArgs, a);
+
+ if (i > destLen - 1) {
+ warning(WARNING_LONG_STR, "STRFMT: String too long, got truncated\n");
+ i = destLen - 1;
+ }
+ dest[i] = '\0';
+}
+
+static void compoundAssignment(const char *symName, enum RPNCommand op, int32_t constValue) {
+ struct Expression oldExpr, constExpr, newExpr;
+ int32_t newValue;
+
+ rpn_Symbol(&oldExpr, symName);
+ rpn_Number(&constExpr, constValue);
+ rpn_BinaryOp(op, &newExpr, &oldExpr, &constExpr);
+ newValue = rpn_GetConstVal(&newExpr);
+ sym_AddVar(symName, newValue);
+}
+
+static void initDsArgList(struct DsArgList *args)
+{
+ args->nbArgs = 0;
+ args->capacity = INITIAL_DS_ARG_SIZE;
+ args->args = malloc(args->capacity * sizeof(*args->args));
+ if (!args->args)
+ fatalerror("Failed to allocate memory for ds arg list: %s\n",
+ strerror(errno));
+}
+
+static void appendDsArgList(struct DsArgList *args, const struct Expression *expr)
+{
+ if (args->nbArgs == args->capacity) {
+ args->capacity = (args->capacity + 1) * 2;
+ args->args = realloc(args->args, args->capacity * sizeof(*args->args));
+ if (!args->args)
+ fatalerror("realloc error while resizing ds arg list: %s\n",
+ strerror(errno));
+ }
+ args->args[args->nbArgs++] = *expr;
+}
+
+static void freeDsArgList(struct DsArgList *args)
+{
+ free(args->args);
+}
+
+static void failAssert(enum AssertionType type)
+{
+ switch (type) {
+ case ASSERT_FATAL:
+ fatalerror("Assertion failed\n");
+ case ASSERT_ERROR:
+ error("Assertion failed\n");
+ break;
+ case ASSERT_WARN:
+ warning(WARNING_ASSERT, "Assertion failed\n");
+ break;
+ }
+}
+
+static void failAssertMsg(enum AssertionType type, char const *msg)
+{
+ switch (type) {
+ case ASSERT_FATAL:
+ fatalerror("Assertion failed: %s\n", msg);
+ case ASSERT_ERROR:
+ error("Assertion failed: %s\n", msg);
+ break;
+ case ASSERT_WARN:
+ warning(WARNING_ASSERT, "Assertion failed: %s\n", msg);
+ break;
+ }
+}
+
+void yyerror(char const *str)
+{
+ error("%s\n", str);
+}
+
+// The CPU encodes instructions in a logical way, so most instructions actually follow patterns.
+// These enums thus help with bit twiddling to compute opcodes
+enum {
+ REG_B = 0,
+ REG_C,
+ REG_D,
+ REG_E,
+ REG_H,
+ REG_L,
+ REG_HL_IND,
+ REG_A
+};
+
+enum {
+ REG_BC_IND = 0,
+ REG_DE_IND,
+ REG_HL_INDINC,
+ REG_HL_INDDEC,
+};
+
+enum {
+ REG_BC = 0,
+ REG_DE = 1,
+ REG_HL = 2,
+ // LD/INC/ADD/DEC allow SP, PUSH/POP allow AF
+ REG_SP = 3,
+ REG_AF = 3
+};
+
+enum {
+ CC_NZ = 0,
+ CC_Z,
+ CC_NC,
+ CC_C
+};
+
+
+#line 534 "src/asm/parser.c"
+
+# ifndef YY_CAST
+# ifdef __cplusplus
+# define YY_CAST(Type, Val) static_cast<Type> (Val)
+# define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast<Type> (Val)
+# else
+# define YY_CAST(Type, Val) ((Type) (Val))
+# define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val))
+# endif
+# endif
+# ifndef YY_NULLPTR
+# if defined __cplusplus
+# if 201103L <= __cplusplus
+# define YY_NULLPTR nullptr
+# else
+# define YY_NULLPTR 0
+# endif
+# else
+# define YY_NULLPTR ((void*)0)
+# endif
+# endif
+
+#include "parser.h"
+/* Symbol kind. */
+enum yysymbol_kind_t
+{
+ YYSYMBOL_YYEMPTY = -2,
+ YYSYMBOL_YYEOF = 0, /* "end of file" */
+ YYSYMBOL_YYerror = 1, /* error */
+ YYSYMBOL_YYUNDEF = 2, /* "invalid token" */
+ YYSYMBOL_T_NUMBER = 3, /* "number" */
+ YYSYMBOL_T_STRING = 4, /* "string" */
+ YYSYMBOL_T_PERIOD = 5, /* "." */
+ YYSYMBOL_T_COMMA = 6, /* "," */
+ YYSYMBOL_T_COLON = 7, /* ":" */
+ YYSYMBOL_T_LBRACK = 8, /* "[" */
+ YYSYMBOL_T_RBRACK = 9, /* "]" */
+ YYSYMBOL_T_LPAREN = 10, /* "(" */
+ YYSYMBOL_T_RPAREN = 11, /* ")" */
+ YYSYMBOL_T_NEWLINE = 12, /* "newline" */
+ YYSYMBOL_T_OP_LOGICNOT = 13, /* "!" */
+ YYSYMBOL_T_OP_LOGICAND = 14, /* "&&" */
+ YYSYMBOL_T_OP_LOGICOR = 15, /* "||" */
+ YYSYMBOL_T_OP_LOGICGT = 16, /* ">" */
+ YYSYMBOL_T_OP_LOGICLT = 17, /* "<" */
+ YYSYMBOL_T_OP_LOGICGE = 18, /* ">=" */
+ YYSYMBOL_T_OP_LOGICLE = 19, /* "<=" */
+ YYSYMBOL_T_OP_LOGICNE = 20, /* "!=" */
+ YYSYMBOL_T_OP_LOGICEQU = 21, /* "==" */
+ YYSYMBOL_T_OP_ADD = 22, /* "+" */
+ YYSYMBOL_T_OP_SUB = 23, /* "-" */
+ YYSYMBOL_T_OP_OR = 24, /* "|" */
+ YYSYMBOL_T_OP_XOR = 25, /* "^" */
+ YYSYMBOL_T_OP_AND = 26, /* "&" */
+ YYSYMBOL_T_OP_SHL = 27, /* "<<" */
+ YYSYMBOL_T_OP_SHR = 28, /* ">>" */
+ YYSYMBOL_T_OP_USHR = 29, /* ">>>" */
+ YYSYMBOL_T_OP_MUL = 30, /* "*" */
+ YYSYMBOL_T_OP_DIV = 31, /* "/" */
+ YYSYMBOL_T_OP_MOD = 32, /* "%" */
+ YYSYMBOL_T_OP_NOT = 33, /* "~" */
+ YYSYMBOL_NEG = 34, /* NEG */
+ YYSYMBOL_T_OP_EXP = 35, /* "**" */
+ YYSYMBOL_T_OP_DEF = 36, /* "DEF" */
+ YYSYMBOL_T_OP_BANK = 37, /* "BANK" */
+ YYSYMBOL_T_OP_ALIGN = 38, /* "ALIGN" */
+ YYSYMBOL_T_OP_SIZEOF = 39, /* "SIZEOF" */
+ YYSYMBOL_T_OP_STARTOF = 40, /* "STARTOF" */
+ YYSYMBOL_T_OP_SIN = 41, /* "SIN" */
+ YYSYMBOL_T_OP_COS = 42, /* "COS" */
+ YYSYMBOL_T_OP_TAN = 43, /* "TAN" */
+ YYSYMBOL_T_OP_ASIN = 44, /* "ASIN" */
+ YYSYMBOL_T_OP_ACOS = 45, /* "ACOS" */
+ YYSYMBOL_T_OP_ATAN = 46, /* "ATAN" */
+ YYSYMBOL_T_OP_ATAN2 = 47, /* "ATAN2" */
+ YYSYMBOL_T_OP_FDIV = 48, /* "FDIV" */
+ YYSYMBOL_T_OP_FMUL = 49, /* "FMUL" */
+ YYSYMBOL_T_OP_FMOD = 50, /* "FMOD" */
+ YYSYMBOL_T_OP_POW = 51, /* "POW" */
+ YYSYMBOL_T_OP_LOG = 52, /* "LOG" */
+ YYSYMBOL_T_OP_ROUND = 53, /* "ROUND" */
+ YYSYMBOL_T_OP_CEIL = 54, /* "CEIL" */
+ YYSYMBOL_T_OP_FLOOR = 55, /* "FLOOR" */
+ YYSYMBOL_T_OP_HIGH = 56, /* "HIGH" */
+ YYSYMBOL_T_OP_LOW = 57, /* "LOW" */
+ YYSYMBOL_T_OP_ISCONST = 58, /* "ISCONST" */
+ YYSYMBOL_T_OP_STRCMP = 59, /* "STRCMP" */
+ YYSYMBOL_T_OP_STRIN = 60, /* "STRIN" */
+ YYSYMBOL_T_OP_STRRIN = 61, /* "STRRIN" */
+ YYSYMBOL_T_OP_STRSUB = 62, /* "STRSUB" */
+ YYSYMBOL_T_OP_STRLEN = 63, /* "STRLEN" */
+ YYSYMBOL_T_OP_STRCAT = 64, /* "STRCAT" */
+ YYSYMBOL_T_OP_STRUPR = 65, /* "STRUPR" */
+ YYSYMBOL_T_OP_STRLWR = 66, /* "STRLWR" */
+ YYSYMBOL_T_OP_STRRPL = 67, /* "STRRPL" */
+ YYSYMBOL_T_OP_STRFMT = 68, /* "STRFMT" */
+ YYSYMBOL_T_OP_CHARLEN = 69, /* "CHARLEN" */
+ YYSYMBOL_T_OP_CHARSUB = 70, /* "CHARSUB" */
+ YYSYMBOL_T_LABEL = 71, /* "label" */
+ YYSYMBOL_T_ID = 72, /* "identifier" */
+ YYSYMBOL_T_LOCAL_ID = 73, /* "local identifier" */
+ YYSYMBOL_T_ANON = 74, /* "anonymous label" */
+ YYSYMBOL_T_POP_EQU = 75, /* "EQU" */
+ YYSYMBOL_T_POP_EQUAL = 76, /* "=" */
+ YYSYMBOL_T_POP_EQUS = 77, /* "EQUS" */
+ YYSYMBOL_T_POP_ADDEQ = 78, /* "+=" */
+ YYSYMBOL_T_POP_SUBEQ = 79, /* "-=" */
+ YYSYMBOL_T_POP_MULEQ = 80, /* "*=" */
+ YYSYMBOL_T_POP_DIVEQ = 81, /* "/=" */
+ YYSYMBOL_T_POP_MODEQ = 82, /* "%=" */
+ YYSYMBOL_T_POP_OREQ = 83, /* "|=" */
+ YYSYMBOL_T_POP_XOREQ = 84, /* "^=" */
+ YYSYMBOL_T_POP_ANDEQ = 85, /* "&=" */
+ YYSYMBOL_T_POP_SHLEQ = 86, /* "<<=" */
+ YYSYMBOL_T_POP_SHREQ = 87, /* ">>=" */
+ YYSYMBOL_T_POP_INCLUDE = 88, /* "INCLUDE" */
+ YYSYMBOL_T_POP_PRINT = 89, /* "PRINT" */
+ YYSYMBOL_T_POP_PRINTLN = 90, /* "PRINTLN" */
+ YYSYMBOL_T_POP_IF = 91, /* "IF" */
+ YYSYMBOL_T_POP_ELIF = 92, /* "ELIF" */
+ YYSYMBOL_T_POP_ELSE = 93, /* "ELSE" */
+ YYSYMBOL_T_POP_ENDC = 94, /* "ENDC" */
+ YYSYMBOL_T_POP_EXPORT = 95, /* "EXPORT" */
+ YYSYMBOL_T_POP_DB = 96, /* "DB" */
+ YYSYMBOL_T_POP_DS = 97, /* "DS" */
+ YYSYMBOL_T_POP_DW = 98, /* "DW" */
+ YYSYMBOL_T_POP_DL = 99, /* "DL" */
+ YYSYMBOL_T_POP_SECTION = 100, /* "SECTION" */
+ YYSYMBOL_T_POP_FRAGMENT = 101, /* "FRAGMENT" */
+ YYSYMBOL_T_POP_RB = 102, /* "RB" */
+ YYSYMBOL_T_POP_RW = 103, /* "RW" */
+ YYSYMBOL_T_POP_MACRO = 104, /* "MACRO" */
+ YYSYMBOL_T_POP_ENDM = 105, /* "ENDM" */
+ YYSYMBOL_T_POP_RSRESET = 106, /* "RSRESET" */
+ YYSYMBOL_T_POP_RSSET = 107, /* "RSSET" */
+ YYSYMBOL_T_POP_UNION = 108, /* "UNION" */
+ YYSYMBOL_T_POP_NEXTU = 109, /* "NEXTU" */
+ YYSYMBOL_T_POP_ENDU = 110, /* "ENDU" */
+ YYSYMBOL_T_POP_INCBIN = 111, /* "INCBIN" */
+ YYSYMBOL_T_POP_REPT = 112, /* "REPT" */
+ YYSYMBOL_T_POP_FOR = 113, /* "FOR" */
+ YYSYMBOL_T_POP_CHARMAP = 114, /* "CHARMAP" */
+ YYSYMBOL_T_POP_NEWCHARMAP = 115, /* "NEWCHARMAP" */
+ YYSYMBOL_T_POP_SETCHARMAP = 116, /* "SETCHARMAP" */
+ YYSYMBOL_T_POP_PUSHC = 117, /* "PUSHC" */
+ YYSYMBOL_T_POP_POPC = 118, /* "POPC" */
+ YYSYMBOL_T_POP_SHIFT = 119, /* "SHIFT" */
+ YYSYMBOL_T_POP_ENDR = 120, /* "ENDR" */
+ YYSYMBOL_T_POP_BREAK = 121, /* "BREAK" */
+ YYSYMBOL_T_POP_LOAD = 122, /* "LOAD" */
+ YYSYMBOL_T_POP_ENDL = 123, /* "ENDL" */
+ YYSYMBOL_T_POP_FAIL = 124, /* "FAIL" */
+ YYSYMBOL_T_POP_WARN = 125, /* "WARN" */
+ YYSYMBOL_T_POP_FATAL = 126, /* "FATAL" */
+ YYSYMBOL_T_POP_ASSERT = 127, /* "ASSERT" */
+ YYSYMBOL_T_POP_STATIC_ASSERT = 128, /* "STATIC_ASSERT" */
+ YYSYMBOL_T_POP_PURGE = 129, /* "PURGE" */
+ YYSYMBOL_T_POP_REDEF = 130, /* "REDEF" */
+ YYSYMBOL_T_POP_POPS = 131, /* "POPS" */
+ YYSYMBOL_T_POP_PUSHS = 132, /* "PUSHS" */
+ YYSYMBOL_T_POP_POPO = 133, /* "POPO" */
+ YYSYMBOL_T_POP_PUSHO = 134, /* "PUSHO" */
+ YYSYMBOL_T_POP_OPT = 135, /* "OPT" */
+ YYSYMBOL_T_SECT_ROM0 = 136, /* "ROM0" */
+ YYSYMBOL_T_SECT_ROMX = 137, /* "ROMX" */
+ YYSYMBOL_T_SECT_WRAM0 = 138, /* "WRAM0" */
+ YYSYMBOL_T_SECT_WRAMX = 139, /* "WRAMX" */
+ YYSYMBOL_T_SECT_HRAM = 140, /* "HRAM" */
+ YYSYMBOL_T_SECT_VRAM = 141, /* "VRAM" */
+ YYSYMBOL_T_SECT_SRAM = 142, /* "SRAM" */
+ YYSYMBOL_T_SECT_OAM = 143, /* "OAM" */
+ YYSYMBOL_T_Z80_ADC = 144, /* "adc" */
+ YYSYMBOL_T_Z80_ADD = 145, /* "add" */
+ YYSYMBOL_T_Z80_AND = 146, /* "and" */
+ YYSYMBOL_T_Z80_BIT = 147, /* "bit" */
+ YYSYMBOL_T_Z80_CALL = 148, /* "call" */
+ YYSYMBOL_T_Z80_CCF = 149, /* "ccf" */
+ YYSYMBOL_T_Z80_CP = 150, /* "cp" */
+ YYSYMBOL_T_Z80_CPL = 151, /* "cpl" */
+ YYSYMBOL_T_Z80_DAA = 152, /* "daa" */
+ YYSYMBOL_T_Z80_DEC = 153, /* "dec" */
+ YYSYMBOL_T_Z80_DI = 154, /* "di" */
+ YYSYMBOL_T_Z80_EI = 155, /* "ei" */
+ YYSYMBOL_T_Z80_HALT = 156, /* "halt" */
+ YYSYMBOL_T_Z80_INC = 157, /* "inc" */
+ YYSYMBOL_T_Z80_JP = 158, /* "jp" */
+ YYSYMBOL_T_Z80_JR = 159, /* "jr" */
+ YYSYMBOL_T_Z80_LD = 160, /* "ld" */
+ YYSYMBOL_T_Z80_LDI = 161, /* "ldi" */
+ YYSYMBOL_T_Z80_LDD = 162, /* "ldd" */
+ YYSYMBOL_T_Z80_LDH = 163, /* "ldh" */
+ YYSYMBOL_T_Z80_NOP = 164, /* "nop" */
+ YYSYMBOL_T_Z80_OR = 165, /* "or" */
+ YYSYMBOL_T_Z80_POP = 166, /* "pop" */
+ YYSYMBOL_T_Z80_PUSH = 167, /* "push" */
+ YYSYMBOL_T_Z80_RES = 168, /* "res" */
+ YYSYMBOL_T_Z80_RET = 169, /* "ret" */
+ YYSYMBOL_T_Z80_RETI = 170, /* "reti" */
+ YYSYMBOL_T_Z80_RST = 171, /* "rst" */
+ YYSYMBOL_T_Z80_RL = 172, /* "rl" */
+ YYSYMBOL_T_Z80_RLA = 173, /* "rla" */
+ YYSYMBOL_T_Z80_RLC = 174, /* "rlc" */
+ YYSYMBOL_T_Z80_RLCA = 175, /* "rlca" */
+ YYSYMBOL_T_Z80_RR = 176, /* "rr" */
+ YYSYMBOL_T_Z80_RRA = 177, /* "rra" */
+ YYSYMBOL_T_Z80_RRC = 178, /* "rrc" */
+ YYSYMBOL_T_Z80_RRCA = 179, /* "rrca" */
+ YYSYMBOL_T_Z80_SBC = 180, /* "sbc" */
+ YYSYMBOL_T_Z80_SCF = 181, /* "scf" */
+ YYSYMBOL_T_Z80_SET = 182, /* "set" */
+ YYSYMBOL_T_Z80_STOP = 183, /* "stop" */
+ YYSYMBOL_T_Z80_SLA = 184, /* "sla" */
+ YYSYMBOL_T_Z80_SRA = 185, /* "sra" */
+ YYSYMBOL_T_Z80_SRL = 186, /* "srl" */
+ YYSYMBOL_T_Z80_SUB = 187, /* "sub" */
+ YYSYMBOL_T_Z80_SWAP = 188, /* "swap" */
+ YYSYMBOL_T_Z80_XOR = 189, /* "xor" */
+ YYSYMBOL_T_TOKEN_A = 190, /* "a" */
+ YYSYMBOL_T_TOKEN_B = 191, /* "b" */
+ YYSYMBOL_T_TOKEN_C = 192, /* "c" */
+ YYSYMBOL_T_TOKEN_D = 193, /* "d" */
+ YYSYMBOL_T_TOKEN_E = 194, /* "e" */
+ YYSYMBOL_T_TOKEN_H = 195, /* "h" */
+ YYSYMBOL_T_TOKEN_L = 196, /* "l" */
+ YYSYMBOL_T_MODE_AF = 197, /* "af" */
+ YYSYMBOL_T_MODE_BC = 198, /* "bc" */
+ YYSYMBOL_T_MODE_DE = 199, /* "de" */
+ YYSYMBOL_T_MODE_SP = 200, /* "sp" */
+ YYSYMBOL_T_MODE_HL = 201, /* "hl" */
+ YYSYMBOL_T_MODE_HL_DEC = 202, /* "hld/hl-" */
+ YYSYMBOL_T_MODE_HL_INC = 203, /* "hli/hl+" */
+ YYSYMBOL_T_CC_NZ = 204, /* "nz" */
+ YYSYMBOL_T_CC_Z = 205, /* "z" */
+ YYSYMBOL_T_CC_NC = 206, /* "nc" */
+ YYSYMBOL_T_EOB = 207, /* "end of buffer" */
+ YYSYMBOL_YYACCEPT = 208, /* $accept */
+ YYSYMBOL_asmfile = 209, /* asmfile */
+ YYSYMBOL_lines = 210, /* lines */
+ YYSYMBOL_endofline = 211, /* endofline */
+ YYSYMBOL_opt_diff_mark = 212, /* opt_diff_mark */
+ YYSYMBOL_line = 213, /* line */
+ YYSYMBOL_214_1 = 214, /* $@1 */
+ YYSYMBOL_215_2 = 215, /* $@2 */
+ YYSYMBOL_line_directive = 216, /* line_directive */
+ YYSYMBOL_if = 217, /* if */
+ YYSYMBOL_elif = 218, /* elif */
+ YYSYMBOL_else = 219, /* else */
+ YYSYMBOL_plain_directive = 220, /* plain_directive */
+ YYSYMBOL_endc = 221, /* endc */
+ YYSYMBOL_def_id = 222, /* def_id */
+ YYSYMBOL_223_3 = 223, /* $@3 */
+ YYSYMBOL_redef_id = 224, /* redef_id */
+ YYSYMBOL_225_4 = 225, /* $@4 */
+ YYSYMBOL_scoped_id = 226, /* scoped_id */
+ YYSYMBOL_scoped_anon_id = 227, /* scoped_anon_id */
+ YYSYMBOL_label = 228, /* label */
+ YYSYMBOL_macro = 229, /* macro */
+ YYSYMBOL_230_5 = 230, /* $@5 */
+ YYSYMBOL_macroargs = 231, /* macroargs */
+ YYSYMBOL_assignment_directive = 232, /* assignment_directive */
+ YYSYMBOL_directive = 233, /* directive */
+ YYSYMBOL_trailing_comma = 234, /* trailing_comma */
+ YYSYMBOL_compoundeq = 235, /* compoundeq */
+ YYSYMBOL_equ = 236, /* equ */
+ YYSYMBOL_assignment = 237, /* assignment */
+ YYSYMBOL_equs = 238, /* equs */
+ YYSYMBOL_rb = 239, /* rb */
+ YYSYMBOL_rw = 240, /* rw */
+ YYSYMBOL_rl = 241, /* rl */
+ YYSYMBOL_align = 242, /* align */
+ YYSYMBOL_opt = 243, /* opt */
+ YYSYMBOL_244_6 = 244, /* $@6 */
+ YYSYMBOL_opt_list = 245, /* opt_list */
+ YYSYMBOL_opt_list_entry = 246, /* opt_list_entry */
+ YYSYMBOL_popo = 247, /* popo */
+ YYSYMBOL_pusho = 248, /* pusho */
+ YYSYMBOL_pops = 249, /* pops */
+ YYSYMBOL_pushs = 250, /* pushs */
+ YYSYMBOL_fail = 251, /* fail */
+ YYSYMBOL_warn = 252, /* warn */
+ YYSYMBOL_assert_type = 253, /* assert_type */
+ YYSYMBOL_assert = 254, /* assert */
+ YYSYMBOL_shift = 255, /* shift */
+ YYSYMBOL_load = 256, /* load */
+ YYSYMBOL_rept = 257, /* rept */
+ YYSYMBOL_258_7 = 258, /* @7 */
+ YYSYMBOL_for = 259, /* for */
+ YYSYMBOL_260_8 = 260, /* $@8 */
+ YYSYMBOL_261_9 = 261, /* $@9 */
+ YYSYMBOL_262_10 = 262, /* @10 */
+ YYSYMBOL_for_args = 263, /* for_args */
+ YYSYMBOL_break = 264, /* break */
+ YYSYMBOL_macrodef = 265, /* macrodef */
+ YYSYMBOL_266_11 = 266, /* $@11 */
+ YYSYMBOL_267_12 = 267, /* $@12 */
+ YYSYMBOL_268_13 = 268, /* @13 */
+ YYSYMBOL_269_14 = 269, /* @14 */
+ YYSYMBOL_rsset = 270, /* rsset */
+ YYSYMBOL_rsreset = 271, /* rsreset */
+ YYSYMBOL_rs_uconst = 272, /* rs_uconst */
+ YYSYMBOL_union = 273, /* union */
+ YYSYMBOL_nextu = 274, /* nextu */
+ YYSYMBOL_endu = 275, /* endu */
+ YYSYMBOL_ds = 276, /* ds */
+ YYSYMBOL_ds_args = 277, /* ds_args */
+ YYSYMBOL_db = 278, /* db */
+ YYSYMBOL_dw = 279, /* dw */
+ YYSYMBOL_dl = 280, /* dl */
+ YYSYMBOL_def_equ = 281, /* def_equ */
+ YYSYMBOL_redef_equ = 282, /* redef_equ */
+ YYSYMBOL_def_set = 283, /* def_set */
+ YYSYMBOL_def_rb = 284, /* def_rb */
+ YYSYMBOL_def_rw = 285, /* def_rw */
+ YYSYMBOL_def_rl = 286, /* def_rl */
+ YYSYMBOL_def_equs = 287, /* def_equs */
+ YYSYMBOL_redef_equs = 288, /* redef_equs */
+ YYSYMBOL_purge = 289, /* purge */
+ YYSYMBOL_290_15 = 290, /* $@15 */
+ YYSYMBOL_purge_list = 291, /* purge_list */
+ YYSYMBOL_purge_list_entry = 292, /* purge_list_entry */
+ YYSYMBOL_export = 293, /* export */
+ YYSYMBOL_export_list = 294, /* export_list */
+ YYSYMBOL_export_list_entry = 295, /* export_list_entry */
+ YYSYMBOL_include = 296, /* include */
+ YYSYMBOL_incbin = 297, /* incbin */
+ YYSYMBOL_charmap = 298, /* charmap */
+ YYSYMBOL_newcharmap = 299, /* newcharmap */
+ YYSYMBOL_setcharmap = 300, /* setcharmap */
+ YYSYMBOL_pushc = 301, /* pushc */
+ YYSYMBOL_popc = 302, /* popc */
+ YYSYMBOL_print = 303, /* print */
+ YYSYMBOL_println = 304, /* println */
+ YYSYMBOL_print_exprs = 305, /* print_exprs */
+ YYSYMBOL_print_expr = 306, /* print_expr */
+ YYSYMBOL_const_3bit = 307, /* const_3bit */
+ YYSYMBOL_constlist_8bit = 308, /* constlist_8bit */
+ YYSYMBOL_constlist_8bit_entry = 309, /* constlist_8bit_entry */
+ YYSYMBOL_constlist_16bit = 310, /* constlist_16bit */
+ YYSYMBOL_constlist_16bit_entry = 311, /* constlist_16bit_entry */
+ YYSYMBOL_constlist_32bit = 312, /* constlist_32bit */
+ YYSYMBOL_constlist_32bit_entry = 313, /* constlist_32bit_entry */
+ YYSYMBOL_reloc_8bit = 314, /* reloc_8bit */
+ YYSYMBOL_reloc_8bit_no_str = 315, /* reloc_8bit_no_str */
+ YYSYMBOL_reloc_8bit_offset = 316, /* reloc_8bit_offset */
+ YYSYMBOL_reloc_16bit = 317, /* reloc_16bit */
+ YYSYMBOL_reloc_16bit_no_str = 318, /* reloc_16bit_no_str */
+ YYSYMBOL_relocexpr = 319, /* relocexpr */
+ YYSYMBOL_relocexpr_no_str = 320, /* relocexpr_no_str */
+ YYSYMBOL_321_16 = 321, /* $@16 */
+ YYSYMBOL_uconst = 322, /* uconst */
+ YYSYMBOL_const = 323, /* const */
+ YYSYMBOL_const_no_str = 324, /* const_no_str */
+ YYSYMBOL_const_8bit = 325, /* const_8bit */
+ YYSYMBOL_opt_q_arg = 326, /* opt_q_arg */
+ YYSYMBOL_string = 327, /* string */
+ YYSYMBOL_strcat_args = 328, /* strcat_args */
+ YYSYMBOL_strfmt_args = 329, /* strfmt_args */
+ YYSYMBOL_strfmt_va_args = 330, /* strfmt_va_args */
+ YYSYMBOL_section = 331, /* section */
+ YYSYMBOL_sectmod = 332, /* sectmod */
+ YYSYMBOL_sectiontype = 333, /* sectiontype */
+ YYSYMBOL_sectorg = 334, /* sectorg */
+ YYSYMBOL_sectattrs = 335, /* sectattrs */
+ YYSYMBOL_cpu_command = 336, /* cpu_command */
+ YYSYMBOL_z80_adc = 337, /* z80_adc */
+ YYSYMBOL_z80_add = 338, /* z80_add */
+ YYSYMBOL_z80_and = 339, /* z80_and */
+ YYSYMBOL_z80_bit = 340, /* z80_bit */
+ YYSYMBOL_z80_call = 341, /* z80_call */
+ YYSYMBOL_z80_ccf = 342, /* z80_ccf */
+ YYSYMBOL_z80_cp = 343, /* z80_cp */
+ YYSYMBOL_z80_cpl = 344, /* z80_cpl */
+ YYSYMBOL_z80_daa = 345, /* z80_daa */
+ YYSYMBOL_z80_dec = 346, /* z80_dec */
+ YYSYMBOL_z80_di = 347, /* z80_di */
+ YYSYMBOL_z80_ei = 348, /* z80_ei */
+ YYSYMBOL_z80_halt = 349, /* z80_halt */
+ YYSYMBOL_z80_inc = 350, /* z80_inc */
+ YYSYMBOL_z80_jp = 351, /* z80_jp */
+ YYSYMBOL_z80_jr = 352, /* z80_jr */
+ YYSYMBOL_z80_ldi = 353, /* z80_ldi */
+ YYSYMBOL_z80_ldd = 354, /* z80_ldd */
+ YYSYMBOL_z80_ldio = 355, /* z80_ldio */
+ YYSYMBOL_c_ind = 356, /* c_ind */
+ YYSYMBOL_z80_ld = 357, /* z80_ld */
+ YYSYMBOL_z80_ld_hl = 358, /* z80_ld_hl */
+ YYSYMBOL_z80_ld_sp = 359, /* z80_ld_sp */
+ YYSYMBOL_z80_ld_mem = 360, /* z80_ld_mem */
+ YYSYMBOL_z80_ld_cind = 361, /* z80_ld_cind */
+ YYSYMBOL_z80_ld_rr = 362, /* z80_ld_rr */
+ YYSYMBOL_z80_ld_r = 363, /* z80_ld_r */
+ YYSYMBOL_z80_ld_a = 364, /* z80_ld_a */
+ YYSYMBOL_z80_ld_ss = 365, /* z80_ld_ss */
+ YYSYMBOL_z80_nop = 366, /* z80_nop */
+ YYSYMBOL_z80_or = 367, /* z80_or */
+ YYSYMBOL_z80_pop = 368, /* z80_pop */
+ YYSYMBOL_z80_push = 369, /* z80_push */
+ YYSYMBOL_z80_res = 370, /* z80_res */
+ YYSYMBOL_z80_ret = 371, /* z80_ret */
+ YYSYMBOL_z80_reti = 372, /* z80_reti */
+ YYSYMBOL_z80_rl = 373, /* z80_rl */
+ YYSYMBOL_z80_rla = 374, /* z80_rla */
+ YYSYMBOL_z80_rlc = 375, /* z80_rlc */
+ YYSYMBOL_z80_rlca = 376, /* z80_rlca */
+ YYSYMBOL_z80_rr = 377, /* z80_rr */
+ YYSYMBOL_z80_rra = 378, /* z80_rra */
+ YYSYMBOL_z80_rrc = 379, /* z80_rrc */
+ YYSYMBOL_z80_rrca = 380, /* z80_rrca */
+ YYSYMBOL_z80_rst = 381, /* z80_rst */
+ YYSYMBOL_z80_sbc = 382, /* z80_sbc */
+ YYSYMBOL_z80_scf = 383, /* z80_scf */
+ YYSYMBOL_z80_set = 384, /* z80_set */
+ YYSYMBOL_z80_sla = 385, /* z80_sla */
+ YYSYMBOL_z80_sra = 386, /* z80_sra */
+ YYSYMBOL_z80_srl = 387, /* z80_srl */
+ YYSYMBOL_z80_stop = 388, /* z80_stop */
+ YYSYMBOL_z80_sub = 389, /* z80_sub */
+ YYSYMBOL_z80_swap = 390, /* z80_swap */
+ YYSYMBOL_z80_xor = 391, /* z80_xor */
+ YYSYMBOL_op_mem_ind = 392, /* op_mem_ind */
+ YYSYMBOL_op_a_r = 393, /* op_a_r */
+ YYSYMBOL_op_a_n = 394, /* op_a_n */
+ YYSYMBOL_T_MODE_A = 395, /* T_MODE_A */
+ YYSYMBOL_T_MODE_B = 396, /* T_MODE_B */
+ YYSYMBOL_T_MODE_C = 397, /* T_MODE_C */
+ YYSYMBOL_T_MODE_D = 398, /* T_MODE_D */
+ YYSYMBOL_T_MODE_E = 399, /* T_MODE_E */
+ YYSYMBOL_T_MODE_H = 400, /* T_MODE_H */
+ YYSYMBOL_T_MODE_L = 401, /* T_MODE_L */
+ YYSYMBOL_ccode_expr = 402, /* ccode_expr */
+ YYSYMBOL_ccode = 403, /* ccode */
+ YYSYMBOL_reg_r = 404, /* reg_r */
+ YYSYMBOL_reg_tt = 405, /* reg_tt */
+ YYSYMBOL_reg_ss = 406, /* reg_ss */
+ YYSYMBOL_reg_rr = 407, /* reg_rr */
+ YYSYMBOL_hl_ind_inc = 408, /* hl_ind_inc */
+ YYSYMBOL_hl_ind_dec = 409 /* hl_ind_dec */
+};
+typedef enum yysymbol_kind_t yysymbol_kind_t;
+
+
+
+
+#ifdef short
+# undef short
+#endif
+
+/* On compilers that do not define __PTRDIFF_MAX__ etc., make sure
+ <limits.h> and (if available) <stdint.h> are included
+ so that the code can choose integer types of a good width. */
+
+#ifndef __PTRDIFF_MAX__
+# include <limits.h> /* INFRINGES ON USER NAME SPACE */
+# if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__
+# include <stdint.h> /* INFRINGES ON USER NAME SPACE */
+# define YY_STDINT_H
+# endif
+#endif
+
+/* Narrow types that promote to a signed type and that can represent a
+ signed or unsigned integer of at least N bits. In tables they can
+ save space and decrease cache pressure. Promoting to a signed type
+ helps avoid bugs in integer arithmetic. */
+
+#ifdef __INT_LEAST8_MAX__
+typedef __INT_LEAST8_TYPE__ yytype_int8;
+#elif defined YY_STDINT_H
+typedef int_least8_t yytype_int8;
+#else
+typedef signed char yytype_int8;
+#endif
+
+#ifdef __INT_LEAST16_MAX__
+typedef __INT_LEAST16_TYPE__ yytype_int16;
+#elif defined YY_STDINT_H
+typedef int_least16_t yytype_int16;
+#else
+typedef short yytype_int16;
+#endif
+
+/* Work around bug in HP-UX 11.23, which defines these macros
+ incorrectly for preprocessor constants. This workaround can likely
+ be removed in 2023, as HPE has promised support for HP-UX 11.23
+ (aka HP-UX 11i v2) only through the end of 2022; see Table 2 of
+ <https://h20195.www2.hpe.com/V2/getpdf.aspx/4AA4-7673ENW.pdf>. */
+#ifdef __hpux
+# undef UINT_LEAST8_MAX
+# undef UINT_LEAST16_MAX
+# define UINT_LEAST8_MAX 255
+# define UINT_LEAST16_MAX 65535
+#endif
+
+#if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__
+typedef __UINT_LEAST8_TYPE__ yytype_uint8;
+#elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \
+ && UINT_LEAST8_MAX <= INT_MAX)
+typedef uint_least8_t yytype_uint8;
+#elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX
+typedef unsigned char yytype_uint8;
+#else
+typedef short yytype_uint8;
+#endif
+
+#if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__
+typedef __UINT_LEAST16_TYPE__ yytype_uint16;
+#elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \
+ && UINT_LEAST16_MAX <= INT_MAX)
+typedef uint_least16_t yytype_uint16;
+#elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX
+typedef unsigned short yytype_uint16;
+#else
+typedef int yytype_uint16;
+#endif
+
+#ifndef YYPTRDIFF_T
+# if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__
+# define YYPTRDIFF_T __PTRDIFF_TYPE__
+# define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__
+# elif defined PTRDIFF_MAX
+# ifndef ptrdiff_t
+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+# endif
+# define YYPTRDIFF_T ptrdiff_t
+# define YYPTRDIFF_MAXIMUM PTRDIFF_MAX
+# else
+# define YYPTRDIFF_T long
+# define YYPTRDIFF_MAXIMUM LONG_MAX
+# endif
+#endif
+
+#ifndef YYSIZE_T
+# ifdef __SIZE_TYPE__
+# define YYSIZE_T __SIZE_TYPE__
+# elif defined size_t
+# define YYSIZE_T size_t
+# elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__
+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T size_t
+# else
+# define YYSIZE_T unsigned
+# endif
+#endif
+
+#define YYSIZE_MAXIMUM \
+ YY_CAST (YYPTRDIFF_T, \
+ (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1) \
+ ? YYPTRDIFF_MAXIMUM \
+ : YY_CAST (YYSIZE_T, -1)))
+
+#define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X))
+
+
+/* Stored state numbers (used for stacks). */
+typedef yytype_int16 yy_state_t;
+
+/* State numbers in computations. */
+typedef int yy_state_fast_t;
+
+#ifndef YY_
+# if defined YYENABLE_NLS && YYENABLE_NLS
+# if ENABLE_NLS
+# include <libintl.h> /* INFRINGES ON USER NAME SPACE */
+# define YY_(Msgid) dgettext ("bison-runtime", Msgid)
+# endif
+# endif
+# ifndef YY_
+# define YY_(Msgid) Msgid
+# endif
+#endif
+
+
+#ifndef YY_ATTRIBUTE_PURE
+# if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__)
+# define YY_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+# define YY_ATTRIBUTE_PURE
+# endif
+#endif
+
+#ifndef YY_ATTRIBUTE_UNUSED
+# if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__)
+# define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__))
+# else
+# define YY_ATTRIBUTE_UNUSED
+# endif
+#endif
+
+/* Suppress unused-variable warnings by "using" E. */
+#if ! defined lint || defined __GNUC__
+# define YY_USE(E) ((void) (E))
+#else
+# define YY_USE(E) /* empty */
+#endif
+
+/* Suppress an incorrect diagnostic about yylval being uninitialized. */
+#if defined __GNUC__ && ! defined __ICC && 406 <= __GNUC__ * 100 + __GNUC_MINOR__
+# if __GNUC__ * 100 + __GNUC_MINOR__ < 407
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
+ _Pragma ("GCC diagnostic push") \
+ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")
+# else
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
+ _Pragma ("GCC diagnostic push") \
+ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \
+ _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
+# endif
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
+ _Pragma ("GCC diagnostic pop")
+#else
+# define YY_INITIAL_VALUE(Value) Value
+#endif
+#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END
+#endif
+#ifndef YY_INITIAL_VALUE
+# define YY_INITIAL_VALUE(Value) /* Nothing. */
+#endif
+
+#if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__
+# define YY_IGNORE_USELESS_CAST_BEGIN \
+ _Pragma ("GCC diagnostic push") \
+ _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"")
+# define YY_IGNORE_USELESS_CAST_END \
+ _Pragma ("GCC diagnostic pop")
+#endif
+#ifndef YY_IGNORE_USELESS_CAST_BEGIN
+# define YY_IGNORE_USELESS_CAST_BEGIN
+# define YY_IGNORE_USELESS_CAST_END
+#endif
+
+
+#define YY_ASSERT(E) ((void) (0 && (E)))
+
+#if 1
+
+/* The parser invokes alloca or malloc; define the necessary symbols. */
+
+# ifdef YYSTACK_ALLOC
+ /* Pacify GCC's 'empty if-body' warning. */
+# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+# ifndef YYSTACK_ALLOC_MAXIMUM
+ /* The OS might guarantee only one guard page at the bottom of the stack,
+ and a page size can be as small as 4096 bytes. So we cannot safely
+ invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
+ to allow for a few compiler-allocated temporary stack slots. */
+# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
+# endif
+# else
+# define YYSTACK_ALLOC YYMALLOC
+# define YYSTACK_FREE YYFREE
+# ifndef YYSTACK_ALLOC_MAXIMUM
+# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
+# endif
+# if (defined __cplusplus && ! defined EXIT_SUCCESS \
+ && ! ((defined YYMALLOC || defined malloc) \
+ && (defined YYFREE || defined free)))
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+# ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+# endif
+# endif
+# ifndef YYMALLOC
+# define YYMALLOC malloc
+# if ! defined malloc && ! defined EXIT_SUCCESS
+void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
+# endif
+# endif
+# ifndef YYFREE
+# define YYFREE free
+# if ! defined free && ! defined EXIT_SUCCESS
+void free (void *); /* INFRINGES ON USER NAME SPACE */
+# endif
+# endif
+# endif
+# define YYCOPY_NEEDED 1
+#endif /* 1 */
+
+#if (! defined yyoverflow \
+ && (! defined __cplusplus \
+ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member. */
+union yyalloc
+{
+ yy_state_t yyss_alloc;
+ YYSTYPE yyvs_alloc;
+};
+
+/* The size of the maximum gap between one aligned stack and the next. */
+# define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+ N elements. */
+# define YYSTACK_BYTES(N) \
+ ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE)) \
+ + YYSTACK_GAP_MAXIMUM)
+
+# define YYCOPY_NEEDED 1
+
+/* Relocate STACK from its old location to the new one. The
+ local variables YYSIZE and YYSTACKSIZE give the old and new number of
+ elements in the stack, and YYPTR gives the new location of the
+ stack. Advance YYPTR to a properly aligned location for the next
+ stack. */
+# define YYSTACK_RELOCATE(Stack_alloc, Stack) \
+ do \
+ { \
+ YYPTRDIFF_T yynewbytes; \
+ YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \
+ Stack = &yyptr->Stack_alloc; \
+ yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \
+ yyptr += yynewbytes / YYSIZEOF (*yyptr); \
+ } \
+ while (0)
+
+#endif
+
+#if defined YYCOPY_NEEDED && YYCOPY_NEEDED
+/* Copy COUNT objects from SRC to DST. The source and destination do
+ not overlap. */
+# ifndef YYCOPY
+# if defined __GNUC__ && 1 < __GNUC__
+# define YYCOPY(Dst, Src, Count) \
+ __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src)))
+# else
+# define YYCOPY(Dst, Src, Count) \
+ do \
+ { \
+ YYPTRDIFF_T yyi; \
+ for (yyi = 0; yyi < (Count); yyi++) \
+ (Dst)[yyi] = (Src)[yyi]; \
+ } \
+ while (0)
+# endif
+# endif
+#endif /* !YYCOPY_NEEDED */
+
+/* YYFINAL -- State number of the termination state. */
+#define YYFINAL 3
+/* YYLAST -- Last index in YYTABLE. */
+#define YYLAST 2338
+
+/* YYNTOKENS -- Number of terminals. */
+#define YYNTOKENS 208
+/* YYNNTS -- Number of nonterminals. */
+#define YYNNTS 202
+/* YYNRULES -- Number of rules. */
+#define YYNRULES 517
+/* YYNSTATES -- Number of states. */
+#define YYNSTATES 931
+
+/* YYMAXUTOK -- Last valid token kind. */
+#define YYMAXUTOK 462
+
+
+/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM
+ as returned by yylex, with out-of-bounds checking. */
+#define YYTRANSLATE(YYX) YY_CAST (yysymbol_kind_t, YYX)
+
+#if YYDEBUG
+/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
+static const yytype_int16 yyrline[] =
+{
+ 0, 689, 689, 692, 693, 696, 696, 699, 700, 703,
+ 708, 709, 711, 711, 719, 719, 737, 738, 739, 740,
+ 741, 742, 744, 745, 748, 758, 775, 791, 792, 793,
+ 794, 795, 798, 803, 803, 811, 811, 819, 819, 820,
+ 820, 822, 823, 826, 829, 832, 835, 839, 845, 845,
+ 853, 856, 862, 863, 864, 865, 866, 867, 870, 871,
+ 872, 873, 874, 875, 876, 877, 878, 879, 880, 881,
+ 882, 883, 884, 885, 886, 887, 888, 889, 890, 891,
+ 892, 893, 894, 895, 896, 897, 898, 899, 900, 901,
+ 902, 903, 904, 905, 906, 907, 908, 909, 912, 912,
+ 915, 916, 917, 918, 919, 920, 921, 922, 923, 924,
+ 927, 930, 931, 934, 937, 943, 949, 955, 961, 972,
+ 972, 978, 979, 982, 985, 988, 991, 994, 997, 1000,
+ 1003, 1004, 1005, 1006, 1009, 1020, 1031, 1035, 1041, 1042,
+ 1045, 1048, 1051, 1051, 1060, 1062, 1064, 1060, 1072, 1077,
+ 1082, 1089, 1095, 1097, 1099, 1095, 1106, 1106, 1116, 1119,
+ 1122, 1123, 1126, 1129, 1132, 1135, 1136, 1142, 1146, 1152,
+ 1153, 1156, 1157, 1160, 1161, 1164, 1167, 1170, 1171, 1172,
+ 1173, 1176, 1182, 1188, 1194, 1197, 1200, 1200, 1207, 1208,
+ 1211, 1214, 1217, 1218, 1221, 1224, 1231, 1236, 1241, 1248,
+ 1253, 1254, 1257, 1260, 1263, 1266, 1269, 1273, 1279, 1280,
+ 1283, 1284, 1287, 1299, 1300, 1303, 1306, 1315, 1316, 1319,
+ 1322, 1331, 1332, 1335, 1338, 1348, 1354, 1360, 1364, 1370,
+ 1376, 1383, 1384, 1395, 1396, 1397, 1400, 1403, 1406, 1409,
+ 1412, 1415, 1418, 1421, 1424, 1427, 1430, 1433, 1436, 1439,
+ 1442, 1445, 1448, 1451, 1454, 1457, 1460, 1461, 1462, 1463,
+ 1464, 1465, 1466, 1470, 1471, 1472, 1473, 1473, 1480, 1483,
+ 1486, 1489, 1492, 1495, 1498, 1501, 1504, 1507, 1510, 1513,
+ 1516, 1519, 1522, 1525, 1528, 1533, 1538, 1541, 1544, 1547,
+ 1554, 1557, 1560, 1563, 1564, 1574, 1575, 1581, 1587, 1593,
+ 1596, 1599, 1602, 1605, 1608, 1612, 1627, 1628, 1639, 1647,
+ 1650, 1657, 1666, 1671, 1672, 1673, 1676, 1677, 1678, 1679,
+ 1680, 1681, 1682, 1683, 1686, 1687, 1697, 1702, 1705, 1709,
+ 1716, 1717, 1718, 1719, 1720, 1721, 1722, 1723, 1724, 1725,
+ 1726, 1727, 1728, 1729, 1730, 1731, 1732, 1733, 1734, 1735,
+ 1736, 1737, 1738, 1739, 1740, 1741, 1742, 1743, 1744, 1745,
+ 1746, 1747, 1748, 1749, 1750, 1751, 1752, 1753, 1754, 1755,
+ 1756, 1757, 1758, 1759, 1760, 1761, 1764, 1768, 1771, 1775,
+ 1776, 1777, 1784, 1788, 1791, 1797, 1801, 1807, 1810, 1814,
+ 1817, 1820, 1823, 1824, 1827, 1830, 1833, 1845, 1846, 1849,
+ 1853, 1857, 1862, 1866, 1872, 1875, 1880, 1883, 1888, 1894,
+ 1900, 1903, 1908, 1909, 1915, 1916, 1917, 1918, 1919, 1920,
+ 1921, 1922, 1925, 1929, 1935, 1936, 1942, 1946, 1963, 1968,
+ 1973, 1977, 1985, 1991, 1997, 2019, 2023, 2031, 2034, 2038,
+ 2041, 2044, 2047, 2053, 2054, 2057, 2060, 2066, 2069, 2075,
+ 2078, 2084, 2087, 2093, 2096, 2106, 2110, 2113, 2116, 2122,
+ 2128, 2134, 2140, 2144, 2150, 2154, 2157, 2163, 2167, 2170,
+ 2173, 2174, 2177, 2178, 2181, 2182, 2185, 2186, 2189, 2190,
+ 2193, 2194, 2197, 2198, 2201, 2202, 2205, 2206, 2209, 2210,
+ 2215, 2216, 2217, 2218, 2221, 2222, 2223, 2224, 2225, 2226,
+ 2227, 2228, 2231, 2232, 2233, 2234, 2237, 2238, 2239, 2240,
+ 2243, 2244, 2245, 2246, 2249, 2250, 2253, 2254
+};
+#endif
+
+/** Accessing symbol of state STATE. */
+#define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State])
+
+#if 1
+/* The user-facing name of the symbol whose (internal) number is
+ YYSYMBOL. No bounds checking. */
+static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED;
+
+static const char *
+yysymbol_name (yysymbol_kind_t yysymbol)
+{
+ static const char *const yy_sname[] =
+ {
+ "end of file", "error", "invalid token", "number", "string", ".", ",",
+ ":", "[", "]", "(", ")", "newline", "!", "&&", "||", ">", "<", ">=",
+ "<=", "!=", "==", "+", "-", "|", "^", "&", "<<", ">>", ">>>", "*", "/",
+ "%", "~", "NEG", "**", "DEF", "BANK", "ALIGN", "SIZEOF", "STARTOF",
+ "SIN", "COS", "TAN", "ASIN", "ACOS", "ATAN", "ATAN2", "FDIV", "FMUL",
+ "FMOD", "POW", "LOG", "ROUND", "CEIL", "FLOOR", "HIGH", "LOW", "ISCONST",
+ "STRCMP", "STRIN", "STRRIN", "STRSUB", "STRLEN", "STRCAT", "STRUPR",
+ "STRLWR", "STRRPL", "STRFMT", "CHARLEN", "CHARSUB", "label",
+ "identifier", "local identifier", "anonymous label", "EQU", "=", "EQUS",
+ "+=", "-=", "*=", "/=", "%=", "|=", "^=", "&=", "<<=", ">>=", "INCLUDE",
+ "PRINT", "PRINTLN", "IF", "ELIF", "ELSE", "ENDC", "EXPORT", "DB", "DS",
+ "DW", "DL", "SECTION", "FRAGMENT", "RB", "RW", "MACRO", "ENDM",
+ "RSRESET", "RSSET", "UNION", "NEXTU", "ENDU", "INCBIN", "REPT", "FOR",
+ "CHARMAP", "NEWCHARMAP", "SETCHARMAP", "PUSHC", "POPC", "SHIFT", "ENDR",
+ "BREAK", "LOAD", "ENDL", "FAIL", "WARN", "FATAL", "ASSERT",
+ "STATIC_ASSERT", "PURGE", "REDEF", "POPS", "PUSHS", "POPO", "PUSHO",
+ "OPT", "ROM0", "ROMX", "WRAM0", "WRAMX", "HRAM", "VRAM", "SRAM", "OAM",
+ "adc", "add", "and", "bit", "call", "ccf", "cp", "cpl", "daa", "dec",
+ "di", "ei", "halt", "inc", "jp", "jr", "ld", "ldi", "ldd", "ldh", "nop",
+ "or", "pop", "push", "res", "ret", "reti", "rst", "rl", "rla", "rlc",
+ "rlca", "rr", "rra", "rrc", "rrca", "sbc", "scf", "set", "stop", "sla",
+ "sra", "srl", "sub", "swap", "xor", "a", "b", "c", "d", "e", "h", "l",
+ "af", "bc", "de", "sp", "hl", "hld/hl-", "hli/hl+", "nz", "z", "nc",
+ "end of buffer", "$accept", "asmfile", "lines", "endofline",
+ "opt_diff_mark", "line", "$@1", "$@2", "line_directive", "if", "elif",
+ "else", "plain_directive", "endc", "def_id", "$@3", "redef_id", "$@4",
+ "scoped_id", "scoped_anon_id", "label", "macro", "$@5", "macroargs",
+ "assignment_directive", "directive", "trailing_comma", "compoundeq",
+ "equ", "assignment", "equs", "rb", "rw", "rl", "align", "opt", "$@6",
+ "opt_list", "opt_list_entry", "popo", "pusho", "pops", "pushs", "fail",
+ "warn", "assert_type", "assert", "shift", "load", "rept", "@7", "for",
+ "$@8", "$@9", "@10", "for_args", "break", "macrodef", "$@11", "$@12",
+ "@13", "@14", "rsset", "rsreset", "rs_uconst", "union", "nextu", "endu",
+ "ds", "ds_args", "db", "dw", "dl", "def_equ", "redef_equ", "def_set",
+ "def_rb", "def_rw", "def_rl", "def_equs", "redef_equs", "purge", "$@15",
+ "purge_list", "purge_list_entry", "export", "export_list",
+ "export_list_entry", "include", "incbin", "charmap", "newcharmap",
+ "setcharmap", "pushc", "popc", "print", "println", "print_exprs",
+ "print_expr", "const_3bit", "constlist_8bit", "constlist_8bit_entry",
+ "constlist_16bit", "constlist_16bit_entry", "constlist_32bit",
+ "constlist_32bit_entry", "reloc_8bit", "reloc_8bit_no_str",
+ "reloc_8bit_offset", "reloc_16bit", "reloc_16bit_no_str", "relocexpr",
+ "relocexpr_no_str", "$@16", "uconst", "const", "const_no_str",
+ "const_8bit", "opt_q_arg", "string", "strcat_args", "strfmt_args",
+ "strfmt_va_args", "section", "sectmod", "sectiontype", "sectorg",
+ "sectattrs", "cpu_command", "z80_adc", "z80_add", "z80_and", "z80_bit",
+ "z80_call", "z80_ccf", "z80_cp", "z80_cpl", "z80_daa", "z80_dec",
+ "z80_di", "z80_ei", "z80_halt", "z80_inc", "z80_jp", "z80_jr", "z80_ldi",
+ "z80_ldd", "z80_ldio", "c_ind", "z80_ld", "z80_ld_hl", "z80_ld_sp",
+ "z80_ld_mem", "z80_ld_cind", "z80_ld_rr", "z80_ld_r", "z80_ld_a",
+ "z80_ld_ss", "z80_nop", "z80_or", "z80_pop", "z80_push", "z80_res",
+ "z80_ret", "z80_reti", "z80_rl", "z80_rla", "z80_rlc", "z80_rlca",
+ "z80_rr", "z80_rra", "z80_rrc", "z80_rrca", "z80_rst", "z80_sbc",
+ "z80_scf", "z80_set", "z80_sla", "z80_sra", "z80_srl", "z80_stop",
+ "z80_sub", "z80_swap", "z80_xor", "op_mem_ind", "op_a_r", "op_a_n",
+ "T_MODE_A", "T_MODE_B", "T_MODE_C", "T_MODE_D", "T_MODE_E", "T_MODE_H",
+ "T_MODE_L", "ccode_expr", "ccode", "reg_r", "reg_tt", "reg_ss", "reg_rr",
+ "hl_ind_inc", "hl_ind_dec", YY_NULLPTR
+ };
+ return yy_sname[yysymbol];
+}
+#endif
+
+#define YYPACT_NINF (-475)
+
+#define yypact_value_is_default(Yyn) \
+ ((Yyn) == YYPACT_NINF)
+
+#define YYTABLE_NINF (-312)
+
+#define yytable_value_is_error(Yyn) \
+ 0
+
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+ STATE-NUM. */
+static const yytype_int16 yypact[] =
+{
+ -475, 15, 77, -475, -475, -475, 1072, -475, -475, 522,
+ 11, 2238, 2238, 8, -475, 2238, -475, -475, -475, -475,
+ -475, -475, 22, 2051, -475, -475, -475, -475, -475, -475,
+ -475, -475, -475, -475, -475, -475, 22, -475, 9, 2238,
+ 2238, 518, -475, -475, -475, -475, -475, -475, -475, -475,
+ -475, -475, 2238, 2238, 2238, 2238, 71, -475, -475, 2238,
+ 2238, 2238, 2238, 2238, -475, 70, 80, 125, 131, 156,
+ 169, 170, 173, 177, 215, 225, 227, 229, 236, 240,
+ 245, 247, 248, 255, 257, 258, 264, 265, 273, 279,
+ 280, 281, 291, 296, 298, 300, 301, 302, -475, -475,
+ -475, 318, -475, -475, 1392, -475, 126, -475, 214, -475,
+ 36, 317, -475, 221, -475, -475, -475, -475, 2238, -475,
+ 518, 2238, 2238, -475, -16, 2238, 2238, 2238, 2238, -19,
+ -475, 2238, -475, -475, -475, 518, 518, 259, 263, -475,
+ -475, 2238, 22, -19, -475, 518, 518, 138, 138, -475,
+ -475, -475, -475, -475, -475, -475, 1838, 1331, 1838, 2238,
+ 1259, -475, 1838, -475, -475, 86, -475, -475, -475, 86,
+ 949, 1259, 104, 30, 58, 98, -475, 1838, -34, -34,
+ 2238, 55, -475, 2238, 216, -475, 216, -475, 216, -475,
+ 216, -475, 1838, -475, 2238, 2238, 216, 216, 216, 1838,
+ 216, 1838, -475, 371, 803, -475, -475, -475, -475, -475,
+ -475, -475, -475, -475, -475, -475, -475, -475, -475, -475,
+ -475, -475, -475, -475, -475, -475, -475, -475, -475, -475,
+ -475, -475, -475, -475, -475, -475, -475, -475, -475, -475,
+ -475, -475, -475, -475, -475, -475, -475, -475, -475, -475,
+ -475, -475, -475, -475, -475, -475, -475, -475, -475, -475,
+ -475, -475, -475, -475, -475, -475, -475, -475, -475, -475,
+ -475, -475, -475, -475, -475, -475, -475, -475, -475, -475,
+ -475, -475, -475, -475, -475, -475, -475, -475, -475, -475,
+ -475, -475, -475, -475, -475, -475, -475, -475, -475, -475,
+ -475, -475, 22, -475, 324, -475, -475, -475, -475, -475,
+ -475, -475, -475, -475, 831, 303, 303, 303, 303, 327,
+ 326, 518, 518, 2238, 2238, 2238, 2238, 2238, 2238, 2238,
+ 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238,
+ 2238, 518, 518, 518, 518, 518, 685, 518, 518, 518,
+ 518, 518, 518, 72, 2238, 2238, 2238, 2238, 2238, 2238,
+ 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238,
+ 2238, 2238, 2238, 2238, -475, -475, -475, -475, -475, 267,
+ 334, -475, 22, 336, -475, 1392, 20, -475, 21, 336,
+ -475, 337, -475, 338, -475, -475, 31, 46, 339, 340,
+ -475, -475, 49, 59, 359, -475, 63, 64, -475, -475,
+ 518, -475, 360, 361, 362, -475, -475, -475, 518, -475,
+ -475, 368, 369, 370, 2238, 2238, -16, 305, 374, 178,
+ 376, 377, -475, -475, -475, -475, -475, -475, -475, -475,
+ 1392, -475, -475, 383, -475, -475, -475, -475, -475, -475,
+ -475, 389, 395, -475, -475, -475, -475, 396, -475, 1259,
+ -475, -475, -475, -475, -475, 1392, 397, -475, -475, -475,
+ 394, 403, -475, -475, -475, -475, -475, -475, -475, -475,
+ -475, -475, -475, 399, -475, 408, 149, 410, 411, 412,
+ 413, 414, 415, 417, 418, -475, -475, 224, 419, 421,
+ 232, 428, 2002, 430, 433, 436, -475, -475, -475, -475,
+ -475, -475, -475, -475, 437, 55, -475, -475, -475, -475,
+ -475, -475, -475, -475, 438, -475, -475, -475, -475, -475,
+ -475, -475, -475, -475, 2238, 2238, 518, 2238, 2238, 2238,
+ 2238, 2238, 2238, 518, 2238, -475, -475, -475, 72, 448,
+ 450, 451, 452, 458, 458, 458, 458, 458, 458, 459,
+ 463, 465, 470, 471, 472, 458, 458, 458, 1013, 1036,
+ 1098, 473, 477, 479, 480, 481, -475, -475, 13, 483,
+ 484, 485, -475, 490, 492, 500, 497, 2297, 1736, 748,
+ 748, 748, 748, 748, 748, 762, 762, 146, 146, 146,
+ 92, 92, 92, 303, 303, 303, -475, 416, 22, 504,
+ -475, 2238, 486, -475, 2238, -475, -475, -16, -475, 2238,
+ -475, 2238, 2238, -475, 2238, -475, 506, 2238, 2238, 447,
+ 515, -475, -475, -475, 799, 529, -475, 531, -475, -475,
+ -475, 374, -475, 533, 1433, 1506, 1838, 2238, 43, 216,
+ -475, 2238, 35, 53, 2238, 2238, 530, 536, 537, 65,
+ 538, 540, 541, 1567, 542, 2238, 2238, 1600, 1673, 41,
+ 40, 1926, 41, 543, 357, 563, 564, 566, 41, 41,
+ 570, 216, 216, -475, -475, -475, -475, -475, -475, -475,
+ -475, -475, -475, -475, 22, 561, -475, -475, -475, -475,
+ 2238, 568, 576, 578, 579, 580, 581, 2238, 2238, 2238,
+ 2238, 2238, 2238, 582, 583, 584, -475, -475, -475, 518,
+ 518, 518, 2238, -475, 518, -475, -475, -475, 518, 575,
+ -475, -475, 2238, -475, -475, -475, 2238, -475, -475, -475,
+ -475, -475, 606, -475, -475, -475, 422, 607, -475, -475,
+ -475, 422, 518, 518, -16, -475, -475, -475, 603, 605,
+ 608, 609, 610, 611, 612, -475, -475, -475, -475, -475,
+ -475, -475, -475, 1766, -475, -475, 618, 619, -475, -475,
+ -475, 2002, -475, -475, -475, -475, -475, 128, -475, -475,
+ -475, -475, -475, -475, -475, -475, -475, -475, 623, 431,
+ 627, 434, -475, -475, -475, -475, -475, -475, -475, -475,
+ -475, -475, -475, -475, -475, -475, -475, 458, 458, 458,
+ 458, 458, 458, -475, -475, -475, 628, 629, 630, 96,
+ -475, 632, 2238, 631, 22, 634, 637, 2238, -475, -475,
+ -475, -475, -475, -475, -475, -475, -475, 636, 2238, 636,
+ -475, -475, -475, -475, -475, -475, -475, -475, -475, -475,
+ -475, -475, 638, 2238, 2238, -475, 41, 642, 41, 644,
+ 645, 646, 647, 648, 649, 651, -475, -475, -475, 2238,
+ -475, 518, -475, 99, -475, -475, -475, 2238, -475, 2238,
+ -475, -475, -475, -475, 1392, 1392, -475, -475, -475, -475,
+ -475, -475, -475, -475, -475, -475, 652, 673, 22, 679,
+ 677, 681, 681, -475, -475, -475, 2238, -475, 118, -475,
+ 680, 683, 2238, 2238, 684, 95, -475, 2238, -475, 686,
+ -475
+};
+
+/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
+ Performed when YYTABLE does not specify something else to do. Zero
+ means the default is an error. */
+static const yytype_int16 yydefact[] =
+{
+ 3, 0, 7, 1, 8, 9, 0, 12, 42, 0,
+ 43, 0, 0, 0, 152, 0, 144, 4, 11, 21,
+ 22, 23, 0, 27, 31, 52, 53, 57, 54, 55,
+ 56, 17, 18, 19, 16, 20, 0, 14, 45, 0,
+ 0, 0, 100, 101, 102, 103, 104, 106, 105, 107,
+ 108, 109, 160, 160, 160, 0, 44, 234, 295, 0,
+ 0, 0, 0, 0, 266, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 37, 38,
+ 40, 0, 39, 233, 290, 231, 0, 232, 0, 26,
+ 0, 0, 289, 0, 5, 6, 10, 33, 0, 48,
+ 0, 0, 206, 32, 0, 169, 0, 171, 173, 313,
+ 159, 0, 162, 163, 164, 0, 0, 0, 0, 203,
+ 204, 138, 0, 313, 141, 0, 0, 130, 130, 186,
+ 35, 126, 127, 124, 125, 119, 0, 0, 0, 0,
+ 0, 387, 0, 390, 391, 0, 394, 395, 396, 0,
+ 0, 0, 0, 0, 0, 0, 437, 0, 0, 0,
+ 0, 443, 445, 0, 0, 447, 0, 449, 0, 451,
+ 0, 453, 0, 457, 0, 462, 0, 0, 0, 0,
+ 0, 0, 58, 0, 0, 29, 30, 97, 96, 94,
+ 95, 92, 93, 80, 81, 82, 79, 78, 68, 67,
+ 69, 70, 71, 65, 62, 63, 64, 83, 84, 85,
+ 86, 87, 88, 89, 90, 91, 61, 72, 73, 74,
+ 75, 76, 77, 59, 60, 66, 28, 330, 331, 332,
+ 333, 334, 335, 336, 337, 338, 339, 340, 341, 342,
+ 343, 344, 345, 348, 347, 349, 346, 418, 419, 414,
+ 415, 416, 420, 421, 417, 350, 351, 352, 353, 354,
+ 355, 356, 357, 358, 359, 360, 361, 362, 363, 364,
+ 365, 366, 367, 368, 369, 370, 371, 372, 373, 374,
+ 375, 13, 0, 47, 0, 110, 111, 113, 114, 161,
+ 115, 116, 112, 46, 0, 235, 256, 257, 258, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 24, 25, 153, 142, 145, 0,
+ 117, 50, 0, 98, 208, 0, 231, 210, 232, 98,
+ 194, 98, 192, 98, 213, 215, 231, 232, 165, 98,
+ 217, 219, 231, 232, 98, 221, 231, 232, 315, 314,
+ 0, 158, 196, 0, 200, 202, 139, 151, 0, 128,
+ 129, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 474, 476, 478, 480, 482, 484, 486, 472,
+ 225, 377, 376, 501, 494, 495, 496, 497, 498, 499,
+ 470, 0, 0, 379, 378, 383, 382, 0, 212, 0,
+ 493, 490, 491, 492, 385, 229, 0, 488, 389, 388,
+ 0, 0, 506, 507, 509, 508, 501, 392, 393, 397,
+ 398, 401, 399, 0, 402, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 512, 513, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 439, 438, 505, 502,
+ 503, 504, 440, 441, 0, 0, 444, 454, 446, 448,
+ 450, 452, 456, 455, 0, 463, 459, 460, 461, 465,
+ 464, 466, 468, 467, 0, 0, 0, 160, 160, 160,
+ 0, 0, 0, 0, 0, 15, 156, 288, 0, 0,
+ 0, 0, 0, 293, 293, 293, 293, 293, 293, 0,
+ 0, 0, 0, 0, 0, 293, 293, 293, 0, 0,
+ 0, 0, 0, 0, 0, 0, 299, 306, 0, 0,
+ 0, 0, 309, 0, 0, 0, 0, 237, 236, 239,
+ 240, 241, 242, 243, 238, 244, 245, 247, 246, 248,
+ 249, 250, 251, 252, 253, 254, 255, 0, 0, 0,
+ 34, 0, 49, 195, 99, 205, 207, 99, 191, 99,
+ 170, 0, 99, 172, 99, 174, 0, 0, 0, 0,
+ 0, 132, 131, 133, 134, 136, 190, 98, 188, 36,
+ 123, 120, 121, 0, 0, 0, 0, 0, 0, 0,
+ 489, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 229, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 175, 177, 184, 181, 182, 183, 179,
+ 176, 178, 185, 180, 0, 0, 262, 263, 264, 265,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 259, 260, 261, 0,
+ 0, 0, 0, 286, 0, 300, 301, 302, 0, 308,
+ 304, 287, 0, 305, 154, 143, 0, 118, 51, 209,
+ 193, 214, 98, 167, 218, 222, 0, 197, 292, 199,
+ 201, 0, 0, 0, 99, 187, 122, 500, 0, 0,
+ 0, 0, 0, 0, 0, 473, 471, 381, 380, 384,
+ 386, 400, 403, 0, 510, 511, 0, 0, 516, 514,
+ 469, 0, 412, 435, 436, 424, 425, 0, 423, 428,
+ 426, 427, 430, 432, 434, 431, 433, 429, 0, 0,
+ 0, 0, 411, 409, 410, 408, 442, 458, 157, 267,
+ 294, 276, 277, 278, 279, 280, 281, 293, 293, 293,
+ 293, 293, 293, 268, 269, 270, 0, 0, 0, 0,
+ 307, 0, 0, 0, 0, 0, 148, 99, 166, 319,
+ 318, 316, 321, 320, 317, 322, 323, 324, 0, 324,
+ 135, 137, 189, 475, 477, 481, 485, 479, 483, 487,
+ 515, 517, 0, 0, 0, 422, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 283, 284, 285, 0,
+ 297, 0, 310, 232, 298, 155, 146, 0, 168, 0,
+ 326, 198, 326, 413, 227, 228, 404, 405, 406, 407,
+ 282, 271, 272, 273, 274, 275, 0, 0, 0, 149,
+ 0, 312, 140, 296, 303, 147, 0, 325, 0, 150,
+ 0, 0, 0, 0, 0, 0, 329, 0, 327, 0,
+ 328
+};
+
+/* YYPGOTO[NTERM-NUM]. */
+static const yytype_int16 yypgoto[] =
+{
+ -475, -475, -475, -33, -475, -475, -475, -475, -475, -475,
+ -475, -475, -475, -475, -475, -475, -475, -475, -117, -303,
+ -475, -475, -475, -475, -475, -475, -345, -35, -475, -475,
+ -475, -475, -475, -475, -475, -475, -475, -475, 14, -475,
+ -475, -475, -475, -475, -475, 544, -475, -475, -475, -475,
+ -475, -475, -475, -475, -475, -475, -475, -475, -475, -475,
+ -475, -475, -475, -475, -40, -475, -475, -475, -475, -475,
+ -475, -475, -475, -475, -475, -475, -475, -475, -475, -475,
+ -475, -475, -475, -475, -51, -475, -475, 87, -475, -475,
+ -475, -475, -475, -475, -475, -475, -475, 585, 94, -96,
+ -475, 90, -475, 84, -475, 89, -132, -475, -475, -98,
+ -475, 310, -86, -475, -15, -10, -122, -475, -437, 12,
+ -475, -475, -475, -475, 572, -32, -138, -175, -475, -475,
+ -475, -475, -475, -475, -475, -475, -475, -475, -475, -475,
+ -475, -475, -475, -475, -475, -475, -475, -475, -167, -475,
+ -475, -475, -475, -475, -475, -475, -475, -475, -475, -475,
+ -475, -475, -475, -475, -475, -475, -475, -475, -475, -475,
+ -475, -475, -475, -475, -475, -475, -475, -475, -475, -475,
+ -475, -475, -475, -475, -164, 283, 453, -152, -475, -474,
+ -475, -475, -475, -475, -45, -475, -105, 539, -160, 50,
+ -475, -475
+};
+
+/* YYDEFGOTO[NTERM-NUM]. */
+static const yytype_int16 yydefgoto[] =
+{
+ 0, 1, 2, 116, 6, 17, 36, 302, 18, 19,
+ 20, 21, 22, 202, 203, 379, 204, 427, 102, 103,
+ 23, 205, 381, 612, 24, 206, 615, 55, 25, 26,
+ 27, 28, 29, 30, 207, 208, 428, 641, 642, 209,
+ 210, 211, 212, 213, 214, 424, 215, 216, 217, 31,
+ 608, 32, 113, 609, 908, 835, 33, 34, 110, 607,
+ 834, 694, 218, 219, 308, 220, 221, 222, 223, 742,
+ 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
+ 234, 235, 426, 637, 638, 236, 391, 392, 35, 237,
+ 238, 239, 240, 241, 242, 243, 244, 383, 384, 457,
+ 393, 394, 399, 400, 404, 405, 439, 395, 865, 662,
+ 401, 104, 105, 319, 309, 112, 387, 749, 701, 107,
+ 578, 583, 729, 245, 410, 847, 890, 911, 246, 247,
+ 248, 249, 250, 251, 252, 253, 254, 255, 256, 257,
+ 258, 259, 260, 261, 262, 263, 264, 265, 491, 266,
+ 267, 268, 269, 270, 271, 272, 273, 274, 275, 276,
+ 277, 278, 279, 280, 281, 282, 283, 284, 285, 286,
+ 287, 288, 289, 290, 291, 292, 293, 294, 295, 296,
+ 297, 298, 299, 300, 492, 441, 442, 476, 444, 445,
+ 446, 447, 448, 449, 650, 467, 450, 512, 478, 494,
+ 495, 496
+};
+
+/* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If
+ positive, shift that token. If negative, reduce the rule whose
+ number is the opposite. If YYTABLE_NINF, syntax error. */
+static const yytype_int16 yytable[] =
+{
+ 111, 106, 108, 301, 443, 443, 443, 390, 503, 480,
+ 443, 504, 664, 310, 311, 3, 303, 549, 56, 724,
+ 109, 499, 501, 505, 725, 443, -291, -211, 664, 305,
+ 306, -291, -291, -211, 114, 386, 386, -226, 497, 396,
+ 443, 402, 406, -226, 616, 312, 618, 443, 620, 443,
+ 586, 517, -216, 307, 623, -230, 98, 99, -216, 625,
+ 477, -230, 464, 525, 479, -220, 500, 493, 515, -223,
+ -224, -220, 482, 484, 757, -223, -224, -2, 313, 518,
+ 320, 519, 408, 520, 514, 521, 498, 776, 777, 409,
+ 321, 526, 527, 528, 429, 531, 498, 498, 524, 4,
+ 5, 927, 879, 380, 928, -311, 502, 880, 376, 417,
+ -311, 398, 486, 304, 498, 466, 411, 702, 703, 704,
+ 705, 706, 370, 371, 372, 483, 485, 373, 713, 714,
+ 715, 416, 382, 388, 388, 322, 516, 397, 374, 403,
+ 407, 323, 470, 471, 98, 99, 100, 412, 413, 458,
+ 863, 864, 57, 58, 498, 920, 921, 419, 420, 59,
+ 470, 471, 60, 508, 509, 510, 324, 511, 540, 544,
+ 458, 61, 62, 367, 368, 369, 370, 371, 372, 325,
+ 326, 373, 63, 327, 458, 64, 65, 328, 66, 67,
+ 68, 69, 70, 71, 72, 73, 74, 75, 76, 77,
+ 78, 79, 80, 81, 82, 83, 656, 85, 86, 87,
+ 88, 89, 90, 91, 92, 93, 94, 95, 96, 97,
+ 432, 98, 99, 100, 429, 329, 375, -291, -211, 115,
+ 432, 432, 758, 759, 760, 330, 761, 331, -226, 332,
+ 790, 472, 473, 474, 475, 695, 333, 460, 432, 101,
+ 334, 762, 763, -216, 764, 335, -230, 336, 337, 461,
+ 462, 463, 421, 422, 423, 338, -220, 339, 340, 545,
+ -223, -224, 470, 471, 341, 342, 432, 433, 434, 435,
+ 436, 437, 438, 343, 472, 473, 474, 475, 432, 344,
+ 345, 346, 755, 378, 432, 433, 434, 435, 436, 437,
+ 438, 347, 487, 488, 489, 490, 348, 862, 349, 636,
+ 350, 351, 352, 553, 554, 555, 556, 557, 558, 559,
+ 560, 561, 562, 563, 564, 565, 566, 567, 353, 377,
+ 58, 414, 550, 551, 552, 415, 546, 548, 373, 610,
+ 611, 434, 614, 617, 619, 621, 622, 657, 658, 613,
+ 659, 660, 661, 571, 572, 573, 574, 575, 577, 579,
+ 580, 581, 582, 584, 585, 624, 627, 628, 629, 314,
+ 315, 316, 317, 318, 631, 632, 633, 639, 640, 643,
+ 870, 871, 872, 873, 874, 875, 644, 645, 89, 646,
+ 91, 92, 93, 94, 95, 647, 97, 838, 98, 99,
+ 100, 648, 649, 651, 652, 654, 432, 433, 434, 435,
+ 436, 437, 438, 653, 655, 635, 665, 666, 667, 668,
+ 669, 670, 626, 671, 672, 673, 101, 675, 734, 674,
+ 630, 385, 385, 676, 677, 385, 678, 385, 385, 679,
+ 453, 455, 680, 681, 682, 468, 534, 535, 536, 42,
+ 43, 44, 45, 46, 47, 48, 49, 50, 51, 696,
+ 506, 697, 698, 699, 700, 707, 440, 440, 440, 708,
+ 465, 709, 440, 537, 538, 522, 710, 711, 712, 719,
+ 465, 465, 529, 720, 532, 721, 722, 440, 768, 743,
+ 738, 728, 723, 440, 726, 727, 748, 686, 687, 688,
+ 390, 730, 440, 731, 793, 440, 732, 794, 733, 440,
+ 736, 440, 746, 804, 765, 767, 805, 789, 791, 750,
+ 797, 751, 58, 37, 683, 684, 802, 803, 386, 38,
+ 689, 690, 691, 396, 693, 753, 402, 754, 406, 792,
+ 773, 766, 757, 539, 769, 774, 775, 778, 685, 779,
+ 780, 782, 798, 770, 758, 692, 771, 772, 839, 840,
+ 841, 842, 843, 844, 845, 846, 795, 783, 784, 786,
+ 788, 799, 809, 800, 801, 735, 806, 807, 502, 811,
+ 89, 832, 91, 92, 93, 94, 95, 812, 97, 813,
+ 814, 815, 816, 823, 824, 825, 737, 39, 40, 41,
+ 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
+ 454, 456, 837, 848, 853, 469, 854, 747, 101, 855,
+ 856, 857, 858, 859, 52, 53, 388, 860, 861, 866,
+ 507, 397, 867, 868, 403, 869, 407, 636, 881, 876,
+ 877, 878, 884, 887, 889, 523, 886, 893, 568, 569,
+ 570, 897, 530, 899, 533, 756, 900, 901, 902, 903,
+ 904, 808, 905, 913, 587, 588, 589, 590, 591, 592,
+ 593, 594, 595, 596, 597, 598, 599, 600, 601, 602,
+ 603, 604, 605, 606, 914, 916, 917, 918, 922, 58,
+ 810, 923, 425, 926, 54, 930, 576, 817, 818, 819,
+ 820, 821, 822, 852, 740, 888, 744, 389, 739, 741,
+ 882, 892, 829, 745, 896, 418, 898, 912, 513, 849,
+ 0, 796, 833, 0, 0, 0, 836, 0, 0, 0,
+ 0, 826, 827, 828, 634, 0, 830, 0, 0, 0,
+ 831, 0, 0, 0, 0, 0, 386, 89, 0, 91,
+ 92, 93, 94, 95, 0, 97, 0, 0, 0, 0,
+ 0, 0, 0, 0, 850, 851, 0, 0, 0, 315,
+ 362, 363, 364, 365, 366, 367, 368, 369, 370, 371,
+ 372, 0, 0, 373, 0, 101, 364, 365, 366, 367,
+ 368, 369, 370, 371, 372, 0, 663, 373, 0, 0,
+ 0, 885, 0, 0, 0, 752, 0, 0, 0, 0,
+ 0, 0, 663, 354, 355, 356, 357, 358, 359, 360,
+ 361, 362, 363, 364, 365, 366, 367, 368, 369, 370,
+ 371, 372, 0, 0, 373, 0, 0, 0, 891, 0,
+ 0, 0, 547, 0, 883, 354, 355, 356, 357, 358,
+ 359, 360, 361, 362, 363, 364, 365, 366, 367, 368,
+ 369, 370, 371, 372, 906, 0, 373, 0, 0, 0,
+ 0, 0, 0, 0, 910, 915, 0, 909, 541, 542,
+ 543, 42, 43, 44, 45, 46, 47, 48, 49, 50,
+ 51, 0, 0, 907, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 919, 924, 925, 0,
+ 0, 0, 929, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 385, 0, 0, 0, 0, 385,
+ 0, 440, 385, 0, 385, 0, 0, 0, 440, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 57, 58, 568, 569, 440, 440, 0, 59,
+ 0, 465, 459, 0, 465, 465, 0, 0, 0, 0,
+ 0, 61, 62, 0, 0, 465, 465, 465, 465, 0,
+ 0, 440, 63, 0, 0, 64, 65, 0, 66, 67,
+ 68, 69, 70, 71, 72, 73, 74, 75, 76, 77,
+ 78, 79, 80, 81, 82, 83, 84, 85, 86, 87,
+ 88, 89, 90, 91, 92, 93, 94, 95, 96, 97,
+ 0, 98, 99, 100, 716, 0, 0, 354, 355, 356,
+ 357, 358, 359, 360, 361, 362, 363, 364, 365, 366,
+ 367, 368, 369, 370, 371, 372, 0, 717, 373, 101,
+ 354, 355, 356, 357, 358, 359, 360, 361, 362, 363,
+ 364, 365, 366, 367, 368, 369, 370, 371, 372, 0,
+ 0, 373, 0, 7, 0, 0, 0, 0, 0, 8,
+ 0, 0, 0, 569, -41, 0, 0, 0, 0, 0,
+ 0, 595, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, -41, 718,
+ -41, 0, 354, 355, 356, 357, 358, 359, 360, 361,
+ 362, 363, 364, 365, 366, 367, 368, 369, 370, 371,
+ 372, 0, 0, 373, 0, 0, 0, 0, 0, 0,
+ 0, 460, 385, 9, -41, 10, 0, 440, 0, 0,
+ 481, 0, 0, 461, 462, 463, 0, 0, 0, 0,
+ -41, -41, -41, 11, 12, 13, -41, -41, -41, -41,
+ -41, -41, -41, 894, 895, 0, 14, 0, -41, -41,
+ -41, -41, -41, -41, 15, 16, -41, -41, -41, -41,
+ -41, -41, 0, -41, -41, -41, -41, -41, 0, -41,
+ -41, -41, -41, -41, -41, -41, -41, -41, 0, 0,
+ 0, 0, 0, 0, 0, 0, -41, -41, -41, -41,
+ -41, -41, -41, -41, -41, -41, -41, -41, -41, -41,
+ -41, -41, -41, -41, -41, -41, -41, -41, -41, -41,
+ -41, -41, -41, -41, -41, -41, -41, -41, -41, -41,
+ -41, -41, -41, -41, -41, -41, -41, -41, -41, -41,
+ -41, -41, 57, 58, 0, 0, 0, 0, 0, 59,
+ 0, 0, 459, 0, 0, 0, 0, 0, 0, -41,
+ 0, 61, 62, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 63, 0, 0, 64, 65, 0, 66, 67,
+ 68, 69, 70, 71, 72, 73, 74, 75, 76, 77,
+ 78, 79, 80, 81, 82, 83, 84, 85, 86, 87,
+ 88, 89, 90, 91, 92, 93, 94, 95, 96, 97,
+ 0, 98, 99, 100, 57, 58, 0, 0, 0, 429,
+ 0, 59, 0, 0, 60, 0, 0, 0, 0, 0,
+ 0, 0, 0, 61, 62, 0, 0, 0, 0, 101,
+ 0, 0, 0, 0, 63, 0, 0, 64, 65, 0,
+ 66, 67, 68, 69, 70, 71, 72, 73, 74, 75,
+ 76, 77, 78, 79, 80, 81, 82, 430, 431, 85,
+ 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
+ 96, 97, 0, 98, 99, 100, 354, 355, 356, 357,
+ 358, 359, 360, 361, 362, 363, 364, 365, 366, 367,
+ 368, 369, 370, 371, 372, 0, 0, 373, 0, 0,
+ 0, 101, 0, 0, 0, 0, 57, 58, 0, 0,
+ 0, 0, 0, 59, 0, 0, 60, 0, 0, 0,
+ 0, 460, 0, 0, 0, 61, 62, 0, 0, 0,
+ 0, 0, 0, 461, 462, 463, 63, 0, 0, 64,
+ 65, 0, 66, 67, 68, 69, 70, 71, 72, 73,
+ 74, 75, 76, 77, 78, 79, 80, 81, 82, 83,
+ 84, 85, 86, 87, 88, 89, 90, 91, 92, 93,
+ 94, 95, 96, 97, 0, 98, 99, 100, 0, 57,
+ 58, 0, 0, 0, 0, 0, 59, 0, 0, 60,
+ 0, 432, 433, 434, 435, 436, 437, 438, 61, 62,
+ 0, 451, 452, 101, 0, 0, 0, 0, 0, 63,
+ 0, 0, 64, 65, 0, 66, 67, 68, 69, 70,
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
+ 91, 92, 93, 94, 95, 96, 97, 0, 98, 99,
+ 100, 354, 355, 356, 357, 358, 359, 360, 361, 781,
+ 363, 364, 365, 366, 367, 368, 369, 370, 371, 372,
+ 0, 0, 373, 57, 58, 0, 101, 0, 0, 0,
+ 59, 0, 0, 60, 0, 0, 0, 0, 0, 0,
+ 0, 0, 61, 62, 0, 0, 0, 0, 0, 0,
+ 758, 759, 760, 63, 761, 0, 64, 65, 0, 66,
+ 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
+ 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
+ 87, 88, 89, 90, 91, 92, 93, 94, 95, 96,
+ 97, 0, 98, 99, 100, 0, 57, 58, 0, 0,
+ 0, 0, 0, 59, 0, 0, 60, 0, 0, 0,
+ 0, 0, 0, 0, 0, 61, 62, 0, 0, 0,
+ 101, 0, 0, 0, 762, 763, 63, 764, 0, 64,
+ 65, 0, 66, 67, 68, 69, 70, 71, 72, 73,
+ 74, 75, 76, 77, 78, 79, 80, 81, 82, 83,
+ 84, 85, 86, 87, 88, 89, 90, 91, 92, 93,
+ 94, 95, 96, 97, 0, 98, 99, 100, 0, 0,
+ 354, 0, 356, 357, 358, 359, 360, 361, 362, 363,
+ 364, 365, 366, 367, 368, 369, 370, 371, 372, 57,
+ 58, 373, 0, 101, 0, 0, 59, 0, 0, 60,
+ 0, 0, 0, 0, 0, 0, 0, 0, 61, 62,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
+ 0, 785, 64, 65, 0, 66, 67, 68, 69, 70,
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
+ 91, 92, 93, 94, 95, 96, 97, 0, 98, 99,
+ 100, 57, 58, 0, 0, 0, 429, 0, 59, 0,
+ 0, 60, 0, 0, 0, 0, 0, 0, 0, 0,
+ 61, 62, 0, 0, 0, 0, 101, 0, 0, 0,
+ 0, 63, 0, 787, 64, 65, 0, 66, 67, 68,
+ 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
+ 79, 80, 81, 82, 430, 431, 85, 86, 87, 88,
+ 89, 90, 91, 92, 93, 94, 95, 96, 97, 0,
+ 98, 99, 100, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 57,
+ 58, 0, 0, 0, 486, 0, 59, 0, 101, 60,
+ 0, 0, 0, 0, 0, 0, 0, 0, 61, 62,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
+ 0, 0, 64, 65, 762, 66, 67, 68, 69, 70,
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
+ 81, 82, 430, 431, 85, 86, 87, 88, 89, 90,
+ 91, 92, 93, 94, 95, 96, 97, 0, 98, 99,
+ 100, 0, 0, 0, 0, 57, 58, 0, 0, 0,
+ 0, 0, 59, 0, 0, 60, 0, 0, 0, 0,
+ 0, 0, 0, 0, 61, 62, 101, 0, 432, 433,
+ 434, 435, 436, 437, 438, 63, 0, 0, 64, 65,
+ 0, 66, 67, 68, 69, 70, 71, 72, 73, 74,
+ 75, 76, 77, 78, 79, 80, 81, 82, 83, 656,
+ 85, 86, 87, 88, 89, 90, 91, 92, 93, 94,
+ 95, 96, 97, 0, 98, 99, 100, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 117, 0, 118,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 101, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 432, 433, 434, 435,
+ 436, 437, 438, 119, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 120,
+ 121, 122, 0, 0, 0, 123, 124, 125, 126, 127,
+ 128, 129, 0, 0, 0, 0, 0, 130, 131, 132,
+ 133, 134, 135, 0, 0, 136, 137, 138, 139, 140,
+ 141, 0, 142, 143, 144, 145, 146, 0, 147, 148,
+ 149, 150, 151, 152, 153, 154, 155, 0, 0, 0,
+ 0, 0, 0, 0, 434, 156, 157, 158, 159, 160,
+ 161, 162, 163, 164, 165, 166, 167, 168, 169, 170,
+ 171, 172, 173, 174, 175, 176, 177, 178, 179, 180,
+ 181, 182, 183, 184, 185, 186, 187, 188, 189, 190,
+ 191, 192, 193, 194, 195, 196, 197, 198, 199, 200,
+ 201, 57, 58, 0, 0, 0, 0, 0, 59, 0,
+ 0, 60, 0, 0, 0, 0, 0, 0, 0, 0,
+ 61, 62, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 63, 0, 0, 64, 65, 0, 66, 67, 68,
+ 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
+ 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
+ 89, 90, 91, 92, 93, 94, 95, 96, 97, 0,
+ 98, 99, 100, 356, 357, 358, 359, 360, 361, 362,
+ 363, 364, 365, 366, 367, 368, 369, 370, 371, 372,
+ 0, 0, 373, 0, 0, 0, 0, 0, 101
+};
+
+static const yytype_int16 yycheck[] =
+{
+ 15, 11, 12, 36, 156, 157, 158, 124, 175, 169,
+ 162, 175, 486, 53, 54, 0, 7, 320, 7, 6,
+ 12, 173, 174, 175, 11, 177, 6, 6, 502, 39,
+ 40, 11, 12, 12, 12, 121, 122, 6, 8, 125,
+ 192, 127, 128, 12, 389, 55, 391, 199, 393, 201,
+ 353, 183, 6, 41, 399, 6, 72, 73, 12, 404,
+ 165, 12, 160, 195, 169, 6, 8, 172, 13, 6,
+ 6, 12, 170, 171, 9, 12, 12, 0, 7, 184,
+ 10, 186, 101, 188, 180, 190, 56, 22, 23, 108,
+ 10, 196, 197, 198, 8, 200, 56, 56, 194, 22,
+ 23, 6, 6, 118, 9, 6, 8, 11, 72, 142,
+ 11, 126, 8, 104, 56, 160, 131, 554, 555, 556,
+ 557, 558, 30, 31, 32, 170, 171, 35, 565, 566,
+ 567, 141, 120, 121, 122, 10, 181, 125, 12, 127,
+ 128, 10, 56, 57, 72, 73, 74, 135, 136, 159,
+ 22, 23, 3, 4, 56, 37, 38, 145, 146, 10,
+ 56, 57, 13, 197, 198, 199, 10, 201, 203, 204,
+ 180, 22, 23, 27, 28, 29, 30, 31, 32, 10,
+ 10, 35, 33, 10, 194, 36, 37, 10, 39, 40,
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
+ 190, 72, 73, 74, 8, 10, 12, 207, 207, 207,
+ 190, 190, 197, 198, 199, 10, 201, 10, 207, 10,
+ 200, 198, 199, 200, 201, 548, 10, 192, 190, 100,
+ 10, 198, 199, 207, 201, 10, 207, 10, 10, 204,
+ 205, 206, 124, 125, 126, 10, 207, 10, 10, 302,
+ 207, 207, 56, 57, 10, 10, 190, 191, 192, 193,
+ 194, 195, 196, 10, 198, 199, 200, 201, 190, 10,
+ 10, 10, 637, 72, 190, 191, 192, 193, 194, 195,
+ 196, 10, 198, 199, 200, 201, 10, 781, 10, 426,
+ 10, 10, 10, 323, 324, 325, 326, 327, 328, 329,
+ 330, 331, 332, 333, 334, 335, 336, 337, 10, 12,
+ 4, 72, 320, 321, 322, 72, 12, 10, 35, 72,
+ 6, 192, 6, 6, 6, 6, 6, 198, 199, 382,
+ 201, 202, 203, 341, 342, 343, 344, 345, 346, 347,
+ 348, 349, 350, 351, 352, 6, 6, 6, 6, 59,
+ 60, 61, 62, 63, 6, 6, 6, 72, 4, 201,
+ 817, 818, 819, 820, 821, 822, 10, 10, 62, 6,
+ 64, 65, 66, 67, 68, 6, 70, 742, 72, 73,
+ 74, 6, 6, 6, 10, 6, 190, 191, 192, 193,
+ 194, 195, 196, 10, 6, 425, 6, 6, 6, 6,
+ 6, 6, 410, 6, 6, 201, 100, 6, 12, 10,
+ 418, 121, 122, 201, 6, 125, 6, 127, 128, 6,
+ 157, 158, 6, 6, 6, 162, 75, 76, 77, 78,
+ 79, 80, 81, 82, 83, 84, 85, 86, 87, 11,
+ 177, 11, 11, 11, 6, 6, 156, 157, 158, 6,
+ 160, 6, 162, 102, 103, 192, 6, 6, 6, 6,
+ 170, 171, 199, 6, 201, 6, 6, 177, 648, 621,
+ 4, 6, 11, 183, 11, 11, 628, 537, 538, 539,
+ 617, 11, 192, 11, 671, 195, 6, 671, 11, 199,
+ 6, 201, 6, 680, 646, 647, 680, 669, 670, 72,
+ 672, 6, 4, 1, 534, 535, 678, 679, 614, 7,
+ 540, 541, 542, 619, 544, 6, 622, 6, 624, 671,
+ 10, 646, 9, 172, 649, 9, 9, 9, 536, 9,
+ 9, 9, 9, 651, 197, 543, 654, 655, 136, 137,
+ 138, 139, 140, 141, 142, 143, 671, 665, 666, 667,
+ 668, 8, 11, 9, 8, 608, 681, 682, 8, 11,
+ 62, 6, 64, 65, 66, 67, 68, 11, 70, 11,
+ 11, 11, 11, 11, 11, 11, 611, 75, 76, 77,
+ 78, 79, 80, 81, 82, 83, 84, 85, 86, 87,
+ 157, 158, 6, 6, 11, 162, 11, 627, 100, 11,
+ 11, 11, 11, 11, 102, 103, 614, 9, 9, 6,
+ 177, 619, 201, 6, 622, 201, 624, 754, 6, 11,
+ 11, 11, 11, 6, 8, 192, 12, 9, 338, 339,
+ 340, 9, 199, 9, 201, 641, 11, 11, 11, 11,
+ 11, 694, 11, 11, 354, 355, 356, 357, 358, 359,
+ 360, 361, 362, 363, 364, 365, 366, 367, 368, 369,
+ 370, 371, 372, 373, 11, 6, 9, 6, 8, 4,
+ 700, 8, 148, 9, 172, 9, 11, 707, 708, 709,
+ 710, 711, 712, 754, 617, 837, 622, 122, 614, 619,
+ 832, 849, 722, 624, 866, 143, 868, 892, 179, 751,
+ -1, 671, 732, -1, -1, -1, 736, -1, -1, -1,
+ -1, 719, 720, 721, 424, -1, 724, -1, -1, -1,
+ 728, -1, -1, -1, -1, -1, 832, 62, -1, 64,
+ 65, 66, 67, 68, -1, 70, -1, -1, -1, -1,
+ -1, -1, -1, -1, 752, 753, -1, -1, -1, 459,
+ 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, -1, -1, 35, -1, 100, 24, 25, 26, 27,
+ 28, 29, 30, 31, 32, -1, 486, 35, -1, -1,
+ -1, 834, -1, -1, -1, 6, -1, -1, -1, -1,
+ -1, -1, 502, 14, 15, 16, 17, 18, 19, 20,
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
+ 31, 32, -1, -1, 35, -1, -1, -1, 848, -1,
+ -1, -1, 11, -1, 832, 14, 15, 16, 17, 18,
+ 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
+ 29, 30, 31, 32, 879, -1, 35, -1, -1, -1,
+ -1, -1, -1, -1, 889, 908, -1, 887, 75, 76,
+ 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
+ 87, -1, -1, 881, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 916, 922, 923, -1,
+ -1, -1, 927, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 614, -1, -1, -1, -1, 619,
+ -1, 621, 622, -1, 624, -1, -1, -1, 628, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 3, 4, 644, 645, 646, 647, -1, 10,
+ -1, 651, 13, -1, 654, 655, -1, -1, -1, -1,
+ -1, 22, 23, -1, -1, 665, 666, 667, 668, -1,
+ -1, 671, 33, -1, -1, 36, 37, -1, 39, 40,
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
+ -1, 72, 73, 74, 11, -1, -1, 14, 15, 16,
+ 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
+ 27, 28, 29, 30, 31, 32, -1, 11, 35, 100,
+ 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
+ 24, 25, 26, 27, 28, 29, 30, 31, 32, -1,
+ -1, 35, -1, 1, -1, -1, -1, -1, -1, 7,
+ -1, -1, -1, 773, 12, -1, -1, -1, -1, -1,
+ -1, 781, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 36, 11,
+ 38, -1, 14, 15, 16, 17, 18, 19, 20, 21,
+ 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, -1, -1, 35, -1, -1, -1, -1, -1, -1,
+ -1, 192, 832, 71, 72, 73, -1, 837, -1, -1,
+ 201, -1, -1, 204, 205, 206, -1, -1, -1, -1,
+ 88, 89, 90, 91, 92, 93, 94, 95, 96, 97,
+ 98, 99, 100, 863, 864, -1, 104, -1, 106, 107,
+ 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
+ 118, 119, -1, 121, 122, 123, 124, 125, -1, 127,
+ 128, 129, 130, 131, 132, 133, 134, 135, -1, -1,
+ -1, -1, -1, -1, -1, -1, 144, 145, 146, 147,
+ 148, 149, 150, 151, 152, 153, 154, 155, 156, 157,
+ 158, 159, 160, 161, 162, 163, 164, 165, 166, 167,
+ 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
+ 178, 179, 180, 181, 182, 183, 184, 185, 186, 187,
+ 188, 189, 3, 4, -1, -1, -1, -1, -1, 10,
+ -1, -1, 13, -1, -1, -1, -1, -1, -1, 207,
+ -1, 22, 23, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 33, -1, -1, 36, 37, -1, 39, 40,
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
+ -1, 72, 73, 74, 3, 4, -1, -1, -1, 8,
+ -1, 10, -1, -1, 13, -1, -1, -1, -1, -1,
+ -1, -1, -1, 22, 23, -1, -1, -1, -1, 100,
+ -1, -1, -1, -1, 33, -1, -1, 36, 37, -1,
+ 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
+ 49, 50, 51, 52, 53, 54, 55, 56, 57, 58,
+ 59, 60, 61, 62, 63, 64, 65, 66, 67, 68,
+ 69, 70, -1, 72, 73, 74, 14, 15, 16, 17,
+ 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
+ 28, 29, 30, 31, 32, -1, -1, 35, -1, -1,
+ -1, 100, -1, -1, -1, -1, 3, 4, -1, -1,
+ -1, -1, -1, 10, -1, -1, 13, -1, -1, -1,
+ -1, 192, -1, -1, -1, 22, 23, -1, -1, -1,
+ -1, -1, -1, 204, 205, 206, 33, -1, -1, 36,
+ 37, -1, 39, 40, 41, 42, 43, 44, 45, 46,
+ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
+ 57, 58, 59, 60, 61, 62, 63, 64, 65, 66,
+ 67, 68, 69, 70, -1, 72, 73, 74, -1, 3,
+ 4, -1, -1, -1, -1, -1, 10, -1, -1, 13,
+ -1, 190, 191, 192, 193, 194, 195, 196, 22, 23,
+ -1, 200, 201, 100, -1, -1, -1, -1, -1, 33,
+ -1, -1, 36, 37, -1, 39, 40, 41, 42, 43,
+ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
+ 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
+ 64, 65, 66, 67, 68, 69, 70, -1, 72, 73,
+ 74, 14, 15, 16, 17, 18, 19, 20, 21, 22,
+ 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
+ -1, -1, 35, 3, 4, -1, 100, -1, -1, -1,
+ 10, -1, -1, 13, -1, -1, -1, -1, -1, -1,
+ -1, -1, 22, 23, -1, -1, -1, -1, -1, -1,
+ 197, 198, 199, 33, 201, -1, 36, 37, -1, 39,
+ 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
+ 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
+ 60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
+ 70, -1, 72, 73, 74, -1, 3, 4, -1, -1,
+ -1, -1, -1, 10, -1, -1, 13, -1, -1, -1,
+ -1, -1, -1, -1, -1, 22, 23, -1, -1, -1,
+ 100, -1, -1, -1, 198, 199, 33, 201, -1, 36,
+ 37, -1, 39, 40, 41, 42, 43, 44, 45, 46,
+ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
+ 57, 58, 59, 60, 61, 62, 63, 64, 65, 66,
+ 67, 68, 69, 70, -1, 72, 73, 74, -1, -1,
+ 14, -1, 16, 17, 18, 19, 20, 21, 22, 23,
+ 24, 25, 26, 27, 28, 29, 30, 31, 32, 3,
+ 4, 35, -1, 100, -1, -1, 10, -1, -1, 13,
+ -1, -1, -1, -1, -1, -1, -1, -1, 22, 23,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 33,
+ -1, 201, 36, 37, -1, 39, 40, 41, 42, 43,
+ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
+ 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
+ 64, 65, 66, 67, 68, 69, 70, -1, 72, 73,
+ 74, 3, 4, -1, -1, -1, 8, -1, 10, -1,
+ -1, 13, -1, -1, -1, -1, -1, -1, -1, -1,
+ 22, 23, -1, -1, -1, -1, 100, -1, -1, -1,
+ -1, 33, -1, 200, 36, 37, -1, 39, 40, 41,
+ 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
+ 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,
+ 62, 63, 64, 65, 66, 67, 68, 69, 70, -1,
+ 72, 73, 74, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 3,
+ 4, -1, -1, -1, 8, -1, 10, -1, 100, 13,
+ -1, -1, -1, -1, -1, -1, -1, -1, 22, 23,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 33,
+ -1, -1, 36, 37, 198, 39, 40, 41, 42, 43,
+ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
+ 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
+ 64, 65, 66, 67, 68, 69, 70, -1, 72, 73,
+ 74, -1, -1, -1, -1, 3, 4, -1, -1, -1,
+ -1, -1, 10, -1, -1, 13, -1, -1, -1, -1,
+ -1, -1, -1, -1, 22, 23, 100, -1, 190, 191,
+ 192, 193, 194, 195, 196, 33, -1, -1, 36, 37,
+ -1, 39, 40, 41, 42, 43, 44, 45, 46, 47,
+ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
+ 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
+ 68, 69, 70, -1, 72, 73, 74, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 36, -1, 38,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 100, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 190, 191, 192, 193,
+ 194, 195, 196, 72, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 88,
+ 89, 90, -1, -1, -1, 94, 95, 96, 97, 98,
+ 99, 100, -1, -1, -1, -1, -1, 106, 107, 108,
+ 109, 110, 111, -1, -1, 114, 115, 116, 117, 118,
+ 119, -1, 121, 122, 123, 124, 125, -1, 127, 128,
+ 129, 130, 131, 132, 133, 134, 135, -1, -1, -1,
+ -1, -1, -1, -1, 192, 144, 145, 146, 147, 148,
+ 149, 150, 151, 152, 153, 154, 155, 156, 157, 158,
+ 159, 160, 161, 162, 163, 164, 165, 166, 167, 168,
+ 169, 170, 171, 172, 173, 174, 175, 176, 177, 178,
+ 179, 180, 181, 182, 183, 184, 185, 186, 187, 188,
+ 189, 3, 4, -1, -1, -1, -1, -1, 10, -1,
+ -1, 13, -1, -1, -1, -1, -1, -1, -1, -1,
+ 22, 23, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 33, -1, -1, 36, 37, -1, 39, 40, 41,
+ 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
+ 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,
+ 62, 63, 64, 65, 66, 67, 68, 69, 70, -1,
+ 72, 73, 74, 16, 17, 18, 19, 20, 21, 22,
+ 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
+ -1, -1, 35, -1, -1, -1, -1, -1, 100
+};
+
+/* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of
+ state STATE-NUM. */
+static const yytype_int16 yystos[] =
+{
+ 0, 209, 210, 0, 22, 23, 212, 1, 7, 71,
+ 73, 91, 92, 93, 104, 112, 113, 213, 216, 217,
+ 218, 219, 220, 228, 232, 236, 237, 238, 239, 240,
+ 241, 257, 259, 264, 265, 296, 214, 1, 7, 75,
+ 76, 77, 78, 79, 80, 81, 82, 83, 84, 85,
+ 86, 87, 102, 103, 172, 235, 7, 3, 4, 10,
+ 13, 22, 23, 33, 36, 37, 39, 40, 41, 42,
+ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
+ 53, 54, 55, 56, 57, 58, 59, 60, 61, 62,
+ 63, 64, 65, 66, 67, 68, 69, 70, 72, 73,
+ 74, 100, 226, 227, 319, 320, 323, 327, 323, 12,
+ 266, 322, 323, 260, 12, 207, 211, 36, 38, 72,
+ 88, 89, 90, 94, 95, 96, 97, 98, 99, 100,
+ 106, 107, 108, 109, 110, 111, 114, 115, 116, 117,
+ 118, 119, 121, 122, 123, 124, 125, 127, 128, 129,
+ 130, 131, 132, 133, 134, 135, 144, 145, 146, 147,
+ 148, 149, 150, 151, 152, 153, 154, 155, 156, 157,
+ 158, 159, 160, 161, 162, 163, 164, 165, 166, 167,
+ 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
+ 178, 179, 180, 181, 182, 183, 184, 185, 186, 187,
+ 188, 189, 221, 222, 224, 229, 233, 242, 243, 247,
+ 248, 249, 250, 251, 252, 254, 255, 256, 270, 271,
+ 273, 274, 275, 276, 278, 279, 280, 281, 282, 283,
+ 284, 285, 286, 287, 288, 289, 293, 297, 298, 299,
+ 300, 301, 302, 303, 304, 331, 336, 337, 338, 339,
+ 340, 341, 342, 343, 344, 345, 346, 347, 348, 349,
+ 350, 351, 352, 353, 354, 355, 357, 358, 359, 360,
+ 361, 362, 363, 364, 365, 366, 367, 368, 369, 370,
+ 371, 372, 373, 374, 375, 376, 377, 378, 379, 380,
+ 381, 382, 383, 384, 385, 386, 387, 388, 389, 390,
+ 391, 211, 215, 7, 104, 323, 323, 327, 272, 322,
+ 272, 272, 323, 7, 319, 319, 319, 319, 319, 321,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 14, 15, 16, 17, 18, 19,
+ 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
+ 30, 31, 32, 35, 12, 12, 72, 12, 72, 223,
+ 322, 230, 327, 305, 306, 319, 320, 324, 327, 305,
+ 226, 294, 295, 308, 309, 315, 320, 327, 322, 310,
+ 311, 318, 320, 327, 312, 313, 320, 327, 101, 108,
+ 332, 322, 327, 327, 72, 72, 323, 211, 332, 327,
+ 327, 124, 125, 126, 253, 253, 290, 225, 244, 8,
+ 56, 57, 190, 191, 192, 193, 194, 195, 196, 314,
+ 319, 393, 394, 395, 396, 397, 398, 399, 400, 401,
+ 404, 200, 201, 393, 394, 393, 394, 307, 323, 13,
+ 192, 204, 205, 206, 317, 319, 402, 403, 393, 394,
+ 56, 57, 198, 199, 200, 201, 395, 404, 406, 404,
+ 406, 201, 317, 402, 317, 402, 8, 198, 199, 200,
+ 201, 356, 392, 404, 407, 408, 409, 8, 56, 395,
+ 8, 395, 8, 356, 392, 395, 393, 394, 197, 198,
+ 199, 201, 405, 405, 307, 13, 402, 314, 404, 404,
+ 404, 404, 393, 394, 307, 314, 404, 404, 404, 393,
+ 394, 404, 393, 394, 75, 76, 77, 102, 103, 172,
+ 235, 75, 76, 77, 235, 211, 12, 11, 10, 227,
+ 327, 327, 327, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323, 319, 319,
+ 319, 327, 327, 327, 327, 327, 11, 327, 328, 327,
+ 327, 327, 327, 329, 327, 327, 227, 319, 319, 319,
+ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319,
+ 319, 319, 319, 319, 319, 319, 319, 267, 258, 261,
+ 72, 6, 231, 211, 6, 234, 234, 6, 234, 6,
+ 234, 6, 6, 234, 6, 234, 327, 6, 6, 6,
+ 327, 6, 6, 6, 319, 323, 226, 291, 292, 72,
+ 4, 245, 246, 201, 10, 10, 6, 6, 6, 6,
+ 402, 6, 10, 10, 6, 6, 57, 198, 199, 201,
+ 202, 203, 317, 319, 397, 6, 6, 6, 6, 6,
+ 6, 6, 6, 201, 10, 6, 201, 6, 6, 6,
+ 6, 6, 6, 323, 323, 327, 272, 272, 272, 323,
+ 323, 323, 327, 323, 269, 227, 11, 11, 11, 11,
+ 6, 326, 326, 326, 326, 326, 326, 6, 6, 6,
+ 6, 6, 6, 326, 326, 326, 11, 11, 11, 6,
+ 6, 6, 6, 11, 6, 11, 11, 11, 6, 330,
+ 11, 11, 6, 11, 12, 211, 6, 322, 4, 306,
+ 295, 309, 277, 314, 311, 313, 6, 323, 314, 325,
+ 72, 6, 6, 6, 6, 234, 246, 9, 197, 198,
+ 199, 201, 198, 199, 201, 314, 404, 314, 406, 404,
+ 317, 317, 317, 10, 9, 9, 22, 23, 9, 9,
+ 9, 22, 9, 317, 317, 201, 317, 200, 317, 395,
+ 200, 395, 314, 356, 392, 404, 407, 395, 9, 8,
+ 9, 8, 395, 395, 356, 392, 404, 404, 211, 11,
+ 323, 11, 11, 11, 11, 11, 11, 323, 323, 323,
+ 323, 323, 323, 11, 11, 11, 327, 327, 327, 323,
+ 327, 327, 6, 323, 268, 263, 323, 6, 234, 136,
+ 137, 138, 139, 140, 141, 142, 143, 333, 6, 333,
+ 327, 327, 292, 11, 11, 11, 11, 11, 11, 11,
+ 9, 9, 397, 22, 23, 316, 6, 201, 6, 201,
+ 326, 326, 326, 326, 326, 326, 11, 11, 11, 6,
+ 11, 6, 324, 327, 11, 211, 12, 6, 314, 8,
+ 334, 323, 334, 9, 319, 319, 395, 9, 395, 9,
+ 11, 11, 11, 11, 11, 11, 322, 327, 262, 323,
+ 322, 335, 335, 11, 11, 211, 6, 9, 6, 323,
+ 37, 38, 8, 8, 322, 322, 9, 6, 9, 322,
+ 9
+};
+
+/* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */
+static const yytype_int16 yyr1[] =
+{
+ 0, 208, 209, 210, 210, 211, 211, 212, 212, 212,
+ 213, 213, 214, 213, 215, 213, 216, 216, 216, 216,
+ 216, 216, 216, 216, 217, 218, 219, 220, 220, 220,
+ 220, 220, 221, 223, 222, 225, 224, 226, 226, 227,
+ 227, 228, 228, 228, 228, 228, 228, 228, 230, 229,
+ 231, 231, 232, 232, 232, 232, 232, 232, 233, 233,
+ 233, 233, 233, 233, 233, 233, 233, 233, 233, 233,
+ 233, 233, 233, 233, 233, 233, 233, 233, 233, 233,
+ 233, 233, 233, 233, 233, 233, 233, 233, 233, 233,
+ 233, 233, 233, 233, 233, 233, 233, 233, 234, 234,
+ 235, 235, 235, 235, 235, 235, 235, 235, 235, 235,
+ 236, 237, 237, 238, 239, 240, 241, 242, 242, 244,
+ 243, 245, 245, 246, 247, 248, 249, 250, 251, 252,
+ 253, 253, 253, 253, 254, 254, 254, 254, 255, 255,
+ 256, 256, 258, 257, 260, 261, 262, 259, 263, 263,
+ 263, 264, 266, 267, 268, 265, 269, 265, 270, 271,
+ 272, 272, 273, 274, 275, 276, 276, 277, 277, 278,
+ 278, 279, 279, 280, 280, 281, 282, 283, 283, 283,
+ 283, 284, 285, 286, 287, 288, 290, 289, 291, 291,
+ 292, 293, 294, 294, 295, 296, 297, 297, 297, 298,
+ 299, 299, 300, 301, 302, 303, 304, 304, 305, 305,
+ 306, 306, 307, 308, 308, 309, 309, 310, 310, 311,
+ 311, 312, 312, 313, 313, 314, 315, 316, 316, 317,
+ 318, 319, 319, 320, 320, 320, 320, 320, 320, 320,
+ 320, 320, 320, 320, 320, 320, 320, 320, 320, 320,
+ 320, 320, 320, 320, 320, 320, 320, 320, 320, 320,
+ 320, 320, 320, 320, 320, 320, 321, 320, 320, 320,
+ 320, 320, 320, 320, 320, 320, 320, 320, 320, 320,
+ 320, 320, 320, 320, 320, 320, 320, 320, 320, 322,
+ 323, 324, 325, 326, 326, 327, 327, 327, 327, 327,
+ 327, 327, 327, 327, 327, 327, 328, 328, 329, 330,
+ 330, 330, 331, 332, 332, 332, 333, 333, 333, 333,
+ 333, 333, 333, 333, 334, 334, 335, 335, 335, 335,
+ 336, 336, 336, 336, 336, 336, 336, 336, 336, 336,
+ 336, 336, 336, 336, 336, 336, 336, 336, 336, 336,
+ 336, 336, 336, 336, 336, 336, 336, 336, 336, 336,
+ 336, 336, 336, 336, 336, 336, 336, 336, 336, 336,
+ 336, 336, 336, 336, 336, 336, 337, 337, 338, 338,
+ 338, 338, 339, 339, 340, 341, 341, 342, 343, 343,
+ 344, 345, 346, 346, 347, 348, 349, 350, 350, 351,
+ 351, 351, 352, 352, 353, 353, 354, 354, 355, 355,
+ 355, 355, 356, 356, 357, 357, 357, 357, 357, 357,
+ 357, 357, 358, 358, 359, 359, 360, 360, 361, 362,
+ 363, 363, 364, 364, 364, 365, 365, 366, 367, 367,
+ 368, 369, 370, 371, 371, 372, 373, 374, 375, 376,
+ 377, 378, 379, 380, 381, 382, 382, 383, 384, 385,
+ 386, 387, 388, 388, 389, 389, 390, 391, 391, 392,
+ 393, 393, 394, 394, 395, 395, 396, 396, 397, 397,
+ 398, 398, 399, 399, 400, 400, 401, 401, 402, 402,
+ 403, 403, 403, 403, 404, 404, 404, 404, 404, 404,
+ 404, 404, 405, 405, 405, 405, 406, 406, 406, 406,
+ 407, 407, 407, 407, 408, 408, 409, 409
+};
+
+/* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */
+static const yytype_int8 yyr2[] =
+{
+ 0, 2, 1, 0, 3, 1, 1, 0, 1, 1,
+ 2, 1, 0, 3, 0, 4, 1, 1, 1, 1,
+ 1, 1, 1, 1, 3, 3, 2, 1, 2, 2,
+ 2, 1, 1, 0, 3, 0, 3, 1, 1, 1,
+ 1, 0, 1, 1, 2, 2, 3, 3, 0, 3,
+ 0, 2, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 0, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 3, 3, 3, 3, 3, 3, 3, 2, 4, 0,
+ 3, 1, 2, 1, 1, 1, 1, 1, 2, 2,
+ 0, 2, 2, 2, 3, 5, 3, 5, 1, 2,
+ 7, 1, 0, 5, 0, 0, 0, 9, 1, 3,
+ 5, 3, 0, 0, 0, 7, 0, 6, 2, 1,
+ 0, 1, 1, 1, 1, 2, 5, 1, 3, 1,
+ 3, 1, 3, 1, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 0, 4, 1, 3,
+ 1, 3, 1, 3, 1, 4, 2, 4, 6, 4,
+ 2, 4, 2, 1, 1, 3, 1, 3, 1, 3,
+ 1, 1, 1, 1, 3, 1, 1, 1, 3, 1,
+ 1, 1, 3, 1, 1, 1, 1, 2, 2, 1,
+ 1, 1, 1, 1, 1, 2, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 2, 2, 2, 4,
+ 4, 4, 4, 4, 4, 4, 0, 5, 5, 5,
+ 5, 7, 7, 7, 7, 7, 5, 5, 5, 5,
+ 5, 5, 7, 6, 6, 6, 4, 4, 3, 1,
+ 1, 1, 1, 0, 2, 1, 8, 6, 6, 3,
+ 4, 4, 4, 8, 4, 4, 1, 3, 2, 0,
+ 3, 3, 7, 0, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 0, 3, 0, 6, 8, 6,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2, 2, 2, 2,
+ 4, 4, 2, 2, 4, 2, 4, 1, 2, 2,
+ 1, 1, 2, 2, 1, 1, 1, 2, 2, 2,
+ 4, 2, 2, 4, 6, 6, 6, 6, 4, 4,
+ 4, 4, 3, 5, 1, 1, 1, 1, 1, 1,
+ 1, 1, 5, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 1, 2, 2,
+ 2, 2, 4, 1, 2, 1, 2, 1, 2, 1,
+ 2, 1, 2, 1, 2, 2, 2, 1, 4, 2,
+ 2, 2, 1, 2, 2, 2, 2, 2, 2, 3,
+ 1, 3, 1, 3, 1, 4, 1, 4, 1, 4,
+ 1, 4, 1, 4, 1, 4, 1, 4, 1, 2,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 3, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 3, 3, 1, 1, 3, 4, 3, 4
+};
+
+
+enum { YYENOMEM = -2 };
+
+#define yyerrok (yyerrstatus = 0)
+#define yyclearin (yychar = YYEMPTY)
+
+#define YYACCEPT goto yyacceptlab
+#define YYABORT goto yyabortlab
+#define YYERROR goto yyerrorlab
+#define YYNOMEM goto yyexhaustedlab
+
+
+#define YYRECOVERING() (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value) \
+ do \
+ if (yychar == YYEMPTY) \
+ { \
+ yychar = (Token); \
+ yylval = (Value); \
+ YYPOPSTACK (yylen); \
+ yystate = *yyssp; \
+ YY_LAC_DISCARD ("YYBACKUP"); \
+ goto yybackup; \
+ } \
+ else \
+ { \
+ yyerror (YY_("syntax error: cannot back up")); \
+ YYERROR; \
+ } \
+ while (0)
+
+/* Backward compatibility with an undocumented macro.
+ Use YYerror or YYUNDEF. */
+#define YYERRCODE YYUNDEF
+
+
+/* Enable debugging if requested. */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+# define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args) \
+do { \
+ if (yydebug) \
+ YYFPRINTF Args; \
+} while (0)
+
+
+
+
+# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) \
+do { \
+ if (yydebug) \
+ { \
+ YYFPRINTF (stderr, "%s ", Title); \
+ yy_symbol_print (stderr, \
+ Kind, Value); \
+ YYFPRINTF (stderr, "\n"); \
+ } \
+} while (0)
+
+
+/*-----------------------------------.
+| Print this symbol's value on YYO. |
+`-----------------------------------*/
+
+static void
+yy_symbol_value_print (FILE *yyo,
+ yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep)
+{
+ FILE *yyoutput = yyo;
+ YY_USE (yyoutput);
+ if (!yyvaluep)
+ return;
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ YY_USE (yykind);
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+}
+
+
+/*---------------------------.
+| Print this symbol on YYO. |
+`---------------------------*/
+
+static void
+yy_symbol_print (FILE *yyo,
+ yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep)
+{
+ YYFPRINTF (yyo, "%s %s (",
+ yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind));
+
+ yy_symbol_value_print (yyo, yykind, yyvaluep);
+ YYFPRINTF (yyo, ")");
+}
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (included). |
+`------------------------------------------------------------------*/
+
+static void
+yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop)
+{
+ YYFPRINTF (stderr, "Stack now");
+ for (; yybottom <= yytop; yybottom++)
+ {
+ int yybot = *yybottom;
+ YYFPRINTF (stderr, " %d", yybot);
+ }
+ YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top) \
+do { \
+ if (yydebug) \
+ yy_stack_print ((Bottom), (Top)); \
+} while (0)
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced. |
+`------------------------------------------------*/
+
+static void
+yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp,
+ int yyrule)
+{
+ int yylno = yyrline[yyrule];
+ int yynrhs = yyr2[yyrule];
+ int yyi;
+ YYFPRINTF (stderr, "Reducing stack by rule %d (line %d):\n",
+ yyrule - 1, yylno);
+ /* The symbols being reduced. */
+ for (yyi = 0; yyi < yynrhs; yyi++)
+ {
+ YYFPRINTF (stderr, " $%d = ", yyi + 1);
+ yy_symbol_print (stderr,
+ YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]),
+ &yyvsp[(yyi + 1) - (yynrhs)]);
+ YYFPRINTF (stderr, "\n");
+ }
+}
+
+# define YY_REDUCE_PRINT(Rule) \
+do { \
+ if (yydebug) \
+ yy_reduce_print (yyssp, yyvsp, Rule); \
+} while (0)
+
+/* Nonzero means print parse trace. It is left uninitialized so that
+ multiple parsers can coexist. */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args) ((void) 0)
+# define YY_SYMBOL_PRINT(Title, Kind, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
+#endif /* !YYDEBUG */
+
+
+/* YYINITDEPTH -- initial size of the parser's stacks. */
+#ifndef YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+ if the built-in stack extension method is used).
+
+ Do not make this value too large; the results are undefined if
+ YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
+ evaluated with infinite-precision integer arithmetic. */
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+
+/* Given a state stack such that *YYBOTTOM is its bottom, such that
+ *YYTOP is either its top or is YYTOP_EMPTY to indicate an empty
+ stack, and such that *YYCAPACITY is the maximum number of elements it
+ can hold without a reallocation, make sure there is enough room to
+ store YYADD more elements. If not, allocate a new stack using
+ YYSTACK_ALLOC, copy the existing elements, and adjust *YYBOTTOM,
+ *YYTOP, and *YYCAPACITY to reflect the new capacity and memory
+ location. If *YYBOTTOM != YYBOTTOM_NO_FREE, then free the old stack
+ using YYSTACK_FREE. Return 0 if successful or if no reallocation is
+ required. Return YYENOMEM if memory is exhausted. */
+static int
+yy_lac_stack_realloc (YYPTRDIFF_T *yycapacity, YYPTRDIFF_T yyadd,
+#if YYDEBUG
+ char const *yydebug_prefix,
+ char const *yydebug_suffix,
+#endif
+ yy_state_t **yybottom,
+ yy_state_t *yybottom_no_free,
+ yy_state_t **yytop, yy_state_t *yytop_empty)
+{
+ YYPTRDIFF_T yysize_old =
+ *yytop == yytop_empty ? 0 : *yytop - *yybottom + 1;
+ YYPTRDIFF_T yysize_new = yysize_old + yyadd;
+ if (*yycapacity < yysize_new)
+ {
+ YYPTRDIFF_T yyalloc = 2 * yysize_new;
+ yy_state_t *yybottom_new;
+ /* Use YYMAXDEPTH for maximum stack size given that the stack
+ should never need to grow larger than the main state stack
+ needs to grow without LAC. */
+ if (YYMAXDEPTH < yysize_new)
+ {
+ YYDPRINTF ((stderr, "%smax size exceeded%s", yydebug_prefix,
+ yydebug_suffix));
+ return YYENOMEM;
+ }
+ if (YYMAXDEPTH < yyalloc)
+ yyalloc = YYMAXDEPTH;
+ yybottom_new =
+ YY_CAST (yy_state_t *,
+ YYSTACK_ALLOC (YY_CAST (YYSIZE_T,
+ yyalloc * YYSIZEOF (*yybottom_new))));
+ if (!yybottom_new)
+ {
+ YYDPRINTF ((stderr, "%srealloc failed%s", yydebug_prefix,
+ yydebug_suffix));
+ return YYENOMEM;
+ }
+ if (*yytop != yytop_empty)
+ {
+ YYCOPY (yybottom_new, *yybottom, yysize_old);
+ *yytop = yybottom_new + (yysize_old - 1);
+ }
+ if (*yybottom != yybottom_no_free)
+ YYSTACK_FREE (*yybottom);
+ *yybottom = yybottom_new;
+ *yycapacity = yyalloc;
+ }
+ return 0;
+}
+
+/* Establish the initial context for the current lookahead if no initial
+ context is currently established.
+
+ We define a context as a snapshot of the parser stacks. We define
+ the initial context for a lookahead as the context in which the
+ parser initially examines that lookahead in order to select a
+ syntactic action. Thus, if the lookahead eventually proves
+ syntactically unacceptable (possibly in a later context reached via a
+ series of reductions), the initial context can be used to determine
+ the exact set of tokens that would be syntactically acceptable in the
+ lookahead's place. Moreover, it is the context after which any
+ further semantic actions would be erroneous because they would be
+ determined by a syntactically unacceptable token.
+
+ YY_LAC_ESTABLISH should be invoked when a reduction is about to be
+ performed in an inconsistent state (which, for the purposes of LAC,
+ includes consistent states that don't know they're consistent because
+ their default reductions have been disabled). Iff there is a
+ lookahead token, it should also be invoked before reporting a syntax
+ error. This latter case is for the sake of the debugging output.
+
+ For parse.lac=full, the implementation of YY_LAC_ESTABLISH is as
+ follows. If no initial context is currently established for the
+ current lookahead, then check if that lookahead can eventually be
+ shifted if syntactic actions continue from the current context.
+ Report a syntax error if it cannot. */
+#define YY_LAC_ESTABLISH \
+do { \
+ if (!yy_lac_established) \
+ { \
+ YYDPRINTF ((stderr, \
+ "LAC: initial context established for %s\n", \
+ yysymbol_name (yytoken))); \
+ yy_lac_established = 1; \
+ switch (yy_lac (yyesa, &yyes, &yyes_capacity, yyssp, yytoken)) \
+ { \
+ case YYENOMEM: \
+ YYNOMEM; \
+ case 1: \
+ goto yyerrlab; \
+ } \
+ } \
+} while (0)
+
+/* Discard any previous initial lookahead context because of Event,
+ which may be a lookahead change or an invalidation of the currently
+ established initial context for the current lookahead.
+
+ The most common example of a lookahead change is a shift. An example
+ of both cases is syntax error recovery. That is, a syntax error
+ occurs when the lookahead is syntactically erroneous for the
+ currently established initial context, so error recovery manipulates
+ the parser stacks to try to find a new initial context in which the
+ current lookahead is syntactically acceptable. If it fails to find
+ such a context, it discards the lookahead. */
+#if YYDEBUG
+# define YY_LAC_DISCARD(Event) \
+do { \
+ if (yy_lac_established) \
+ { \
+ YYDPRINTF ((stderr, "LAC: initial context discarded due to " \
+ Event "\n")); \
+ yy_lac_established = 0; \
+ } \
+} while (0)
+#else
+# define YY_LAC_DISCARD(Event) yy_lac_established = 0
+#endif
+
+/* Given the stack whose top is *YYSSP, return 0 iff YYTOKEN can
+ eventually (after perhaps some reductions) be shifted, return 1 if
+ not, or return YYENOMEM if memory is exhausted. As preconditions and
+ postconditions: *YYES_CAPACITY is the allocated size of the array to
+ which *YYES points, and either *YYES = YYESA or *YYES points to an
+ array allocated with YYSTACK_ALLOC. yy_lac may overwrite the
+ contents of either array, alter *YYES and *YYES_CAPACITY, and free
+ any old *YYES other than YYESA. */
+static int
+yy_lac (yy_state_t *yyesa, yy_state_t **yyes,
+ YYPTRDIFF_T *yyes_capacity, yy_state_t *yyssp, yysymbol_kind_t yytoken)
+{
+ yy_state_t *yyes_prev = yyssp;
+ yy_state_t *yyesp = yyes_prev;
+ /* Reduce until we encounter a shift and thereby accept the token. */
+ YYDPRINTF ((stderr, "LAC: checking lookahead %s:", yysymbol_name (yytoken)));
+ if (yytoken == YYSYMBOL_YYUNDEF)
+ {
+ YYDPRINTF ((stderr, " Always Err\n"));
+ return 1;
+ }
+ while (1)
+ {
+ int yyrule = yypact[+*yyesp];
+ if (yypact_value_is_default (yyrule)
+ || (yyrule += yytoken) < 0 || YYLAST < yyrule
+ || yycheck[yyrule] != yytoken)
+ {
+ /* Use the default action. */
+ yyrule = yydefact[+*yyesp];
+ if (yyrule == 0)
+ {
+ YYDPRINTF ((stderr, " Err\n"));
+ return 1;
+ }
+ }
+ else
+ {
+ /* Use the action from yytable. */
+ yyrule = yytable[yyrule];
+ if (yytable_value_is_error (yyrule))
+ {
+ YYDPRINTF ((stderr, " Err\n"));
+ return 1;
+ }
+ if (0 < yyrule)
+ {
+ YYDPRINTF ((stderr, " S%d\n", yyrule));
+ return 0;
+ }
+ yyrule = -yyrule;
+ }
+ /* By now we know we have to simulate a reduce. */
+ YYDPRINTF ((stderr, " R%d", yyrule - 1));
+ {
+ /* Pop the corresponding number of values from the stack. */
+ YYPTRDIFF_T yylen = yyr2[yyrule];
+ /* First pop from the LAC stack as many tokens as possible. */
+ if (yyesp != yyes_prev)
+ {
+ YYPTRDIFF_T yysize = yyesp - *yyes + 1;
+ if (yylen < yysize)
+ {
+ yyesp -= yylen;
+ yylen = 0;
+ }
+ else
+ {
+ yyesp = yyes_prev;
+ yylen -= yysize;
+ }
+ }
+ /* Only afterwards look at the main stack. */
+ if (yylen)
+ yyesp = yyes_prev -= yylen;
+ }
+ /* Push the resulting state of the reduction. */
+ {
+ yy_state_fast_t yystate;
+ {
+ const int yylhs = yyr1[yyrule] - YYNTOKENS;
+ const int yyi = yypgoto[yylhs] + *yyesp;
+ yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyesp
+ ? yytable[yyi]
+ : yydefgoto[yylhs]);
+ }
+ if (yyesp == yyes_prev)
+ {
+ yyesp = *yyes;
+ YY_IGNORE_USELESS_CAST_BEGIN
+ *yyesp = YY_CAST (yy_state_t, yystate);
+ YY_IGNORE_USELESS_CAST_END
+ }
+ else
+ {
+ if (yy_lac_stack_realloc (yyes_capacity, 1,
+#if YYDEBUG
+ " (", ")",
+#endif
+ yyes, yyesa, &yyesp, yyes_prev))
+ {
+ YYDPRINTF ((stderr, "\n"));
+ return YYENOMEM;
+ }
+ YY_IGNORE_USELESS_CAST_BEGIN
+ *++yyesp = YY_CAST (yy_state_t, yystate);
+ YY_IGNORE_USELESS_CAST_END
+ }
+ YYDPRINTF ((stderr, " G%d", yystate));
+ }
+ }
+}
+
+/* Context of a parse error. */
+typedef struct
+{
+ yy_state_t *yyssp;
+ yy_state_t *yyesa;
+ yy_state_t **yyes;
+ YYPTRDIFF_T *yyes_capacity;
+ yysymbol_kind_t yytoken;
+} yypcontext_t;
+
+/* Put in YYARG at most YYARGN of the expected tokens given the
+ current YYCTX, and return the number of tokens stored in YYARG. If
+ YYARG is null, return the number of expected tokens (guaranteed to
+ be less than YYNTOKENS). Return YYENOMEM on memory exhaustion.
+ Return 0 if there are more than YYARGN expected tokens, yet fill
+ YYARG up to YYARGN. */
+static int
+yypcontext_expected_tokens (const yypcontext_t *yyctx,
+ yysymbol_kind_t yyarg[], int yyargn)
+{
+ /* Actual size of YYARG. */
+ int yycount = 0;
+
+ int yyx;
+ for (yyx = 0; yyx < YYNTOKENS; ++yyx)
+ {
+ yysymbol_kind_t yysym = YY_CAST (yysymbol_kind_t, yyx);
+ if (yysym != YYSYMBOL_YYerror && yysym != YYSYMBOL_YYUNDEF)
+ switch (yy_lac (yyctx->yyesa, yyctx->yyes, yyctx->yyes_capacity, yyctx->yyssp, yysym))
+ {
+ case YYENOMEM:
+ return YYENOMEM;
+ case 1:
+ continue;
+ default:
+ if (!yyarg)
+ ++yycount;
+ else if (yycount == yyargn)
+ return 0;
+ else
+ yyarg[yycount++] = yysym;
+ }
+ }
+ if (yyarg && yycount == 0 && 0 < yyargn)
+ yyarg[0] = YYSYMBOL_YYEMPTY;
+ return yycount;
+}
+
+
+
+
+#ifndef yystrlen
+# if defined __GLIBC__ && defined _STRING_H
+# define yystrlen(S) (YY_CAST (YYPTRDIFF_T, strlen (S)))
+# else
+/* Return the length of YYSTR. */
+static YYPTRDIFF_T
+yystrlen (const char *yystr)
+{
+ YYPTRDIFF_T yylen;
+ for (yylen = 0; yystr[yylen]; yylen++)
+ continue;
+ return yylen;
+}
+# endif
+#endif
+
+#ifndef yystpcpy
+# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
+# define yystpcpy stpcpy
+# else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+ YYDEST. */
+static char *
+yystpcpy (char *yydest, const char *yysrc)
+{
+ char *yyd = yydest;
+ const char *yys = yysrc;
+
+ while ((*yyd++ = *yys++) != '\0')
+ continue;
+
+ return yyd - 1;
+}
+# endif
+#endif
+
+
+
+static int
+yy_syntax_error_arguments (const yypcontext_t *yyctx,
+ yysymbol_kind_t yyarg[], int yyargn)
+{
+ /* Actual size of YYARG. */
+ int yycount = 0;
+ /* There are many possibilities here to consider:
+ - If this state is a consistent state with a default action, then
+ the only way this function was invoked is if the default action
+ is an error action. In that case, don't check for expected
+ tokens because there are none.
+ - The only way there can be no lookahead present (in yychar) is if
+ this state is a consistent state with a default action. Thus,
+ detecting the absence of a lookahead is sufficient to determine
+ that there is no unexpected or expected token to report. In that
+ case, just report a simple "syntax error".
+ - Don't assume there isn't a lookahead just because this state is a
+ consistent state with a default action. There might have been a
+ previous inconsistent state, consistent state with a non-default
+ action, or user semantic action that manipulated yychar.
+ In the first two cases, it might appear that the current syntax
+ error should have been detected in the previous state when yy_lac
+ was invoked. However, at that time, there might have been a
+ different syntax error that discarded a different initial context
+ during error recovery, leaving behind the current lookahead.
+ */
+ if (yyctx->yytoken != YYSYMBOL_YYEMPTY)
+ {
+ int yyn;
+ YYDPRINTF ((stderr, "Constructing syntax error message\n"));
+ if (yyarg)
+ yyarg[yycount] = yyctx->yytoken;
+ ++yycount;
+ yyn = yypcontext_expected_tokens (yyctx,
+ yyarg ? yyarg + 1 : yyarg, yyargn - 1);
+ if (yyn == YYENOMEM)
+ return YYENOMEM;
+ else if (yyn == 0)
+ YYDPRINTF ((stderr, "No expected tokens.\n"));
+ else
+ yycount += yyn;
+ }
+ return yycount;
+}
+
+/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message
+ about the unexpected token YYTOKEN for the state stack whose top is
+ YYSSP. In order to see if a particular token T is a
+ valid looakhead, invoke yy_lac (YYESA, YYES, YYES_CAPACITY, YYSSP, T).
+
+ Return 0 if *YYMSG was successfully written. Return -1 if *YYMSG is
+ not large enough to hold the message. In that case, also set
+ *YYMSG_ALLOC to the required number of bytes. Return YYENOMEM if the
+ required number of bytes is too large to store or if
+ yy_lac returned YYENOMEM. */
+static int
+yysyntax_error (YYPTRDIFF_T *yymsg_alloc, char **yymsg,
+ const yypcontext_t *yyctx)
+{
+ enum { YYARGS_MAX = 5 };
+ /* Internationalized format string. */
+ const char *yyformat = YY_NULLPTR;
+ /* Arguments of yyformat: reported tokens (one for the "unexpected",
+ one per "expected"). */
+ yysymbol_kind_t yyarg[YYARGS_MAX];
+ /* Cumulated lengths of YYARG. */
+ YYPTRDIFF_T yysize = 0;
+
+ /* Actual size of YYARG. */
+ int yycount = yy_syntax_error_arguments (yyctx, yyarg, YYARGS_MAX);
+ if (yycount == YYENOMEM)
+ return YYENOMEM;
+
+ switch (yycount)
+ {
+#define YYCASE_(N, S) \
+ case N: \
+ yyformat = S; \
+ break
+ default: /* Avoid compiler warnings. */
+ YYCASE_(0, YY_("syntax error"));
+ YYCASE_(1, YY_("syntax error, unexpected %s"));
+ YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
+ YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
+ YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
+ YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
+#undef YYCASE_
+ }
+
+ /* Compute error message size. Don't count the "%s"s, but reserve
+ room for the terminator. */
+ yysize = yystrlen (yyformat) - 2 * yycount + 1;
+ {
+ int yyi;
+ for (yyi = 0; yyi < yycount; ++yyi)
+ {
+ YYPTRDIFF_T yysize1
+ = yysize + yystrlen (yysymbol_name (yyarg[yyi]));
+ if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)
+ yysize = yysize1;
+ else
+ return YYENOMEM;
+ }
+ }
+
+ if (*yymsg_alloc < yysize)
+ {
+ *yymsg_alloc = 2 * yysize;
+ if (! (yysize <= *yymsg_alloc
+ && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM))
+ *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM;
+ return -1;
+ }
+
+ /* Avoid sprintf, as that infringes on the user's name space.
+ Don't have undefined behavior even if the translation
+ produced a string with the wrong number of "%s"s. */
+ {
+ char *yyp = *yymsg;
+ int yyi = 0;
+ while ((*yyp = *yyformat) != '\0')
+ if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount)
+ {
+ yyp = yystpcpy (yyp, yysymbol_name (yyarg[yyi++]));
+ yyformat += 2;
+ }
+ else
+ {
+ ++yyp;
+ ++yyformat;
+ }
+ }
+ return 0;
+}
+
+
+/*-----------------------------------------------.
+| Release the memory associated to this symbol. |
+`-----------------------------------------------*/
+
+static void
+yydestruct (const char *yymsg,
+ yysymbol_kind_t yykind, YYSTYPE *yyvaluep)
+{
+ YY_USE (yyvaluep);
+ if (!yymsg)
+ yymsg = "Deleting";
+ YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp);
+
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ YY_USE (yykind);
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+}
+
+
+/* Lookahead token kind. */
+int yychar;
+
+/* The semantic value of the lookahead symbol. */
+YYSTYPE yylval;
+/* Number of syntax errors so far. */
+int yynerrs;
+
+
+
+
+/*----------.
+| yyparse. |
+`----------*/
+
+int
+yyparse (void)
+{
+ yy_state_fast_t yystate = 0;
+ /* Number of tokens to shift before error messages enabled. */
+ int yyerrstatus = 0;
+
+ /* Refer to the stacks through separate pointers, to allow yyoverflow
+ to reallocate them elsewhere. */
+
+ /* Their size. */
+ YYPTRDIFF_T yystacksize = YYINITDEPTH;
+
+ /* The state stack: array, bottom, top. */
+ yy_state_t yyssa[YYINITDEPTH];
+ yy_state_t *yyss = yyssa;
+ yy_state_t *yyssp = yyss;
+
+ /* The semantic value stack: array, bottom, top. */
+ YYSTYPE yyvsa[YYINITDEPTH];
+ YYSTYPE *yyvs = yyvsa;
+ YYSTYPE *yyvsp = yyvs;
+
+ yy_state_t yyesa[20];
+ yy_state_t *yyes = yyesa;
+ YYPTRDIFF_T yyes_capacity = 20 < YYMAXDEPTH ? 20 : YYMAXDEPTH;
+
+ /* Whether LAC context is established. A Boolean. */
+ int yy_lac_established = 0;
+ int yyn;
+ /* The return value of yyparse. */
+ int yyresult;
+ /* Lookahead symbol kind. */
+ yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY;
+ /* The variables used to return semantic value and location from the
+ action routines. */
+ YYSTYPE yyval;
+
+ /* Buffer for error messages, and its allocated size. */
+ char yymsgbuf[128];
+ char *yymsg = yymsgbuf;
+ YYPTRDIFF_T yymsg_alloc = sizeof yymsgbuf;
+
+#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
+
+ /* The number of symbols on the RHS of the reduced rule.
+ Keep to zero when no symbol should be popped. */
+ int yylen = 0;
+
+ YYDPRINTF ((stderr, "Starting parse\n"));
+
+ yychar = YYEMPTY; /* Cause a token to be read. */
+
+ goto yysetstate;
+
+
+/*------------------------------------------------------------.
+| yynewstate -- push a new state, which is found in yystate. |
+`------------------------------------------------------------*/
+yynewstate:
+ /* In all cases, when you get here, the value and location stacks
+ have just been pushed. So pushing a state here evens the stacks. */
+ yyssp++;
+
+
+/*--------------------------------------------------------------------.
+| yysetstate -- set current state (the top of the stack) to yystate. |
+`--------------------------------------------------------------------*/
+yysetstate:
+ YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+ YY_ASSERT (0 <= yystate && yystate < YYNSTATES);
+ YY_IGNORE_USELESS_CAST_BEGIN
+ *yyssp = YY_CAST (yy_state_t, yystate);
+ YY_IGNORE_USELESS_CAST_END
+ YY_STACK_PRINT (yyss, yyssp);
+
+ if (yyss + yystacksize - 1 <= yyssp)
+#if !defined yyoverflow && !defined YYSTACK_RELOCATE
+ YYNOMEM;
+#else
+ {
+ /* Get the current used size of the three stacks, in elements. */
+ YYPTRDIFF_T yysize = yyssp - yyss + 1;
+
+# if defined yyoverflow
+ {
+ /* Give user a chance to reallocate the stack. Use copies of
+ these so that the &'s don't force the real ones into
+ memory. */
+ yy_state_t *yyss1 = yyss;
+ YYSTYPE *yyvs1 = yyvs;
+
+ /* Each stack pointer address is followed by the size of the
+ data in use in that stack, in bytes. This used to be a
+ conditional around just the two extra args, but that might
+ be undefined if yyoverflow is a macro. */
+ yyoverflow (YY_("memory exhausted"),
+ &yyss1, yysize * YYSIZEOF (*yyssp),
+ &yyvs1, yysize * YYSIZEOF (*yyvsp),
+ &yystacksize);
+ yyss = yyss1;
+ yyvs = yyvs1;
+ }
+# else /* defined YYSTACK_RELOCATE */
+ /* Extend the stack our own way. */
+ if (YYMAXDEPTH <= yystacksize)
+ YYNOMEM;
+ yystacksize *= 2;
+ if (YYMAXDEPTH < yystacksize)
+ yystacksize = YYMAXDEPTH;
+
+ {
+ yy_state_t *yyss1 = yyss;
+ union yyalloc *yyptr =
+ YY_CAST (union yyalloc *,
+ YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize))));
+ if (! yyptr)
+ YYNOMEM;
+ YYSTACK_RELOCATE (yyss_alloc, yyss);
+ YYSTACK_RELOCATE (yyvs_alloc, yyvs);
+# undef YYSTACK_RELOCATE
+ if (yyss1 != yyssa)
+ YYSTACK_FREE (yyss1);
+ }
+# endif
+
+ yyssp = yyss + yysize - 1;
+ yyvsp = yyvs + yysize - 1;
+
+ YY_IGNORE_USELESS_CAST_BEGIN
+ YYDPRINTF ((stderr, "Stack size increased to %ld\n",
+ YY_CAST (long, yystacksize)));
+ YY_IGNORE_USELESS_CAST_END
+
+ if (yyss + yystacksize - 1 <= yyssp)
+ YYABORT;
+ }
+#endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */
+
+
+ if (yystate == YYFINAL)
+ YYACCEPT;
+
+ goto yybackup;
+
+
+/*-----------.
+| yybackup. |
+`-----------*/
+yybackup:
+ /* Do appropriate processing given the current state. Read a
+ lookahead token if we need one and don't already have one. */
+
+ /* First try to decide what to do without reference to lookahead token. */
+ yyn = yypact[yystate];
+ if (yypact_value_is_default (yyn))
+ goto yydefault;
+
+ /* Not known => get a lookahead token if don't already have one. */
+
+ /* YYCHAR is either empty, or end-of-input, or a valid lookahead. */
+ if (yychar == YYEMPTY)
+ {
+ YYDPRINTF ((stderr, "Reading a token\n"));
+ yychar = yylex ();
+ }
+
+ if (yychar <= T_EOF)
+ {
+ yychar = T_EOF;
+ yytoken = YYSYMBOL_YYEOF;
+ YYDPRINTF ((stderr, "Now at end of input.\n"));
+ }
+ else if (yychar == YYerror)
+ {
+ /* The scanner already issued an error message, process directly
+ to error recovery. But do not keep the error token as
+ lookahead, it is too special and may lead us to an endless
+ loop in error recovery. */
+ yychar = YYUNDEF;
+ yytoken = YYSYMBOL_YYerror;
+ goto yyerrlab1;
+ }
+ else
+ {
+ yytoken = YYTRANSLATE (yychar);
+ YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
+ }
+
+ /* If the proper action on seeing token YYTOKEN is to reduce or to
+ detect an error, take that action. */
+ yyn += yytoken;
+ if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+ {
+ YY_LAC_ESTABLISH;
+ goto yydefault;
+ }
+ yyn = yytable[yyn];
+ if (yyn <= 0)
+ {
+ if (yytable_value_is_error (yyn))
+ goto yyerrlab;
+ yyn = -yyn;
+ YY_LAC_ESTABLISH;
+ goto yyreduce;
+ }
+
+ /* Count tokens shifted since error; after three, turn off error
+ status. */
+ if (yyerrstatus)
+ yyerrstatus--;
+
+ /* Shift the lookahead token. */
+ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
+ yystate = yyn;
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ *++yyvsp = yylval;
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+
+ /* Discard the shifted token. */
+ yychar = YYEMPTY;
+ YY_LAC_DISCARD ("shift");
+ goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state. |
+`-----------------------------------------------------------*/
+yydefault:
+ yyn = yydefact[yystate];
+ if (yyn == 0)
+ goto yyerrlab;
+ goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- do a reduction. |
+`-----------------------------*/
+yyreduce:
+ /* yyn is the number of a rule to reduce with. */
+ yylen = yyr2[yyn];
+
+ /* If YYLEN is nonzero, implement the default value of the action:
+ '$$ = $1'.
+
+ Otherwise, the following line sets YYVAL to garbage.
+ This behavior is undocumented and Bison
+ users should not rely upon it. Assigning to YYVAL
+ unconditionally makes the parser a bit smaller, and it avoids a
+ GCC warning that YYVAL may be used uninitialized. */
+ yyval = yyvsp[1-yylen];
+
+
+ YY_REDUCE_PRINT (yyn);
+ {
+ int yychar_backup = yychar;
+ switch (yyn)
+ {
+ case 8: /* opt_diff_mark: "+" */
+#line 700 "src/asm/parser.y"
+ {
+ error("syntax error, unexpected + at the beginning of the line (is it a leftover diff mark?)\n");
+ }
+#line 3332 "src/asm/parser.c"
+ break;
+
+ case 9: /* opt_diff_mark: "-" */
+#line 703 "src/asm/parser.y"
+ {
+ error("syntax error, unexpected - at the beginning of the line (is it a leftover diff mark?)\n");
+ }
+#line 3340 "src/asm/parser.c"
+ break;
+
+ case 12: /* $@1: %empty */
+#line 711 "src/asm/parser.y"
+ {
+ lexer_SetMode(LEXER_NORMAL);
+ lexer_ToggleStringExpansion(true);
+ }
+#line 3349 "src/asm/parser.c"
+ break;
+
+ case 13: /* line: error $@1 endofline */
+#line 714 "src/asm/parser.y"
+ {
+ fstk_StopRept();
+ yyerrok;
+ }
+#line 3358 "src/asm/parser.c"
+ break;
+
+ case 14: /* $@2: %empty */
+#line 719 "src/asm/parser.y"
+ {
+ lexer_SetMode(LEXER_NORMAL);
+ lexer_ToggleStringExpansion(true);
+ }
+#line 3367 "src/asm/parser.c"
+ break;
+
+ case 15: /* line: "label" error $@2 endofline */
+#line 722 "src/asm/parser.y"
+ {
+ struct Symbol *macro = sym_FindExactSymbol((yyvsp[-3].symName));
+
+ if (macro && macro->type == SYM_MACRO)
+ fprintf(stderr,
+ " To invoke `%s` as a macro it must be indented\n", (yyvsp[-3].symName));
+ fstk_StopRept();
+ yyerrok;
+ }
+#line 3381 "src/asm/parser.c"
+ break;
+
+ case 24: /* if: "IF" const "newline" */
+#line 748 "src/asm/parser.y"
+ {
+ lexer_IncIFDepth();
+
+ if ((yyvsp[-1].constValue))
+ lexer_RunIFBlock();
+ else
+ lexer_SetMode(LEXER_SKIP_TO_ELIF);
+ }
+#line 3394 "src/asm/parser.c"
+ break;
+
+ case 25: /* elif: "ELIF" const "newline" */
+#line 758 "src/asm/parser.y"
+ {
+ if (lexer_GetIFDepth() == 0)
+ fatalerror("Found ELIF outside an IF construct\n");
+
+ if (lexer_RanIFBlock()) {
+ if (lexer_ReachedELSEBlock())
+ fatalerror("Found ELIF after an ELSE block\n");
+
+ lexer_SetMode(LEXER_SKIP_TO_ENDC);
+ } else if ((yyvsp[-1].constValue)) {
+ lexer_RunIFBlock();
+ } else {
+ lexer_SetMode(LEXER_SKIP_TO_ELIF);
+ }
+ }
+#line 3414 "src/asm/parser.c"
+ break;
+
+ case 26: /* else: "ELSE" "newline" */
+#line 775 "src/asm/parser.y"
+ {
+ if (lexer_GetIFDepth() == 0)
+ fatalerror("Found ELSE outside an IF construct\n");
+
+ if (lexer_RanIFBlock()) {
+ if (lexer_ReachedELSEBlock())
+ fatalerror("Found ELSE after an ELSE block\n");
+
+ lexer_SetMode(LEXER_SKIP_TO_ENDC);
+ } else {
+ lexer_RunIFBlock();
+ lexer_ReachELSEBlock();
+ }
+ }
+#line 3433 "src/asm/parser.c"
+ break;
+
+ case 32: /* endc: "ENDC" */
+#line 798 "src/asm/parser.y"
+ {
+ lexer_DecIFDepth();
+ }
+#line 3441 "src/asm/parser.c"
+ break;
+
+ case 33: /* $@3: %empty */
+#line 803 "src/asm/parser.y"
+ {
+ lexer_ToggleStringExpansion(false);
+ }
+#line 3449 "src/asm/parser.c"
+ break;
+
+ case 34: /* def_id: "DEF" $@3 "identifier" */
+#line 805 "src/asm/parser.y"
+ {
+ lexer_ToggleStringExpansion(true);
+ strcpy((yyval.symName), (yyvsp[0].symName));
+ }
+#line 3458 "src/asm/parser.c"
+ break;
+
+ case 35: /* $@4: %empty */
+#line 811 "src/asm/parser.y"
+ {
+ lexer_ToggleStringExpansion(false);
+ }
+#line 3466 "src/asm/parser.c"
+ break;
+
+ case 36: /* redef_id: "REDEF" $@4 "identifier" */
+#line 813 "src/asm/parser.y"
+ {
+ lexer_ToggleStringExpansion(true);
+ strcpy((yyval.symName), (yyvsp[0].symName));
+ }
+#line 3475 "src/asm/parser.c"
+ break;
+
+ case 42: /* label: ":" */
+#line 823 "src/asm/parser.y"
+ {
+ sym_AddAnonLabel();
+ }
+#line 3483 "src/asm/parser.c"
+ break;
+
+ case 43: /* label: "local identifier" */
+#line 826 "src/asm/parser.y"
+ {
+ sym_AddLocalLabel((yyvsp[0].symName));
+ }
+#line 3491 "src/asm/parser.c"
+ break;
+
+ case 44: /* label: "local identifier" ":" */
+#line 829 "src/asm/parser.y"
+ {
+ sym_AddLocalLabel((yyvsp[-1].symName));
+ }
+#line 3499 "src/asm/parser.c"
+ break;
+
+ case 45: /* label: "label" ":" */
+#line 832 "src/asm/parser.y"
+ {
+ sym_AddLabel((yyvsp[-1].symName));
+ }
+#line 3507 "src/asm/parser.c"
+ break;
+
+ case 46: /* label: "local identifier" ":" ":" */
+#line 835 "src/asm/parser.y"
+ {
+ sym_AddLocalLabel((yyvsp[-2].symName));
+ sym_Export((yyvsp[-2].symName));
+ }
+#line 3516 "src/asm/parser.c"
+ break;
+
+ case 47: /* label: "label" ":" ":" */
+#line 839 "src/asm/parser.y"
+ {
+ sym_AddLabel((yyvsp[-2].symName));
+ sym_Export((yyvsp[-2].symName));
+ }
+#line 3525 "src/asm/parser.c"
+ break;
+
+ case 48: /* $@5: %empty */
+#line 845 "src/asm/parser.y"
+ {
+ // Parsing 'macroargs' will restore the lexer's normal mode
+ lexer_SetMode(LEXER_RAW);
+ }
+#line 3534 "src/asm/parser.c"
+ break;
+
+ case 49: /* macro: "identifier" $@5 macroargs */
+#line 848 "src/asm/parser.y"
+ {
+ fstk_RunMacro((yyvsp[-2].symName), (yyvsp[0].macroArg));
+ }
+#line 3542 "src/asm/parser.c"
+ break;
+
+ case 50: /* macroargs: %empty */
+#line 853 "src/asm/parser.y"
+ {
+ (yyval.macroArg) = macro_NewArgs();
+ }
+#line 3550 "src/asm/parser.c"
+ break;
+
+ case 51: /* macroargs: macroargs "string" */
+#line 856 "src/asm/parser.y"
+ {
+ macro_AppendArg(&((yyval.macroArg)), strdup((yyvsp[0].string)));
+ }
+#line 3558 "src/asm/parser.c"
+ break;
+
+ case 100: /* compoundeq: "+=" */
+#line 915 "src/asm/parser.y"
+ { (yyval.compoundEqual) = RPN_ADD; }
+#line 3564 "src/asm/parser.c"
+ break;
+
+ case 101: /* compoundeq: "-=" */
+#line 916 "src/asm/parser.y"
+ { (yyval.compoundEqual) = RPN_SUB; }
+#line 3570 "src/asm/parser.c"
+ break;
+
+ case 102: /* compoundeq: "*=" */
+#line 917 "src/asm/parser.y"
+ { (yyval.compoundEqual) = RPN_MUL; }
+#line 3576 "src/asm/parser.c"
+ break;
+
+ case 103: /* compoundeq: "/=" */
+#line 918 "src/asm/parser.y"
+ { (yyval.compoundEqual) = RPN_DIV; }
+#line 3582 "src/asm/parser.c"
+ break;
+
+ case 104: /* compoundeq: "%=" */
+#line 919 "src/asm/parser.y"
+ { (yyval.compoundEqual) = RPN_MOD; }
+#line 3588 "src/asm/parser.c"
+ break;
+
+ case 105: /* compoundeq: "^=" */
+#line 920 "src/asm/parser.y"
+ { (yyval.compoundEqual) = RPN_XOR; }
+#line 3594 "src/asm/parser.c"
+ break;
+
+ case 106: /* compoundeq: "|=" */
+#line 921 "src/asm/parser.y"
+ { (yyval.compoundEqual) = RPN_OR; }
+#line 3600 "src/asm/parser.c"
+ break;
+
+ case 107: /* compoundeq: "&=" */
+#line 922 "src/asm/parser.y"
+ { (yyval.compoundEqual) = RPN_AND; }
+#line 3606 "src/asm/parser.c"
+ break;
+
+ case 108: /* compoundeq: "<<=" */
+#line 923 "src/asm/parser.y"
+ { (yyval.compoundEqual) = RPN_SHL; }
+#line 3612 "src/asm/parser.c"
+ break;
+
+ case 109: /* compoundeq: ">>=" */
+#line 924 "src/asm/parser.y"
+ { (yyval.compoundEqual) = RPN_SHR; }
+#line 3618 "src/asm/parser.c"
+ break;
+
+ case 110: /* equ: "label" "EQU" const */
+#line 927 "src/asm/parser.y"
+ { sym_AddEqu((yyvsp[-2].symName), (yyvsp[0].constValue)); }
+#line 3624 "src/asm/parser.c"
+ break;
+
+ case 111: /* assignment: "label" "=" const */
+#line 930 "src/asm/parser.y"
+ { sym_AddVar((yyvsp[-2].symName), (yyvsp[0].constValue)); }
+#line 3630 "src/asm/parser.c"
+ break;
+
+ case 112: /* assignment: "label" compoundeq const */
+#line 931 "src/asm/parser.y"
+ { compoundAssignment((yyvsp[-2].symName), (yyvsp[-1].compoundEqual), (yyvsp[0].constValue)); }
+#line 3636 "src/asm/parser.c"
+ break;
+
+ case 113: /* equs: "label" "EQUS" string */
+#line 934 "src/asm/parser.y"
+ { sym_AddString((yyvsp[-2].symName), (yyvsp[0].string)); }
+#line 3642 "src/asm/parser.c"
+ break;
+
+ case 114: /* rb: "label" "RB" rs_uconst */
+#line 937 "src/asm/parser.y"
+ {
+ sym_AddEqu((yyvsp[-2].symName), sym_GetConstantValue("_RS"));
+ sym_AddVar("_RS", sym_GetConstantValue("_RS") + (yyvsp[0].constValue));
+ }
+#line 3651 "src/asm/parser.c"
+ break;
+
+ case 115: /* rw: "label" "RW" rs_uconst */
+#line 943 "src/asm/parser.y"
+ {
+ sym_AddEqu((yyvsp[-2].symName), sym_GetConstantValue("_RS"));
+ sym_AddVar("_RS", sym_GetConstantValue("_RS") + 2 * (yyvsp[0].constValue));
+ }
+#line 3660 "src/asm/parser.c"
+ break;
+
+ case 116: /* rl: "label" "rl" rs_uconst */
+#line 949 "src/asm/parser.y"
+ {
+ sym_AddEqu((yyvsp[-2].symName), sym_GetConstantValue("_RS"));
+ sym_AddVar("_RS", sym_GetConstantValue("_RS") + 4 * (yyvsp[0].constValue));
+ }
+#line 3669 "src/asm/parser.c"
+ break;
+
+ case 117: /* align: "ALIGN" uconst */
+#line 955 "src/asm/parser.y"
+ {
+ if ((yyvsp[0].constValue) > 16)
+ error("Alignment must be between 0 and 16, not %u\n", (yyvsp[0].constValue));
+ else
+ sect_AlignPC((yyvsp[0].constValue), 0);
+ }
+#line 3680 "src/asm/parser.c"
+ break;
+
+ case 118: /* align: "ALIGN" uconst "," uconst */
+#line 961 "src/asm/parser.y"
+ {
+ if ((yyvsp[-2].constValue) > 16)
+ error("Alignment must be between 0 and 16, not %u\n", (yyvsp[-2].constValue));
+ else if ((yyvsp[0].constValue) >= 1 << (yyvsp[-2].constValue))
+ error("Offset must be between 0 and %u, not %u\n",
+ (1 << (yyvsp[-2].constValue)) - 1, (yyvsp[0].constValue));
+ else
+ sect_AlignPC((yyvsp[-2].constValue), (yyvsp[0].constValue));
+ }
+#line 3694 "src/asm/parser.c"
+ break;
+
+ case 119: /* $@6: %empty */
+#line 972 "src/asm/parser.y"
+ {
+ // Parsing 'opt_list' will restore the lexer's normal mode
+ lexer_SetMode(LEXER_RAW);
+ }
+#line 3703 "src/asm/parser.c"
+ break;
+
+ case 123: /* opt_list_entry: "string" */
+#line 982 "src/asm/parser.y"
+ { opt_Parse((yyvsp[0].string)); }
+#line 3709 "src/asm/parser.c"
+ break;
+
+ case 124: /* popo: "POPO" */
+#line 985 "src/asm/parser.y"
+ { opt_Pop(); }
+#line 3715 "src/asm/parser.c"
+ break;
+
+ case 125: /* pusho: "PUSHO" */
+#line 988 "src/asm/parser.y"
+ { opt_Push(); }
+#line 3721 "src/asm/parser.c"
+ break;
+
+ case 126: /* pops: "POPS" */
+#line 991 "src/asm/parser.y"
+ { sect_PopSection(); }
+#line 3727 "src/asm/parser.c"
+ break;
+
+ case 127: /* pushs: "PUSHS" */
+#line 994 "src/asm/parser.y"
+ { sect_PushSection(); }
+#line 3733 "src/asm/parser.c"
+ break;
+
+ case 128: /* fail: "FAIL" string */
+#line 997 "src/asm/parser.y"
+ { fatalerror("%s\n", (yyvsp[0].string)); }
+#line 3739 "src/asm/parser.c"
+ break;
+
+ case 129: /* warn: "WARN" string */
+#line 1000 "src/asm/parser.y"
+ { warning(WARNING_USER, "%s\n", (yyvsp[0].string)); }
+#line 3745 "src/asm/parser.c"
+ break;
+
+ case 130: /* assert_type: %empty */
+#line 1003 "src/asm/parser.y"
+ { (yyval.assertType) = ASSERT_ERROR; }
+#line 3751 "src/asm/parser.c"
+ break;
+
+ case 131: /* assert_type: "WARN" "," */
+#line 1004 "src/asm/parser.y"
+ { (yyval.assertType) = ASSERT_WARN; }
+#line 3757 "src/asm/parser.c"
+ break;
+
+ case 132: /* assert_type: "FAIL" "," */
+#line 1005 "src/asm/parser.y"
+ { (yyval.assertType) = ASSERT_ERROR; }
+#line 3763 "src/asm/parser.c"
+ break;
+
+ case 133: /* assert_type: "FATAL" "," */
+#line 1006 "src/asm/parser.y"
+ { (yyval.assertType) = ASSERT_FATAL; }
+#line 3769 "src/asm/parser.c"
+ break;
+
+ case 134: /* assert: "ASSERT" assert_type relocexpr */
+#line 1009 "src/asm/parser.y"
+ {
+ if (!rpn_isKnown(&(yyvsp[0].expr))) {
+ if (!out_CreateAssert((yyvsp[-1].assertType), &(yyvsp[0].expr), "",
+ sect_GetOutputOffset()))
+ error("Assertion creation failed: %s\n",
+ strerror(errno));
+ } else if ((yyvsp[0].expr).val == 0) {
+ failAssert((yyvsp[-1].assertType));
+ }
+ rpn_Free(&(yyvsp[0].expr));
+ }
+#line 3785 "src/asm/parser.c"
+ break;
+
+ case 135: /* assert: "ASSERT" assert_type relocexpr "," string */
+#line 1020 "src/asm/parser.y"
+ {
+ if (!rpn_isKnown(&(yyvsp[-2].expr))) {
+ if (!out_CreateAssert((yyvsp[-3].assertType), &(yyvsp[-2].expr), (yyvsp[0].string),
+ sect_GetOutputOffset()))
+ error("Assertion creation failed: %s\n",
+ strerror(errno));
+ } else if ((yyvsp[-2].expr).val == 0) {
+ failAssertMsg((yyvsp[-3].assertType), (yyvsp[0].string));
+ }
+ rpn_Free(&(yyvsp[-2].expr));
+ }
+#line 3801 "src/asm/parser.c"
+ break;
+
+ case 136: /* assert: "STATIC_ASSERT" assert_type const */
+#line 1031 "src/asm/parser.y"
+ {
+ if ((yyvsp[0].constValue) == 0)
+ failAssert((yyvsp[-1].assertType));
+ }
+#line 3810 "src/asm/parser.c"
+ break;
+
+ case 137: /* assert: "STATIC_ASSERT" assert_type const "," string */
+#line 1035 "src/asm/parser.y"
+ {
+ if ((yyvsp[-2].constValue) == 0)
+ failAssertMsg((yyvsp[-3].assertType), (yyvsp[0].string));
+ }
+#line 3819 "src/asm/parser.c"
+ break;
+
+ case 138: /* shift: "SHIFT" */
+#line 1041 "src/asm/parser.y"
+ { macro_ShiftCurrentArgs(1); }
+#line 3825 "src/asm/parser.c"
+ break;
+
+ case 139: /* shift: "SHIFT" const */
+#line 1042 "src/asm/parser.y"
+ { macro_ShiftCurrentArgs((yyvsp[0].constValue)); }
+#line 3831 "src/asm/parser.c"
+ break;
+
+ case 140: /* load: "LOAD" sectmod string "," sectiontype sectorg sectattrs */
+#line 1045 "src/asm/parser.y"
+ {
+ sect_SetLoadSection((yyvsp[-4].string), (yyvsp[-2].constValue), (yyvsp[-1].constValue), &(yyvsp[0].sectSpec), (yyvsp[-5].sectMod));
+ }
+#line 3839 "src/asm/parser.c"
+ break;
+
+ case 141: /* load: "ENDL" */
+#line 1048 "src/asm/parser.y"
+ { sect_EndLoadSection(); }
+#line 3845 "src/asm/parser.c"
+ break;
+
+ case 142: /* @7: %empty */
+#line 1051 "src/asm/parser.y"
+ {
+ (yyval.captureTerminated) = lexer_CaptureRept(&captureBody);
+ }
+#line 3853 "src/asm/parser.c"
+ break;
+
+ case 143: /* rept: "REPT" uconst "newline" @7 endofline */
+#line 1053 "src/asm/parser.y"
+ {
+ if ((yyvsp[-1].captureTerminated))
+ fstk_RunRept((yyvsp[-3].constValue), captureBody.lineNo, captureBody.body,
+ captureBody.size);
+ }
+#line 3863 "src/asm/parser.c"
+ break;
+
+ case 144: /* $@8: %empty */
+#line 1060 "src/asm/parser.y"
+ {
+ lexer_ToggleStringExpansion(false);
+ }
+#line 3871 "src/asm/parser.c"
+ break;
+
+ case 145: /* $@9: %empty */
+#line 1062 "src/asm/parser.y"
+ {
+ lexer_ToggleStringExpansion(true);
+ }
+#line 3879 "src/asm/parser.c"
+ break;
+
+ case 146: /* @10: %empty */
+#line 1064 "src/asm/parser.y"
+ {
+ (yyval.captureTerminated) = lexer_CaptureRept(&captureBody);
+ }
+#line 3887 "src/asm/parser.c"
+ break;
+
+ case 147: /* for: "FOR" $@8 "identifier" $@9 "," for_args "newline" @10 endofline */
+#line 1066 "src/asm/parser.y"
+ {
+ if ((yyvsp[-1].captureTerminated))
+ fstk_RunFor((yyvsp[-6].symName), (yyvsp[-3].forArgs).start, (yyvsp[-3].forArgs).stop, (yyvsp[-3].forArgs).step, captureBody.lineNo,
+ captureBody.body, captureBody.size);
+ }
+#line 3897 "src/asm/parser.c"
+ break;
+
+ case 148: /* for_args: const */
+#line 1072 "src/asm/parser.y"
+ {
+ (yyval.forArgs).start = 0;
+ (yyval.forArgs).stop = (yyvsp[0].constValue);
+ (yyval.forArgs).step = 1;
+ }
+#line 3907 "src/asm/parser.c"
+ break;
+
+ case 149: /* for_args: const "," const */
+#line 1077 "src/asm/parser.y"
+ {
+ (yyval.forArgs).start = (yyvsp[-2].constValue);
+ (yyval.forArgs).stop = (yyvsp[0].constValue);
+ (yyval.forArgs).step = 1;
+ }
+#line 3917 "src/asm/parser.c"
+ break;
+
+ case 150: /* for_args: const "," const "," const */
+#line 1082 "src/asm/parser.y"
+ {
+ (yyval.forArgs).start = (yyvsp[-4].constValue);
+ (yyval.forArgs).stop = (yyvsp[-2].constValue);
+ (yyval.forArgs).step = (yyvsp[0].constValue);
+ }
+#line 3927 "src/asm/parser.c"
+ break;
+
+ case 151: /* break: label "BREAK" endofline */
+#line 1089 "src/asm/parser.y"
+ {
+ if (fstk_Break())
+ lexer_SetMode(LEXER_SKIP_TO_ENDR);
+ }
+#line 3936 "src/asm/parser.c"
+ break;
+
+ case 152: /* $@11: %empty */
+#line 1095 "src/asm/parser.y"
+ {
+ lexer_ToggleStringExpansion(false);
+ }
+#line 3944 "src/asm/parser.c"
+ break;
+
+ case 153: /* $@12: %empty */
+#line 1097 "src/asm/parser.y"
+ {
+ lexer_ToggleStringExpansion(true);
+ }
+#line 3952 "src/asm/parser.c"
+ break;
+
+ case 154: /* @13: %empty */
+#line 1099 "src/asm/parser.y"
+ {
+ (yyval.captureTerminated) = lexer_CaptureMacroBody(&captureBody);
+ }
+#line 3960 "src/asm/parser.c"
+ break;
+
+ case 155: /* macrodef: "MACRO" $@11 "identifier" $@12 "newline" @13 endofline */
+#line 1101 "src/asm/parser.y"
+ {
+ if ((yyvsp[-1].captureTerminated))
+ sym_AddMacro((yyvsp[-4].symName), captureBody.lineNo, captureBody.body,
+ captureBody.size);
+ }
+#line 3970 "src/asm/parser.c"
+ break;
+
+ case 156: /* @14: %empty */
+#line 1106 "src/asm/parser.y"
+ {
+ warning(WARNING_OBSOLETE, "`%s: MACRO` is deprecated; use `MACRO %s`\n", (yyvsp[-3].symName), (yyvsp[-3].symName));
+ (yyval.captureTerminated) = lexer_CaptureMacroBody(&captureBody);
+ }
+#line 3979 "src/asm/parser.c"
+ break;
+
+ case 157: /* macrodef: "label" ":" "MACRO" "newline" @14 endofline */
+#line 1109 "src/asm/parser.y"
+ {
+ if ((yyvsp[-1].captureTerminated))
+ sym_AddMacro((yyvsp[-5].symName), captureBody.lineNo, captureBody.body,
+ captureBody.size);
+ }
+#line 3989 "src/asm/parser.c"
+ break;
+
+ case 158: /* rsset: "RSSET" uconst */
+#line 1116 "src/asm/parser.y"
+ { sym_AddVar("_RS", (yyvsp[0].constValue)); }
+#line 3995 "src/asm/parser.c"
+ break;
+
+ case 159: /* rsreset: "RSRESET" */
+#line 1119 "src/asm/parser.y"
+ { sym_AddVar("_RS", 0); }
+#line 4001 "src/asm/parser.c"
+ break;
+
+ case 160: /* rs_uconst: %empty */
+#line 1122 "src/asm/parser.y"
+ { (yyval.constValue) = 1; }
+#line 4007 "src/asm/parser.c"
+ break;
+
+ case 162: /* union: "UNION" */
+#line 1126 "src/asm/parser.y"
+ { sect_StartUnion(); }
+#line 4013 "src/asm/parser.c"
+ break;
+
+ case 163: /* nextu: "NEXTU" */
+#line 1129 "src/asm/parser.y"
+ { sect_NextUnionMember(); }
+#line 4019 "src/asm/parser.c"
+ break;
+
+ case 164: /* endu: "ENDU" */
+#line 1132 "src/asm/parser.y"
+ { sect_EndUnion(); }
+#line 4025 "src/asm/parser.c"
+ break;
+
+ case 165: /* ds: "DS" uconst */
+#line 1135 "src/asm/parser.y"
+ { sect_Skip((yyvsp[0].constValue), true); }
+#line 4031 "src/asm/parser.c"
+ break;
+
+ case 166: /* ds: "DS" uconst "," ds_args trailing_comma */
+#line 1136 "src/asm/parser.y"
+ {
+ sect_RelBytes((yyvsp[-3].constValue), (yyvsp[-1].dsArgs).args, (yyvsp[-1].dsArgs).nbArgs);
+ freeDsArgList(&(yyvsp[-1].dsArgs));
+ }
+#line 4040 "src/asm/parser.c"
+ break;
+
+ case 167: /* ds_args: reloc_8bit */
+#line 1142 "src/asm/parser.y"
+ {
+ initDsArgList(&(yyval.dsArgs));
+ appendDsArgList(&(yyval.dsArgs), &(yyvsp[0].expr));
+ }
+#line 4049 "src/asm/parser.c"
+ break;
+
+ case 168: /* ds_args: ds_args "," reloc_8bit */
+#line 1146 "src/asm/parser.y"
+ {
+ appendDsArgList(&(yyvsp[-2].dsArgs), &(yyvsp[0].expr));
+ (yyval.dsArgs) = (yyvsp[-2].dsArgs);
+ }
+#line 4058 "src/asm/parser.c"
+ break;
+
+ case 169: /* db: "DB" */
+#line 1152 "src/asm/parser.y"
+ { sect_Skip(1, false); }
+#line 4064 "src/asm/parser.c"
+ break;
+
+ case 171: /* dw: "DW" */
+#line 1156 "src/asm/parser.y"
+ { sect_Skip(2, false); }
+#line 4070 "src/asm/parser.c"
+ break;
+
+ case 173: /* dl: "DL" */
+#line 1160 "src/asm/parser.y"
+ { sect_Skip(4, false); }
+#line 4076 "src/asm/parser.c"
+ break;
+
+ case 175: /* def_equ: def_id "EQU" const */
+#line 1164 "src/asm/parser.y"
+ { sym_AddEqu((yyvsp[-2].symName), (yyvsp[0].constValue)); }
+#line 4082 "src/asm/parser.c"
+ break;
+
+ case 176: /* redef_equ: redef_id "EQU" const */
+#line 1167 "src/asm/parser.y"
+ { sym_RedefEqu((yyvsp[-2].symName), (yyvsp[0].constValue)); }
+#line 4088 "src/asm/parser.c"
+ break;
+
+ case 177: /* def_set: def_id "=" const */
+#line 1170 "src/asm/parser.y"
+ { sym_AddVar((yyvsp[-2].symName), (yyvsp[0].constValue)); }
+#line 4094 "src/asm/parser.c"
+ break;
+
+ case 178: /* def_set: redef_id "=" const */
+#line 1171 "src/asm/parser.y"
+ { sym_AddVar((yyvsp[-2].symName), (yyvsp[0].constValue)); }
+#line 4100 "src/asm/parser.c"
+ break;
+
+ case 179: /* def_set: def_id compoundeq const */
+#line 1172 "src/asm/parser.y"
+ { compoundAssignment((yyvsp[-2].symName), (yyvsp[-1].compoundEqual), (yyvsp[0].constValue)); }
+#line 4106 "src/asm/parser.c"
+ break;
+
+ case 180: /* def_set: redef_id compoundeq const */
+#line 1173 "src/asm/parser.y"
+ { compoundAssignment((yyvsp[-2].symName), (yyvsp[-1].compoundEqual), (yyvsp[0].constValue)); }
+#line 4112 "src/asm/parser.c"
+ break;
+
+ case 181: /* def_rb: def_id "RB" rs_uconst */
+#line 1176 "src/asm/parser.y"
+ {
+ sym_AddEqu((yyvsp[-2].symName), sym_GetConstantValue("_RS"));
+ sym_AddVar("_RS", sym_GetConstantValue("_RS") + (yyvsp[0].constValue));
+ }
+#line 4121 "src/asm/parser.c"
+ break;
+
+ case 182: /* def_rw: def_id "RW" rs_uconst */
+#line 1182 "src/asm/parser.y"
+ {
+ sym_AddEqu((yyvsp[-2].symName), sym_GetConstantValue("_RS"));
+ sym_AddVar("_RS", sym_GetConstantValue("_RS") + 2 * (yyvsp[0].constValue));
+ }
+#line 4130 "src/asm/parser.c"
+ break;
+
+ case 183: /* def_rl: def_id "rl" rs_uconst */
+#line 1188 "src/asm/parser.y"
+ {
+ sym_AddEqu((yyvsp[-2].symName), sym_GetConstantValue("_RS"));
+ sym_AddVar("_RS", sym_GetConstantValue("_RS") + 4 * (yyvsp[0].constValue));
+ }
+#line 4139 "src/asm/parser.c"
+ break;
+
+ case 184: /* def_equs: def_id "EQUS" string */
+#line 1194 "src/asm/parser.y"
+ { sym_AddString((yyvsp[-2].symName), (yyvsp[0].string)); }
+#line 4145 "src/asm/parser.c"
+ break;
+
+ case 185: /* redef_equs: redef_id "EQUS" string */
+#line 1197 "src/asm/parser.y"
+ { sym_RedefString((yyvsp[-2].symName), (yyvsp[0].string)); }
+#line 4151 "src/asm/parser.c"
+ break;
+
+ case 186: /* $@15: %empty */
+#line 1200 "src/asm/parser.y"
+ {
+ lexer_ToggleStringExpansion(false);
+ }
+#line 4159 "src/asm/parser.c"
+ break;
+
+ case 187: /* purge: "PURGE" $@15 purge_list trailing_comma */
+#line 1202 "src/asm/parser.y"
+ {
+ lexer_ToggleStringExpansion(true);
+ }
+#line 4167 "src/asm/parser.c"
+ break;
+
+ case 190: /* purge_list_entry: scoped_id */
+#line 1211 "src/asm/parser.y"
+ { sym_Purge((yyvsp[0].symName)); }
+#line 4173 "src/asm/parser.c"
+ break;
+
+ case 194: /* export_list_entry: scoped_id */
+#line 1221 "src/asm/parser.y"
+ { sym_Export((yyvsp[0].symName)); }
+#line 4179 "src/asm/parser.c"
+ break;
+
+ case 195: /* include: label "INCLUDE" string endofline */
+#line 1224 "src/asm/parser.y"
+ {
+ fstk_RunInclude((yyvsp[-1].string));
+ if (failedOnMissingInclude)
+ YYACCEPT;
+ }
+#line 4189 "src/asm/parser.c"
+ break;
+
+ case 196: /* incbin: "INCBIN" string */
+#line 1231 "src/asm/parser.y"
+ {
+ sect_BinaryFile((yyvsp[0].string), 0);
+ if (failedOnMissingInclude)
+ YYACCEPT;
+ }
+#line 4199 "src/asm/parser.c"
+ break;
+
+ case 197: /* incbin: "INCBIN" string "," const */
+#line 1236 "src/asm/parser.y"
+ {
+ sect_BinaryFile((yyvsp[-2].string), (yyvsp[0].constValue));
+ if (failedOnMissingInclude)
+ YYACCEPT;
+ }
+#line 4209 "src/asm/parser.c"
+ break;
+
+ case 198: /* incbin: "INCBIN" string "," const "," const */
+#line 1241 "src/asm/parser.y"
+ {
+ sect_BinaryFileSlice((yyvsp[-4].string), (yyvsp[-2].constValue), (yyvsp[0].constValue));
+ if (failedOnMissingInclude)
+ YYACCEPT;
+ }
+#line 4219 "src/asm/parser.c"
+ break;
+
+ case 199: /* charmap: "CHARMAP" string "," const_8bit */
+#line 1248 "src/asm/parser.y"
+ {
+ charmap_Add((yyvsp[-2].string), (uint8_t)(yyvsp[0].constValue));
+ }
+#line 4227 "src/asm/parser.c"
+ break;
+
+ case 200: /* newcharmap: "NEWCHARMAP" "identifier" */
+#line 1253 "src/asm/parser.y"
+ { charmap_New((yyvsp[0].symName), NULL); }
+#line 4233 "src/asm/parser.c"
+ break;
+
+ case 201: /* newcharmap: "NEWCHARMAP" "identifier" "," "identifier" */
+#line 1254 "src/asm/parser.y"
+ { charmap_New((yyvsp[-2].symName), (yyvsp[0].symName)); }
+#line 4239 "src/asm/parser.c"
+ break;
+
+ case 202: /* setcharmap: "SETCHARMAP" "identifier" */
+#line 1257 "src/asm/parser.y"
+ { charmap_Set((yyvsp[0].symName)); }
+#line 4245 "src/asm/parser.c"
+ break;
+
+ case 203: /* pushc: "PUSHC" */
+#line 1260 "src/asm/parser.y"
+ { charmap_Push(); }
+#line 4251 "src/asm/parser.c"
+ break;
+
+ case 204: /* popc: "POPC" */
+#line 1263 "src/asm/parser.y"
+ { charmap_Pop(); }
+#line 4257 "src/asm/parser.c"
+ break;
+
+ case 206: /* println: "PRINTLN" */
+#line 1269 "src/asm/parser.y"
+ {
+ putchar('\n');
+ fflush(stdout);
+ }
+#line 4266 "src/asm/parser.c"
+ break;
+
+ case 207: /* println: "PRINTLN" print_exprs trailing_comma */
+#line 1273 "src/asm/parser.y"
+ {
+ putchar('\n');
+ fflush(stdout);
+ }
+#line 4275 "src/asm/parser.c"
+ break;
+
+ case 210: /* print_expr: const_no_str */
+#line 1283 "src/asm/parser.y"
+ { printf("$%" PRIX32, (yyvsp[0].constValue)); }
+#line 4281 "src/asm/parser.c"
+ break;
+
+ case 211: /* print_expr: string */
+#line 1284 "src/asm/parser.y"
+ { printf("%s", (yyvsp[0].string)); }
+#line 4287 "src/asm/parser.c"
+ break;
+
+ case 212: /* const_3bit: const */
+#line 1287 "src/asm/parser.y"
+ {
+ int32_t value = (yyvsp[0].constValue);
+
+ if ((value < 0) || (value > 7)) {
+ error("Immediate value must be 3-bit\n");
+ (yyval.constValue) = 0;
+ } else {
+ (yyval.constValue) = value & 0x7;
+ }
+ }
+#line 4302 "src/asm/parser.c"
+ break;
+
+ case 215: /* constlist_8bit_entry: reloc_8bit_no_str */
+#line 1303 "src/asm/parser.y"
+ {
+ sect_RelByte(&(yyvsp[0].expr), 0);
+ }
+#line 4310 "src/asm/parser.c"
+ break;
+
+ case 216: /* constlist_8bit_entry: string */
+#line 1306 "src/asm/parser.y"
+ {
+ uint8_t *output = malloc(strlen((yyvsp[0].string))); // Cannot be larger than that
+ size_t length = charmap_Convert((yyvsp[0].string), output);
+
+ sect_AbsByteGroup(output, length);
+ free(output);
+ }
+#line 4322 "src/asm/parser.c"
+ break;
+
+ case 219: /* constlist_16bit_entry: reloc_16bit_no_str */
+#line 1319 "src/asm/parser.y"
+ {
+ sect_RelWord(&(yyvsp[0].expr), 0);
+ }
+#line 4330 "src/asm/parser.c"
+ break;
+
+ case 220: /* constlist_16bit_entry: string */
+#line 1322 "src/asm/parser.y"
+ {
+ uint8_t *output = malloc(strlen((yyvsp[0].string))); // Cannot be larger than that
+ size_t length = charmap_Convert((yyvsp[0].string), output);
+
+ sect_AbsWordGroup(output, length);
+ free(output);
+ }
+#line 4342 "src/asm/parser.c"
+ break;
+
+ case 223: /* constlist_32bit_entry: relocexpr_no_str */
+#line 1335 "src/asm/parser.y"
+ {
+ sect_RelLong(&(yyvsp[0].expr), 0);
+ }
+#line 4350 "src/asm/parser.c"
+ break;
+
+ case 224: /* constlist_32bit_entry: string */
+#line 1338 "src/asm/parser.y"
+ {
+ // Charmaps cannot increase the length of a string
+ uint8_t *output = malloc(strlen((yyvsp[0].string)));
+ size_t length = charmap_Convert((yyvsp[0].string), output);
+
+ sect_AbsLongGroup(output, length);
+ free(output);
+ }
+#line 4363 "src/asm/parser.c"
+ break;
+
+ case 225: /* reloc_8bit: relocexpr */
+#line 1348 "src/asm/parser.y"
+ {
+ rpn_CheckNBit(&(yyvsp[0].expr), 8);
+ (yyval.expr) = (yyvsp[0].expr);
+ }
+#line 4372 "src/asm/parser.c"
+ break;
+
+ case 226: /* reloc_8bit_no_str: relocexpr_no_str */
+#line 1354 "src/asm/parser.y"
+ {
+ rpn_CheckNBit(&(yyvsp[0].expr), 8);
+ (yyval.expr) = (yyvsp[0].expr);
+ }
+#line 4381 "src/asm/parser.c"
+ break;
+
+ case 227: /* reloc_8bit_offset: "+" relocexpr */
+#line 1360 "src/asm/parser.y"
+ {
+ rpn_CheckNBit(&(yyvsp[0].expr), 8);
+ (yyval.expr) = (yyvsp[0].expr);
+ }
+#line 4390 "src/asm/parser.c"
+ break;
+
+ case 228: /* reloc_8bit_offset: "-" relocexpr */
+#line 1364 "src/asm/parser.y"
+ {
+ rpn_UNNEG(&(yyval.expr), &(yyvsp[0].expr));
+ rpn_CheckNBit(&(yyval.expr), 8);
+ }
+#line 4399 "src/asm/parser.c"
+ break;
+
+ case 229: /* reloc_16bit: relocexpr */
+#line 1370 "src/asm/parser.y"
+ {
+ rpn_CheckNBit(&(yyvsp[0].expr), 16);
+ (yyval.expr) = (yyvsp[0].expr);
+ }
+#line 4408 "src/asm/parser.c"
+ break;
+
+ case 230: /* reloc_16bit_no_str: relocexpr_no_str */
+#line 1376 "src/asm/parser.y"
+ {
+ rpn_CheckNBit(&(yyvsp[0].expr), 16);
+ (yyval.expr) = (yyvsp[0].expr);
+ }
+#line 4417 "src/asm/parser.c"
+ break;
+
+ case 232: /* relocexpr: string */
+#line 1384 "src/asm/parser.y"
+ {
+ // Charmaps cannot increase the length of a string
+ uint8_t *output = malloc(strlen((yyvsp[0].string)));
+ uint32_t length = charmap_Convert((yyvsp[0].string), output);
+ uint32_t r = str2int2(output, length);
+
+ free(output);
+ rpn_Number(&(yyval.expr), r);
+ }
+#line 4431 "src/asm/parser.c"
+ break;
+
+ case 233: /* relocexpr_no_str: scoped_anon_id */
+#line 1395 "src/asm/parser.y"
+ { rpn_Symbol(&(yyval.expr), (yyvsp[0].symName)); }
+#line 4437 "src/asm/parser.c"
+ break;
+
+ case 234: /* relocexpr_no_str: "number" */
+#line 1396 "src/asm/parser.y"
+ { rpn_Number(&(yyval.expr), (yyvsp[0].constValue)); }
+#line 4443 "src/asm/parser.c"
+ break;
+
+ case 235: /* relocexpr_no_str: "!" relocexpr */
+#line 1397 "src/asm/parser.y"
+ {
+ rpn_LOGNOT(&(yyval.expr), &(yyvsp[0].expr));
+ }
+#line 4451 "src/asm/parser.c"
+ break;
+
+ case 236: /* relocexpr_no_str: relocexpr "||" relocexpr */
+#line 1400 "src/asm/parser.y"
+ {
+ rpn_BinaryOp(RPN_LOGOR, &(yyval.expr), &(yyvsp[-2].expr), &(yyvsp[0].expr));
+ }
+#line 4459 "src/asm/parser.c"
+ break;
+
+ case 237: /* relocexpr_no_str: relocexpr "&&" relocexpr */
+#line 1403 "src/asm/parser.y"
+ {
+ rpn_BinaryOp(RPN_LOGAND, &(yyval.expr), &(yyvsp[-2].expr), &(yyvsp[0].expr));
+ }
+#line 4467 "src/asm/parser.c"
+ break;
+
+ case 238: /* relocexpr_no_str: relocexpr "==" relocexpr */
+#line 1406 "src/asm/parser.y"
+ {
+ rpn_BinaryOp(RPN_LOGEQ, &(yyval.expr), &(yyvsp[-2].expr), &(yyvsp[0].expr));
+ }
+#line 4475 "src/asm/parser.c"
+ break;
+
+ case 239: /* relocexpr_no_str: relocexpr ">" relocexpr */
+#line 1409 "src/asm/parser.y"
+ {
+ rpn_BinaryOp(RPN_LOGGT, &(yyval.expr), &(yyvsp[-2].expr), &(yyvsp[0].expr));
+ }
+#line 4483 "src/asm/parser.c"
+ break;
+
+ case 240: /* relocexpr_no_str: relocexpr "<" relocexpr */
+#line 1412 "src/asm/parser.y"
+ {
+ rpn_BinaryOp(RPN_LOGLT, &(yyval.expr), &(yyvsp[-2].expr), &(yyvsp[0].expr));
+ }
+#line 4491 "src/asm/parser.c"
+ break;
+
+ case 241: /* relocexpr_no_str: relocexpr ">=" relocexpr */
+#line 1415 "src/asm/parser.y"
+ {
+ rpn_BinaryOp(RPN_LOGGE, &(yyval.expr), &(yyvsp[-2].expr), &(yyvsp[0].expr));
+ }
+#line 4499 "src/asm/parser.c"
+ break;
+
+ case 242: /* relocexpr_no_str: relocexpr "<=" relocexpr */
+#line 1418 "src/asm/parser.y"
+ {
+ rpn_BinaryOp(RPN_LOGLE, &(yyval.expr), &(yyvsp[-2].expr), &(yyvsp[0].expr));
+ }
+#line 4507 "src/asm/parser.c"
+ break;
+
+ case 243: /* relocexpr_no_str: relocexpr "!=" relocexpr */
+#line 1421 "src/asm/parser.y"
+ {
+ rpn_BinaryOp(RPN_LOGNE, &(yyval.expr), &(yyvsp[-2].expr), &(yyvsp[0].expr));
+ }
+#line 4515 "src/asm/parser.c"
+ break;
+
+ case 244: /* relocexpr_no_str: relocexpr "+" relocexpr */
+#line 1424 "src/asm/parser.y"
+ {
+ rpn_BinaryOp(RPN_ADD, &(yyval.expr), &(yyvsp[-2].expr), &(yyvsp[0].expr));
+ }
+#line 4523 "src/asm/parser.c"
+ break;
+
+ case 245: /* relocexpr_no_str: relocexpr "-" relocexpr */
+#line 1427 "src/asm/parser.y"
+ {
+ rpn_BinaryOp(RPN_SUB, &(yyval.expr), &(yyvsp[-2].expr), &(yyvsp[0].expr));
+ }
+#line 4531 "src/asm/parser.c"
+ break;
+
+ case 246: /* relocexpr_no_str: relocexpr "^" relocexpr */
+#line 1430 "src/asm/parser.y"
+ {
+ rpn_BinaryOp(RPN_XOR, &(yyval.expr), &(yyvsp[-2].expr), &(yyvsp[0].expr));
+ }
+#line 4539 "src/asm/parser.c"
+ break;
+
+ case 247: /* relocexpr_no_str: relocexpr "|" relocexpr */
+#line 1433 "src/asm/parser.y"
+ {
+ rpn_BinaryOp(RPN_OR, &(yyval.expr), &(yyvsp[-2].expr), &(yyvsp[0].expr));
+ }
+#line 4547 "src/asm/parser.c"
+ break;
+
+ case 248: /* relocexpr_no_str: relocexpr "&" relocexpr */
+#line 1436 "src/asm/parser.y"
+ {
+ rpn_BinaryOp(RPN_AND, &(yyval.expr), &(yyvsp[-2].expr), &(yyvsp[0].expr));
+ }
+#line 4555 "src/asm/parser.c"
+ break;
+
+ case 249: /* relocexpr_no_str: relocexpr "<<" relocexpr */
+#line 1439 "src/asm/parser.y"
+ {
+ rpn_BinaryOp(RPN_SHL, &(yyval.expr), &(yyvsp[-2].expr), &(yyvsp[0].expr));
+ }
+#line 4563 "src/asm/parser.c"
+ break;
+
+ case 250: /* relocexpr_no_str: relocexpr ">>" relocexpr */
+#line 1442 "src/asm/parser.y"
+ {
+ rpn_BinaryOp(RPN_SHR, &(yyval.expr), &(yyvsp[-2].expr), &(yyvsp[0].expr));
+ }
+#line 4571 "src/asm/parser.c"
+ break;
+
+ case 251: /* relocexpr_no_str: relocexpr ">>>" relocexpr */
+#line 1445 "src/asm/parser.y"
+ {
+ rpn_BinaryOp(RPN_USHR, &(yyval.expr), &(yyvsp[-2].expr), &(yyvsp[0].expr));
+ }
+#line 4579 "src/asm/parser.c"
+ break;
+
+ case 252: /* relocexpr_no_str: relocexpr "*" relocexpr */
+#line 1448 "src/asm/parser.y"
+ {
+ rpn_BinaryOp(RPN_MUL, &(yyval.expr), &(yyvsp[-2].expr), &(yyvsp[0].expr));
+ }
+#line 4587 "src/asm/parser.c"
+ break;
+
+ case 253: /* relocexpr_no_str: relocexpr "/" relocexpr */
+#line 1451 "src/asm/parser.y"
+ {
+ rpn_BinaryOp(RPN_DIV, &(yyval.expr), &(yyvsp[-2].expr), &(yyvsp[0].expr));
+ }
+#line 4595 "src/asm/parser.c"
+ break;
+
+ case 254: /* relocexpr_no_str: relocexpr "%" relocexpr */
+#line 1454 "src/asm/parser.y"
+ {
+ rpn_BinaryOp(RPN_MOD, &(yyval.expr), &(yyvsp[-2].expr), &(yyvsp[0].expr));
+ }
+#line 4603 "src/asm/parser.c"
+ break;
+
+ case 255: /* relocexpr_no_str: relocexpr "**" relocexpr */
+#line 1457 "src/asm/parser.y"
+ {
+ rpn_BinaryOp(RPN_EXP, &(yyval.expr), &(yyvsp[-2].expr), &(yyvsp[0].expr));
+ }
+#line 4611 "src/asm/parser.c"
+ break;
+
+ case 256: /* relocexpr_no_str: "+" relocexpr */
+#line 1460 "src/asm/parser.y"
+ { (yyval.expr) = (yyvsp[0].expr); }
+#line 4617 "src/asm/parser.c"
+ break;
+
+ case 257: /* relocexpr_no_str: "-" relocexpr */
+#line 1461 "src/asm/parser.y"
+ { rpn_UNNEG(&(yyval.expr), &(yyvsp[0].expr)); }
+#line 4623 "src/asm/parser.c"
+ break;
+
+ case 258: /* relocexpr_no_str: "~" relocexpr */
+#line 1462 "src/asm/parser.y"
+ { rpn_UNNOT(&(yyval.expr), &(yyvsp[0].expr)); }
+#line 4629 "src/asm/parser.c"
+ break;
+
+ case 259: /* relocexpr_no_str: "HIGH" "(" relocexpr ")" */
+#line 1463 "src/asm/parser.y"
+ { rpn_HIGH(&(yyval.expr), &(yyvsp[-1].expr)); }
+#line 4635 "src/asm/parser.c"
+ break;
+
+ case 260: /* relocexpr_no_str: "LOW" "(" relocexpr ")" */
+#line 1464 "src/asm/parser.y"
+ { rpn_LOW(&(yyval.expr), &(yyvsp[-1].expr)); }
+#line 4641 "src/asm/parser.c"
+ break;
+
+ case 261: /* relocexpr_no_str: "ISCONST" "(" relocexpr ")" */
+#line 1465 "src/asm/parser.y"
+ { rpn_ISCONST(&(yyval.expr), &(yyvsp[-1].expr)); }
+#line 4647 "src/asm/parser.c"
+ break;
+
+ case 262: /* relocexpr_no_str: "BANK" "(" scoped_anon_id ")" */
+#line 1466 "src/asm/parser.y"
+ {
+ // '@' is also a T_ID; it is handled here
+ rpn_BankSymbol(&(yyval.expr), (yyvsp[-1].symName));
+ }
+#line 4656 "src/asm/parser.c"
+ break;
+
+ case 263: /* relocexpr_no_str: "BANK" "(" string ")" */
+#line 1470 "src/asm/parser.y"
+ { rpn_BankSection(&(yyval.expr), (yyvsp[-1].string)); }
+#line 4662 "src/asm/parser.c"
+ break;
+
+ case 264: /* relocexpr_no_str: "SIZEOF" "(" string ")" */
+#line 1471 "src/asm/parser.y"
+ { rpn_SizeOfSection(&(yyval.expr), (yyvsp[-1].string)); }
+#line 4668 "src/asm/parser.c"
+ break;
+
+ case 265: /* relocexpr_no_str: "STARTOF" "(" string ")" */
+#line 1472 "src/asm/parser.y"
+ { rpn_StartOfSection(&(yyval.expr), (yyvsp[-1].string)); }
+#line 4674 "src/asm/parser.c"
+ break;
+
+ case 266: /* $@16: %empty */
+#line 1473 "src/asm/parser.y"
+ {
+ lexer_ToggleStringExpansion(false);
+ }
+#line 4682 "src/asm/parser.c"
+ break;
+
+ case 267: /* relocexpr_no_str: "DEF" $@16 "(" scoped_anon_id ")" */
+#line 1475 "src/asm/parser.y"
+ {
+ rpn_Number(&(yyval.expr), sym_FindScopedValidSymbol((yyvsp[-1].symName)) != NULL);
+
+ lexer_ToggleStringExpansion(true);
+ }
+#line 4692 "src/asm/parser.c"
+ break;
+
+ case 268: /* relocexpr_no_str: "ROUND" "(" const opt_q_arg ")" */
+#line 1480 "src/asm/parser.y"
+ {
+ rpn_Number(&(yyval.expr), fix_Round((yyvsp[-2].constValue), (yyvsp[-1].constValue)));
+ }
+#line 4700 "src/asm/parser.c"
+ break;
+
+ case 269: /* relocexpr_no_str: "CEIL" "(" const opt_q_arg ")" */
+#line 1483 "src/asm/parser.y"
+ {
+ rpn_Number(&(yyval.expr), fix_Ceil((yyvsp[-2].constValue), (yyvsp[-1].constValue)));
+ }
+#line 4708 "src/asm/parser.c"
+ break;
+
+ case 270: /* relocexpr_no_str: "FLOOR" "(" const opt_q_arg ")" */
+#line 1486 "src/asm/parser.y"
+ {
+ rpn_Number(&(yyval.expr), fix_Floor((yyvsp[-2].constValue), (yyvsp[-1].constValue)));
+ }
+#line 4716 "src/asm/parser.c"
+ break;
+
+ case 271: /* relocexpr_no_str: "FDIV" "(" const "," const opt_q_arg ")" */
+#line 1489 "src/asm/parser.y"
+ {
+ rpn_Number(&(yyval.expr), fix_Div((yyvsp[-4].constValue), (yyvsp[-2].constValue), (yyvsp[-1].constValue)));
+ }
+#line 4724 "src/asm/parser.c"
+ break;
+
+ case 272: /* relocexpr_no_str: "FMUL" "(" const "," const opt_q_arg ")" */
+#line 1492 "src/asm/parser.y"
+ {
+ rpn_Number(&(yyval.expr), fix_Mul((yyvsp[-4].constValue), (yyvsp[-2].constValue), (yyvsp[-1].constValue)));
+ }
+#line 4732 "src/asm/parser.c"
+ break;
+
+ case 273: /* relocexpr_no_str: "FMOD" "(" const "," const opt_q_arg ")" */
+#line 1495 "src/asm/parser.y"
+ {
+ rpn_Number(&(yyval.expr), fix_Mod((yyvsp[-4].constValue), (yyvsp[-2].constValue), (yyvsp[-1].constValue)));
+ }
+#line 4740 "src/asm/parser.c"
+ break;
+
+ case 274: /* relocexpr_no_str: "POW" "(" const "," const opt_q_arg ")" */
+#line 1498 "src/asm/parser.y"
+ {
+ rpn_Number(&(yyval.expr), fix_Pow((yyvsp[-4].constValue), (yyvsp[-2].constValue), (yyvsp[-1].constValue)));
+ }
+#line 4748 "src/asm/parser.c"
+ break;
+
+ case 275: /* relocexpr_no_str: "LOG" "(" const "," const opt_q_arg ")" */
+#line 1501 "src/asm/parser.y"
+ {
+ rpn_Number(&(yyval.expr), fix_Log((yyvsp[-4].constValue), (yyvsp[-2].constValue), (yyvsp[-1].constValue)));
+ }
+#line 4756 "src/asm/parser.c"
+ break;
+
+ case 276: /* relocexpr_no_str: "SIN" "(" const opt_q_arg ")" */
+#line 1504 "src/asm/parser.y"
+ {
+ rpn_Number(&(yyval.expr), fix_Sin((yyvsp[-2].constValue), (yyvsp[-1].constValue)));
+ }
+#line 4764 "src/asm/parser.c"
+ break;
+
+ case 277: /* relocexpr_no_str: "COS" "(" const opt_q_arg ")" */
+#line 1507 "src/asm/parser.y"
+ {
+ rpn_Number(&(yyval.expr), fix_Cos((yyvsp[-2].constValue), (yyvsp[-1].constValue)));
+ }
+#line 4772 "src/asm/parser.c"
+ break;
+
+ case 278: /* relocexpr_no_str: "TAN" "(" const opt_q_arg ")" */
+#line 1510 "src/asm/parser.y"
+ {
+ rpn_Number(&(yyval.expr), fix_Tan((yyvsp[-2].constValue), (yyvsp[-1].constValue)));
+ }
+#line 4780 "src/asm/parser.c"
+ break;
+
+ case 279: /* relocexpr_no_str: "ASIN" "(" const opt_q_arg ")" */
+#line 1513 "src/asm/parser.y"
+ {
+ rpn_Number(&(yyval.expr), fix_ASin((yyvsp[-2].constValue), (yyvsp[-1].constValue)));
+ }
+#line 4788 "src/asm/parser.c"
+ break;
+
+ case 280: /* relocexpr_no_str: "ACOS" "(" const opt_q_arg ")" */
+#line 1516 "src/asm/parser.y"
+ {
+ rpn_Number(&(yyval.expr), fix_ACos((yyvsp[-2].constValue), (yyvsp[-1].constValue)));
+ }
+#line 4796 "src/asm/parser.c"
+ break;
+
+ case 281: /* relocexpr_no_str: "ATAN" "(" const opt_q_arg ")" */
+#line 1519 "src/asm/parser.y"
+ {
+ rpn_Number(&(yyval.expr), fix_ATan((yyvsp[-2].constValue), (yyvsp[-1].constValue)));
+ }
+#line 4804 "src/asm/parser.c"
+ break;
+
+ case 282: /* relocexpr_no_str: "ATAN2" "(" const "," const opt_q_arg ")" */
+#line 1522 "src/asm/parser.y"
+ {
+ rpn_Number(&(yyval.expr), fix_ATan2((yyvsp[-4].constValue), (yyvsp[-2].constValue), (yyvsp[-1].constValue)));
+ }
+#line 4812 "src/asm/parser.c"
+ break;
+
+ case 283: /* relocexpr_no_str: "STRCMP" "(" string "," string ")" */
+#line 1525 "src/asm/parser.y"
+ {
+ rpn_Number(&(yyval.expr), strcmp((yyvsp[-3].string), (yyvsp[-1].string)));
+ }
+#line 4820 "src/asm/parser.c"
+ break;
+
+ case 284: /* relocexpr_no_str: "STRIN" "(" string "," string ")" */
+#line 1528 "src/asm/parser.y"
+ {
+ char const *p = strstr((yyvsp[-3].string), (yyvsp[-1].string));
+
+ rpn_Number(&(yyval.expr), p ? p - (yyvsp[-3].string) + 1 : 0);
+ }
+#line 4830 "src/asm/parser.c"
+ break;
+
+ case 285: /* relocexpr_no_str: "STRRIN" "(" string "," string ")" */
+#line 1533 "src/asm/parser.y"
+ {
+ char const *p = strrstr((yyvsp[-3].string), (yyvsp[-1].string));
+
+ rpn_Number(&(yyval.expr), p ? p - (yyvsp[-3].string) + 1 : 0);
+ }
+#line 4840 "src/asm/parser.c"
+ break;
+
+ case 286: /* relocexpr_no_str: "STRLEN" "(" string ")" */
+#line 1538 "src/asm/parser.y"
+ {
+ rpn_Number(&(yyval.expr), strlenUTF8((yyvsp[-1].string)));
+ }
+#line 4848 "src/asm/parser.c"
+ break;
+
+ case 287: /* relocexpr_no_str: "CHARLEN" "(" string ")" */
+#line 1541 "src/asm/parser.y"
+ {
+ rpn_Number(&(yyval.expr), charlenUTF8((yyvsp[-1].string)));
+ }
+#line 4856 "src/asm/parser.c"
+ break;
+
+ case 288: /* relocexpr_no_str: "(" relocexpr ")" */
+#line 1544 "src/asm/parser.y"
+ { (yyval.expr) = (yyvsp[-1].expr); }
+#line 4862 "src/asm/parser.c"
+ break;
+
+ case 289: /* uconst: const */
+#line 1547 "src/asm/parser.y"
+ {
+ (yyval.constValue) = (yyvsp[0].constValue);
+ if ((yyval.constValue) < 0)
+ fatalerror("Constant must not be negative: %d\n", (yyvsp[0].constValue));
+ }
+#line 4872 "src/asm/parser.c"
+ break;
+
+ case 290: /* const: relocexpr */
+#line 1554 "src/asm/parser.y"
+ { (yyval.constValue) = rpn_GetConstVal(&(yyvsp[0].expr)); }
+#line 4878 "src/asm/parser.c"
+ break;
+
+ case 291: /* const_no_str: relocexpr_no_str */
+#line 1557 "src/asm/parser.y"
+ { (yyval.constValue) = rpn_GetConstVal(&(yyvsp[0].expr)); }
+#line 4884 "src/asm/parser.c"
+ break;
+
+ case 292: /* const_8bit: reloc_8bit */
+#line 1560 "src/asm/parser.y"
+ { (yyval.constValue) = rpn_GetConstVal(&(yyvsp[0].expr)); }
+#line 4890 "src/asm/parser.c"
+ break;
+
+ case 293: /* opt_q_arg: %empty */
+#line 1563 "src/asm/parser.y"
+ { (yyval.constValue) = fix_Precision(); }
+#line 4896 "src/asm/parser.c"
+ break;
+
+ case 294: /* opt_q_arg: "," const */
+#line 1564 "src/asm/parser.y"
+ {
+ if ((yyvsp[0].constValue) >= 1 && (yyvsp[0].constValue) <= 31) {
+ (yyval.constValue) = (yyvsp[0].constValue);
+ } else {
+ error("Fixed-point precision must be between 1 and 31\n");
+ (yyval.constValue) = fix_Precision();
+ }
+ }
+#line 4909 "src/asm/parser.c"
+ break;
+
+ case 296: /* string: "STRSUB" "(" string "," const "," uconst ")" */
+#line 1575 "src/asm/parser.y"
+ {
+ size_t len = strlenUTF8((yyvsp[-5].string));
+ uint32_t pos = adjustNegativePos((yyvsp[-3].constValue), len, "STRSUB");
+
+ strsubUTF8((yyval.string), sizeof((yyval.string)), (yyvsp[-5].string), pos, (yyvsp[-1].constValue));
+ }
+#line 4920 "src/asm/parser.c"
+ break;
+
+ case 297: /* string: "STRSUB" "(" string "," const ")" */
+#line 1581 "src/asm/parser.y"
+ {
+ size_t len = strlenUTF8((yyvsp[-3].string));
+ uint32_t pos = adjustNegativePos((yyvsp[-1].constValue), len, "STRSUB");
+
+ strsubUTF8((yyval.string), sizeof((yyval.string)), (yyvsp[-3].string), pos, pos > len ? 0 : len + 1 - pos);
+ }
+#line 4931 "src/asm/parser.c"
+ break;
+
+ case 298: /* string: "CHARSUB" "(" string "," const ")" */
+#line 1587 "src/asm/parser.y"
+ {
+ size_t len = charlenUTF8((yyvsp[-3].string));
+ uint32_t pos = adjustNegativePos((yyvsp[-1].constValue), len, "CHARSUB");
+
+ charsubUTF8((yyval.string), (yyvsp[-3].string), pos);
+ }
+#line 4942 "src/asm/parser.c"
+ break;
+
+ case 299: /* string: "STRCAT" "(" ")" */
+#line 1593 "src/asm/parser.y"
+ {
+ (yyval.string)[0] = '\0';
+ }
+#line 4950 "src/asm/parser.c"
+ break;
+
+ case 300: /* string: "STRCAT" "(" strcat_args ")" */
+#line 1596 "src/asm/parser.y"
+ {
+ strcpy((yyval.string), (yyvsp[-1].string));
+ }
+#line 4958 "src/asm/parser.c"
+ break;
+
+ case 301: /* string: "STRUPR" "(" string ")" */
+#line 1599 "src/asm/parser.y"
+ {
+ upperstring((yyval.string), (yyvsp[-1].string));
+ }
+#line 4966 "src/asm/parser.c"
+ break;
+
+ case 302: /* string: "STRLWR" "(" string ")" */
+#line 1602 "src/asm/parser.y"
+ {
+ lowerstring((yyval.string), (yyvsp[-1].string));
+ }
+#line 4974 "src/asm/parser.c"
+ break;
+
+ case 303: /* string: "STRRPL" "(" string "," string "," string ")" */
+#line 1605 "src/asm/parser.y"
+ {
+ strrpl((yyval.string), sizeof((yyval.string)), (yyvsp[-5].string), (yyvsp[-3].string), (yyvsp[-1].string));
+ }
+#line 4982 "src/asm/parser.c"
+ break;
+
+ case 304: /* string: "STRFMT" "(" strfmt_args ")" */
+#line 1608 "src/asm/parser.y"
+ {
+ strfmt((yyval.string), sizeof((yyval.string)), (yyvsp[-1].strfmtArgs).format, (yyvsp[-1].strfmtArgs).nbArgs, (yyvsp[-1].strfmtArgs).args);
+ freeStrFmtArgList(&(yyvsp[-1].strfmtArgs));
+ }
+#line 4991 "src/asm/parser.c"
+ break;
+
+ case 305: /* string: "SECTION" "(" scoped_anon_id ")" */
+#line 1612 "src/asm/parser.y"
+ {
+ struct Symbol *sym = sym_FindScopedValidSymbol((yyvsp[-1].symName));
+
+ if (!sym)
+ fatalerror("Unknown symbol \"%s\"\n", (yyvsp[-1].symName));
+ struct Section const *section = sym_GetSection(sym);
+
+ if (!section)
+ fatalerror("\"%s\" does not belong to any section\n", sym->name);
+ // Section names are capped by rgbasm's maximum string length,
+ // so this currently can't overflow.
+ strcpy((yyval.string), section->name);
+ }
+#line 5009 "src/asm/parser.c"
+ break;
+
+ case 307: /* strcat_args: strcat_args "," string */
+#line 1628 "src/asm/parser.y"
+ {
+ int ret = snprintf((yyval.string), sizeof((yyval.string)), "%s%s", (yyvsp[-2].string), (yyvsp[0].string));
+
+ if (ret == -1)
+ fatalerror("snprintf error in STRCAT: %s\n", strerror(errno));
+ else if ((unsigned int)ret >= sizeof((yyval.string)))
+ warning(WARNING_LONG_STR, "STRCAT: String too long '%s%s'\n",
+ (yyvsp[-2].string), (yyvsp[0].string));
+ }
+#line 5023 "src/asm/parser.c"
+ break;
+
+ case 308: /* strfmt_args: string strfmt_va_args */
+#line 1639 "src/asm/parser.y"
+ {
+ (yyval.strfmtArgs).format = strdup((yyvsp[-1].string));
+ (yyval.strfmtArgs).capacity = (yyvsp[0].strfmtArgs).capacity;
+ (yyval.strfmtArgs).nbArgs = (yyvsp[0].strfmtArgs).nbArgs;
+ (yyval.strfmtArgs).args = (yyvsp[0].strfmtArgs).args;
+ }
+#line 5034 "src/asm/parser.c"
+ break;
+
+ case 309: /* strfmt_va_args: %empty */
+#line 1647 "src/asm/parser.y"
+ {
+ initStrFmtArgList(&(yyval.strfmtArgs));
+ }
+#line 5042 "src/asm/parser.c"
+ break;
+
+ case 310: /* strfmt_va_args: strfmt_va_args "," const_no_str */
+#line 1650 "src/asm/parser.y"
+ {
+ size_t i = nextStrFmtArgListIndex(&(yyvsp[-2].strfmtArgs));
+
+ (yyvsp[-2].strfmtArgs).args[i].number = (yyvsp[0].constValue);
+ (yyvsp[-2].strfmtArgs).args[i].isNumeric = true;
+ (yyval.strfmtArgs) = (yyvsp[-2].strfmtArgs);
+ }
+#line 5054 "src/asm/parser.c"
+ break;
+
+ case 311: /* strfmt_va_args: strfmt_va_args "," string */
+#line 1657 "src/asm/parser.y"
+ {
+ size_t i = nextStrFmtArgListIndex(&(yyvsp[-2].strfmtArgs));
+
+ (yyvsp[-2].strfmtArgs).args[i].string = strdup((yyvsp[0].string));
+ (yyvsp[-2].strfmtArgs).args[i].isNumeric = false;
+ (yyval.strfmtArgs) = (yyvsp[-2].strfmtArgs);
+ }
+#line 5066 "src/asm/parser.c"
+ break;
+
+ case 312: /* section: "SECTION" sectmod string "," sectiontype sectorg sectattrs */
+#line 1666 "src/asm/parser.y"
+ {
+ sect_NewSection((yyvsp[-4].string), (yyvsp[-2].constValue), (yyvsp[-1].constValue), &(yyvsp[0].sectSpec), (yyvsp[-5].sectMod));
+ }
+#line 5074 "src/asm/parser.c"
+ break;
+
+ case 313: /* sectmod: %empty */
+#line 1671 "src/asm/parser.y"
+ { (yyval.sectMod) = SECTION_NORMAL; }
+#line 5080 "src/asm/parser.c"
+ break;
+
+ case 314: /* sectmod: "UNION" */
+#line 1672 "src/asm/parser.y"
+ { (yyval.sectMod) = SECTION_UNION; }
+#line 5086 "src/asm/parser.c"
+ break;
+
+ case 315: /* sectmod: "FRAGMENT" */
+#line 1673 "src/asm/parser.y"
+ { (yyval.sectMod) = SECTION_FRAGMENT; }
+#line 5092 "src/asm/parser.c"
+ break;
+
+ case 316: /* sectiontype: "WRAM0" */
+#line 1676 "src/asm/parser.y"
+ { (yyval.constValue) = SECTTYPE_WRAM0; }
+#line 5098 "src/asm/parser.c"
+ break;
+
+ case 317: /* sectiontype: "VRAM" */
+#line 1677 "src/asm/parser.y"
+ { (yyval.constValue) = SECTTYPE_VRAM; }
+#line 5104 "src/asm/parser.c"
+ break;
+
+ case 318: /* sectiontype: "ROMX" */
+#line 1678 "src/asm/parser.y"
+ { (yyval.constValue) = SECTTYPE_ROMX; }
+#line 5110 "src/asm/parser.c"
+ break;
+
+ case 319: /* sectiontype: "ROM0" */
+#line 1679 "src/asm/parser.y"
+ { (yyval.constValue) = SECTTYPE_ROM0; }
+#line 5116 "src/asm/parser.c"
+ break;
+
+ case 320: /* sectiontype: "HRAM" */
+#line 1680 "src/asm/parser.y"
+ { (yyval.constValue) = SECTTYPE_HRAM; }
+#line 5122 "src/asm/parser.c"
+ break;
+
+ case 321: /* sectiontype: "WRAMX" */
+#line 1681 "src/asm/parser.y"
+ { (yyval.constValue) = SECTTYPE_WRAMX; }
+#line 5128 "src/asm/parser.c"
+ break;
+
+ case 322: /* sectiontype: "SRAM" */
+#line 1682 "src/asm/parser.y"
+ { (yyval.constValue) = SECTTYPE_SRAM; }
+#line 5134 "src/asm/parser.c"
+ break;
+
+ case 323: /* sectiontype: "OAM" */
+#line 1683 "src/asm/parser.y"
+ { (yyval.constValue) = SECTTYPE_OAM; }
+#line 5140 "src/asm/parser.c"
+ break;
+
+ case 324: /* sectorg: %empty */
+#line 1686 "src/asm/parser.y"
+ { (yyval.constValue) = -1; }
+#line 5146 "src/asm/parser.c"
+ break;
+
+ case 325: /* sectorg: "[" uconst "]" */
+#line 1687 "src/asm/parser.y"
+ {
+ if ((yyvsp[-1].constValue) < 0 || (yyvsp[-1].constValue) >= 0x10000) {
+ error("Address $%x is not 16-bit\n", (yyvsp[-1].constValue));
+ (yyval.constValue) = -1;
+ } else {
+ (yyval.constValue) = (yyvsp[-1].constValue);
+ }
+ }
+#line 5159 "src/asm/parser.c"
+ break;
+
+ case 326: /* sectattrs: %empty */
+#line 1697 "src/asm/parser.y"
+ {
+ (yyval.sectSpec).alignment = 0;
+ (yyval.sectSpec).alignOfs = 0;
+ (yyval.sectSpec).bank = -1;
+ }
+#line 5169 "src/asm/parser.c"
+ break;
+
+ case 327: /* sectattrs: sectattrs "," "ALIGN" "[" uconst "]" */
+#line 1702 "src/asm/parser.y"
+ {
+ (yyval.sectSpec).alignment = (yyvsp[-1].constValue);
+ }
+#line 5177 "src/asm/parser.c"
+ break;
+
+ case 328: /* sectattrs: sectattrs "," "ALIGN" "[" uconst "," uconst "]" */
+#line 1705 "src/asm/parser.y"
+ {
+ (yyval.sectSpec).alignment = (yyvsp[-3].constValue);
+ (yyval.sectSpec).alignOfs = (yyvsp[-1].constValue);
+ }
+#line 5186 "src/asm/parser.c"
+ break;
+
+ case 329: /* sectattrs: sectattrs "," "BANK" "[" uconst "]" */
+#line 1709 "src/asm/parser.y"
+ {
+ // We cannot check the validity of this now
+ (yyval.sectSpec).bank = (yyvsp[-1].constValue);
+ }
+#line 5195 "src/asm/parser.c"
+ break;
+
+ case 376: /* z80_adc: "adc" op_a_n */
+#line 1764 "src/asm/parser.y"
+ {
+ sect_AbsByte(0xCE);
+ sect_RelByte(&(yyvsp[0].expr), 1);
+ }
+#line 5204 "src/asm/parser.c"
+ break;
+
+ case 377: /* z80_adc: "adc" op_a_r */
+#line 1768 "src/asm/parser.y"
+ { sect_AbsByte(0x88 | (yyvsp[0].constValue)); }
+#line 5210 "src/asm/parser.c"
+ break;
+
+ case 378: /* z80_add: "add" op_a_n */
+#line 1771 "src/asm/parser.y"
+ {
+ sect_AbsByte(0xC6);
+ sect_RelByte(&(yyvsp[0].expr), 1);
+ }
+#line 5219 "src/asm/parser.c"
+ break;
+
+ case 379: /* z80_add: "add" op_a_r */
+#line 1775 "src/asm/parser.y"
+ { sect_AbsByte(0x80 | (yyvsp[0].constValue)); }
+#line 5225 "src/asm/parser.c"
+ break;
+
+ case 380: /* z80_add: "add" "hl" "," reg_ss */
+#line 1776 "src/asm/parser.y"
+ { sect_AbsByte(0x09 | ((yyvsp[0].constValue) << 4)); }
+#line 5231 "src/asm/parser.c"
+ break;
+
+ case 381: /* z80_add: "add" "sp" "," reloc_8bit */
+#line 1777 "src/asm/parser.y"
+ {
+ sect_AbsByte(0xE8);
+ sect_RelByte(&(yyvsp[0].expr), 1);
+ }
+#line 5240 "src/asm/parser.c"
+ break;
+
+ case 382: /* z80_and: "and" op_a_n */
+#line 1784 "src/asm/parser.y"
+ {
+ sect_AbsByte(0xE6);
+ sect_RelByte(&(yyvsp[0].expr), 1);
+ }
+#line 5249 "src/asm/parser.c"
+ break;
+
+ case 383: /* z80_and: "and" op_a_r */
+#line 1788 "src/asm/parser.y"
+ { sect_AbsByte(0xA0 | (yyvsp[0].constValue)); }
+#line 5255 "src/asm/parser.c"
+ break;
+
+ case 384: /* z80_bit: "bit" const_3bit "," reg_r */
+#line 1791 "src/asm/parser.y"
+ {
+ sect_AbsByte(0xCB);
+ sect_AbsByte(0x40 | ((yyvsp[-2].constValue) << 3) | (yyvsp[0].constValue));
+ }
+#line 5264 "src/asm/parser.c"
+ break;
+
+ case 385: /* z80_call: "call" reloc_16bit */
+#line 1797 "src/asm/parser.y"
+ {
+ sect_AbsByte(0xCD);
+ sect_RelWord(&(yyvsp[0].expr), 1);
+ }
+#line 5273 "src/asm/parser.c"
+ break;
+
+ case 386: /* z80_call: "call" ccode_expr "," reloc_16bit */
+#line 1801 "src/asm/parser.y"
+ {
+ sect_AbsByte(0xC4 | ((yyvsp[-2].constValue) << 3));
+ sect_RelWord(&(yyvsp[0].expr), 1);
+ }
+#line 5282 "src/asm/parser.c"
+ break;
+
+ case 387: /* z80_ccf: "ccf" */
+#line 1807 "src/asm/parser.y"
+ { sect_AbsByte(0x3F); }
+#line 5288 "src/asm/parser.c"
+ break;
+
+ case 388: /* z80_cp: "cp" op_a_n */
+#line 1810 "src/asm/parser.y"
+ {
+ sect_AbsByte(0xFE);
+ sect_RelByte(&(yyvsp[0].expr), 1);
+ }
+#line 5297 "src/asm/parser.c"
+ break;
+
+ case 389: /* z80_cp: "cp" op_a_r */
+#line 1814 "src/asm/parser.y"
+ { sect_AbsByte(0xB8 | (yyvsp[0].constValue)); }
+#line 5303 "src/asm/parser.c"
+ break;
+
+ case 390: /* z80_cpl: "cpl" */
+#line 1817 "src/asm/parser.y"
+ { sect_AbsByte(0x2F); }
+#line 5309 "src/asm/parser.c"
+ break;
+
+ case 391: /* z80_daa: "daa" */
+#line 1820 "src/asm/parser.y"
+ { sect_AbsByte(0x27); }
+#line 5315 "src/asm/parser.c"
+ break;
+
+ case 392: /* z80_dec: "dec" reg_r */
+#line 1823 "src/asm/parser.y"
+ { sect_AbsByte(0x05 | ((yyvsp[0].constValue) << 3)); }
+#line 5321 "src/asm/parser.c"
+ break;
+
+ case 393: /* z80_dec: "dec" reg_ss */
+#line 1824 "src/asm/parser.y"
+ { sect_AbsByte(0x0B | ((yyvsp[0].constValue) << 4)); }
+#line 5327 "src/asm/parser.c"
+ break;
+
+ case 394: /* z80_di: "di" */
+#line 1827 "src/asm/parser.y"
+ { sect_AbsByte(0xF3); }
+#line 5333 "src/asm/parser.c"
+ break;
+
+ case 395: /* z80_ei: "ei" */
+#line 1830 "src/asm/parser.y"
+ { sect_AbsByte(0xFB); }
+#line 5339 "src/asm/parser.c"
+ break;
+
+ case 396: /* z80_halt: "halt" */
+#line 1833 "src/asm/parser.y"
+ {
+ sect_AbsByte(0x76);
+ if (haltnop) {
+ if (warnOnHaltNop) {
+ warnOnHaltNop = false;
+ warning(WARNING_OBSOLETE, "`nop` after `halt` will stop being the default; pass `-H` to opt into it\n");
+ }
+ sect_AbsByte(0x00);
+ }
+ }
+#line 5354 "src/asm/parser.c"
+ break;
+
+ case 397: /* z80_inc: "inc" reg_r */
+#line 1845 "src/asm/parser.y"
+ { sect_AbsByte(0x04 | ((yyvsp[0].constValue) << 3)); }
+#line 5360 "src/asm/parser.c"
+ break;
+
+ case 398: /* z80_inc: "inc" reg_ss */
+#line 1846 "src/asm/parser.y"
+ { sect_AbsByte(0x03 | ((yyvsp[0].constValue) << 4)); }
+#line 5366 "src/asm/parser.c"
+ break;
+
+ case 399: /* z80_jp: "jp" reloc_16bit */
+#line 1849 "src/asm/parser.y"
+ {
+ sect_AbsByte(0xC3);
+ sect_RelWord(&(yyvsp[0].expr), 1);
+ }
+#line 5375 "src/asm/parser.c"
+ break;
+
+ case 400: /* z80_jp: "jp" ccode_expr "," reloc_16bit */
+#line 1853 "src/asm/parser.y"
+ {
+ sect_AbsByte(0xC2 | ((yyvsp[-2].constValue) << 3));
+ sect_RelWord(&(yyvsp[0].expr), 1);
+ }
+#line 5384 "src/asm/parser.c"
+ break;
+
+ case 401: /* z80_jp: "jp" "hl" */
+#line 1857 "src/asm/parser.y"
+ {
+ sect_AbsByte(0xE9);
+ }
+#line 5392 "src/asm/parser.c"
+ break;
+
+ case 402: /* z80_jr: "jr" reloc_16bit */
+#line 1862 "src/asm/parser.y"
+ {
+ sect_AbsByte(0x18);
+ sect_PCRelByte(&(yyvsp[0].expr), 1);
+ }
+#line 5401 "src/asm/parser.c"
+ break;
+
+ case 403: /* z80_jr: "jr" ccode_expr "," reloc_16bit */
+#line 1866 "src/asm/parser.y"
+ {
+ sect_AbsByte(0x20 | ((yyvsp[-2].constValue) << 3));
+ sect_PCRelByte(&(yyvsp[0].expr), 1);
+ }
+#line 5410 "src/asm/parser.c"
+ break;
+
+ case 404: /* z80_ldi: "ldi" "[" "hl" "]" "," T_MODE_A */
+#line 1872 "src/asm/parser.y"
+ {
+ sect_AbsByte(0x02 | (2 << 4));
+ }
+#line 5418 "src/asm/parser.c"
+ break;
+
+ case 405: /* z80_ldi: "ldi" T_MODE_A "," "[" "hl" "]" */
+#line 1875 "src/asm/parser.y"
+ {
+ sect_AbsByte(0x0A | (2 << 4));
+ }
+#line 5426 "src/asm/parser.c"
+ break;
+
+ case 406: /* z80_ldd: "ldd" "[" "hl" "]" "," T_MODE_A */
+#line 1880 "src/asm/parser.y"
+ {
+ sect_AbsByte(0x02 | (3 << 4));
+ }
+#line 5434 "src/asm/parser.c"
+ break;
+
+ case 407: /* z80_ldd: "ldd" T_MODE_A "," "[" "hl" "]" */
+#line 1883 "src/asm/parser.y"
+ {
+ sect_AbsByte(0x0A | (3 << 4));
+ }
+#line 5442 "src/asm/parser.c"
+ break;
+
+ case 408: /* z80_ldio: "ldh" T_MODE_A "," op_mem_ind */
+#line 1888 "src/asm/parser.y"
+ {
+ rpn_CheckHRAM(&(yyvsp[0].expr), &(yyvsp[0].expr));
+
+ sect_AbsByte(0xF0);
+ sect_RelByte(&(yyvsp[0].expr), 1);
+ }
+#line 5453 "src/asm/parser.c"
+ break;
+
+ case 409: /* z80_ldio: "ldh" op_mem_ind "," T_MODE_A */
+#line 1894 "src/asm/parser.y"
+ {
+ rpn_CheckHRAM(&(yyvsp[-2].expr), &(yyvsp[-2].expr));
+
+ sect_AbsByte(0xE0);
+ sect_RelByte(&(yyvsp[-2].expr), 1);
+ }
+#line 5464 "src/asm/parser.c"
+ break;
+
+ case 410: /* z80_ldio: "ldh" T_MODE_A "," c_ind */
+#line 1900 "src/asm/parser.y"
+ {
+ sect_AbsByte(0xF2);
+ }
+#line 5472 "src/asm/parser.c"
+ break;
+
+ case 411: /* z80_ldio: "ldh" c_ind "," T_MODE_A */
+#line 1903 "src/asm/parser.y"
+ {
+ sect_AbsByte(0xE2);
+ }
+#line 5480 "src/asm/parser.c"
+ break;
+
+ case 413: /* c_ind: "[" relocexpr "+" T_MODE_C "]" */
+#line 1909 "src/asm/parser.y"
+ {
+ if (!rpn_isKnown(&(yyvsp[-3].expr)) || (yyvsp[-3].expr).val != 0xff00)
+ error("Expected constant expression equal to $FF00 for \"$ff00+c\"\n");
+ }
+#line 5489 "src/asm/parser.c"
+ break;
+
+ case 422: /* z80_ld_hl: "ld" "hl" "," "sp" reloc_8bit_offset */
+#line 1925 "src/asm/parser.y"
+ {
+ sect_AbsByte(0xF8);
+ sect_RelByte(&(yyvsp[0].expr), 1);
+ }
+#line 5498 "src/asm/parser.c"
+ break;
+
+ case 423: /* z80_ld_hl: "ld" "hl" "," reloc_16bit */
+#line 1929 "src/asm/parser.y"
+ {
+ sect_AbsByte(0x01 | (REG_HL << 4));
+ sect_RelWord(&(yyvsp[0].expr), 1);
+ }
+#line 5507 "src/asm/parser.c"
+ break;
+
+ case 424: /* z80_ld_sp: "ld" "sp" "," "hl" */
+#line 1935 "src/asm/parser.y"
+ { sect_AbsByte(0xF9); }
+#line 5513 "src/asm/parser.c"
+ break;
+
+ case 425: /* z80_ld_sp: "ld" "sp" "," reloc_16bit */
+#line 1936 "src/asm/parser.y"
+ {
+ sect_AbsByte(0x01 | (REG_SP << 4));
+ sect_RelWord(&(yyvsp[0].expr), 1);
+ }
+#line 5522 "src/asm/parser.c"
+ break;
+
+ case 426: /* z80_ld_mem: "ld" op_mem_ind "," "sp" */
+#line 1942 "src/asm/parser.y"
+ {
+ sect_AbsByte(0x08);
+ sect_RelWord(&(yyvsp[-2].expr), 1);
+ }
+#line 5531 "src/asm/parser.c"
+ break;
+
+ case 427: /* z80_ld_mem: "ld" op_mem_ind "," T_MODE_A */
+#line 1946 "src/asm/parser.y"
+ {
+ if (optimizeLoads && rpn_isKnown(&(yyvsp[-2].expr))
+ && (yyvsp[-2].expr).val >= 0xFF00) {
+ if (warnOnLdOpt) {
+ warnOnLdOpt = false;
+ warning(WARNING_OBSOLETE, "ld optimization will stop being the default; pass `-l` to opt into it\n");
+ }
+ sect_AbsByte(0xE0);
+ sect_AbsByte((yyvsp[-2].expr).val & 0xFF);
+ rpn_Free(&(yyvsp[-2].expr));
+ } else {
+ sect_AbsByte(0xEA);
+ sect_RelWord(&(yyvsp[-2].expr), 1);
+ }
+ }
+#line 5551 "src/asm/parser.c"
+ break;
+
+ case 428: /* z80_ld_cind: "ld" c_ind "," T_MODE_A */
+#line 1963 "src/asm/parser.y"
+ {
+ sect_AbsByte(0xE2);
+ }
+#line 5559 "src/asm/parser.c"
+ break;
+
+ case 429: /* z80_ld_rr: "ld" reg_rr "," T_MODE_A */
+#line 1968 "src/asm/parser.y"
+ {
+ sect_AbsByte(0x02 | ((yyvsp[-2].constValue) << 4));
+ }
+#line 5567 "src/asm/parser.c"
+ break;
+
+ case 430: /* z80_ld_r: "ld" reg_r "," reloc_8bit */
+#line 1973 "src/asm/parser.y"
+ {
+ sect_AbsByte(0x06 | ((yyvsp[-2].constValue) << 3));
+ sect_RelByte(&(yyvsp[0].expr), 1);
+ }
+#line 5576 "src/asm/parser.c"
+ break;
+
+ case 431: /* z80_ld_r: "ld" reg_r "," reg_r */
+#line 1977 "src/asm/parser.y"
+ {
+ if (((yyvsp[-2].constValue) == REG_HL_IND) && ((yyvsp[0].constValue) == REG_HL_IND))
+ error("LD [HL],[HL] not a valid instruction\n");
+ else
+ sect_AbsByte(0x40 | ((yyvsp[-2].constValue) << 3) | (yyvsp[0].constValue));
+ }
+#line 5587 "src/asm/parser.c"
+ break;
+
+ case 432: /* z80_ld_a: "ld" reg_r "," c_ind */
+#line 1985 "src/asm/parser.y"
+ {
+ if ((yyvsp[-2].constValue) == REG_A)
+ sect_AbsByte(0xF2);
+ else
+ error("Destination operand must be A\n");
+ }
+#line 5598 "src/asm/parser.c"
+ break;
+
+ case 433: /* z80_ld_a: "ld" reg_r "," reg_rr */
+#line 1991 "src/asm/parser.y"
+ {
+ if ((yyvsp[-2].constValue) == REG_A)
+ sect_AbsByte(0x0A | ((yyvsp[0].constValue) << 4));
+ else
+ error("Destination operand must be A\n");
+ }
+#line 5609 "src/asm/parser.c"
+ break;
+
+ case 434: /* z80_ld_a: "ld" reg_r "," op_mem_ind */
+#line 1997 "src/asm/parser.y"
+ {
+ if ((yyvsp[-2].constValue) == REG_A) {
+ if (optimizeLoads && rpn_isKnown(&(yyvsp[0].expr))
+ && (yyvsp[0].expr).val >= 0xFF00) {
+ if (warnOnLdOpt) {
+ warnOnLdOpt = false;
+ warning(WARNING_OBSOLETE, "ld optimization will stop being the default; pass `-l` to opt into it\n");
+ }
+ sect_AbsByte(0xF0);
+ sect_AbsByte((yyvsp[0].expr).val & 0xFF);
+ rpn_Free(&(yyvsp[0].expr));
+ } else {
+ sect_AbsByte(0xFA);
+ sect_RelWord(&(yyvsp[0].expr), 1);
+ }
+ } else {
+ error("Destination operand must be A\n");
+ rpn_Free(&(yyvsp[0].expr));
+ }
+ }
+#line 5634 "src/asm/parser.c"
+ break;
+
+ case 435: /* z80_ld_ss: "ld" "bc" "," reloc_16bit */
+#line 2019 "src/asm/parser.y"
+ {
+ sect_AbsByte(0x01 | (REG_BC << 4));
+ sect_RelWord(&(yyvsp[0].expr), 1);
+ }
+#line 5643 "src/asm/parser.c"
+ break;
+
+ case 436: /* z80_ld_ss: "ld" "de" "," reloc_16bit */
+#line 2023 "src/asm/parser.y"
+ {
+ sect_AbsByte(0x01 | (REG_DE << 4));
+ sect_RelWord(&(yyvsp[0].expr), 1);
+ }
+#line 5652 "src/asm/parser.c"
+ break;
+
+ case 437: /* z80_nop: "nop" */
+#line 2031 "src/asm/parser.y"
+ { sect_AbsByte(0x00); }
+#line 5658 "src/asm/parser.c"
+ break;
+
+ case 438: /* z80_or: "or" op_a_n */
+#line 2034 "src/asm/parser.y"
+ {
+ sect_AbsByte(0xF6);
+ sect_RelByte(&(yyvsp[0].expr), 1);
+ }
+#line 5667 "src/asm/parser.c"
+ break;
+
+ case 439: /* z80_or: "or" op_a_r */
+#line 2038 "src/asm/parser.y"
+ { sect_AbsByte(0xB0 | (yyvsp[0].constValue)); }
+#line 5673 "src/asm/parser.c"
+ break;
+
+ case 440: /* z80_pop: "pop" reg_tt */
+#line 2041 "src/asm/parser.y"
+ { sect_AbsByte(0xC1 | ((yyvsp[0].constValue) << 4)); }
+#line 5679 "src/asm/parser.c"
+ break;
+
+ case 441: /* z80_push: "push" reg_tt */
+#line 2044 "src/asm/parser.y"
+ { sect_AbsByte(0xC5 | ((yyvsp[0].constValue) << 4)); }
+#line 5685 "src/asm/parser.c"
+ break;
+
+ case 442: /* z80_res: "res" const_3bit "," reg_r */
+#line 2047 "src/asm/parser.y"
+ {
+ sect_AbsByte(0xCB);
+ sect_AbsByte(0x80 | ((yyvsp[-2].constValue) << 3) | (yyvsp[0].constValue));
+ }
+#line 5694 "src/asm/parser.c"
+ break;
+
+ case 443: /* z80_ret: "ret" */
+#line 2053 "src/asm/parser.y"
+ { sect_AbsByte(0xC9); }
+#line 5700 "src/asm/parser.c"
+ break;
+
+ case 444: /* z80_ret: "ret" ccode_expr */
+#line 2054 "src/asm/parser.y"
+ { sect_AbsByte(0xC0 | ((yyvsp[0].constValue) << 3)); }
+#line 5706 "src/asm/parser.c"
+ break;
+
+ case 445: /* z80_reti: "reti" */
+#line 2057 "src/asm/parser.y"
+ { sect_AbsByte(0xD9); }
+#line 5712 "src/asm/parser.c"
+ break;
+
+ case 446: /* z80_rl: "rl" reg_r */
+#line 2060 "src/asm/parser.y"
+ {
+ sect_AbsByte(0xCB);
+ sect_AbsByte(0x10 | (yyvsp[0].constValue));
+ }
+#line 5721 "src/asm/parser.c"
+ break;
+
+ case 447: /* z80_rla: "rla" */
+#line 2066 "src/asm/parser.y"
+ { sect_AbsByte(0x17); }
+#line 5727 "src/asm/parser.c"
+ break;
+
+ case 448: /* z80_rlc: "rlc" reg_r */
+#line 2069 "src/asm/parser.y"
+ {
+ sect_AbsByte(0xCB);
+ sect_AbsByte(0x00 | (yyvsp[0].constValue));
+ }
+#line 5736 "src/asm/parser.c"
+ break;
+
+ case 449: /* z80_rlca: "rlca" */
+#line 2075 "src/asm/parser.y"
+ { sect_AbsByte(0x07); }
+#line 5742 "src/asm/parser.c"
+ break;
+
+ case 450: /* z80_rr: "rr" reg_r */
+#line 2078 "src/asm/parser.y"
+ {
+ sect_AbsByte(0xCB);
+ sect_AbsByte(0x18 | (yyvsp[0].constValue));
+ }
+#line 5751 "src/asm/parser.c"
+ break;
+
+ case 451: /* z80_rra: "rra" */
+#line 2084 "src/asm/parser.y"
+ { sect_AbsByte(0x1F); }
+#line 5757 "src/asm/parser.c"
+ break;
+
+ case 452: /* z80_rrc: "rrc" reg_r */
+#line 2087 "src/asm/parser.y"
+ {
+ sect_AbsByte(0xCB);
+ sect_AbsByte(0x08 | (yyvsp[0].constValue));
+ }
+#line 5766 "src/asm/parser.c"
+ break;
+
+ case 453: /* z80_rrca: "rrca" */
+#line 2093 "src/asm/parser.y"
+ { sect_AbsByte(0x0F); }
+#line 5772 "src/asm/parser.c"
+ break;
+
+ case 454: /* z80_rst: "rst" reloc_8bit */
+#line 2096 "src/asm/parser.y"
+ {
+ rpn_CheckRST(&(yyvsp[0].expr), &(yyvsp[0].expr));
+ if (!rpn_isKnown(&(yyvsp[0].expr)))
+ sect_RelByte(&(yyvsp[0].expr), 0);
+ else
+ sect_AbsByte(0xC7 | (yyvsp[0].expr).val);
+ rpn_Free(&(yyvsp[0].expr));
+ }
+#line 5785 "src/asm/parser.c"
+ break;
+
+ case 455: /* z80_sbc: "sbc" op_a_n */
+#line 2106 "src/asm/parser.y"
+ {
+ sect_AbsByte(0xDE);
+ sect_RelByte(&(yyvsp[0].expr), 1);
+ }
+#line 5794 "src/asm/parser.c"
+ break;
+
+ case 456: /* z80_sbc: "sbc" op_a_r */
+#line 2110 "src/asm/parser.y"
+ { sect_AbsByte(0x98 | (yyvsp[0].constValue)); }
+#line 5800 "src/asm/parser.c"
+ break;
+
+ case 457: /* z80_scf: "scf" */
+#line 2113 "src/asm/parser.y"
+ { sect_AbsByte(0x37); }
+#line 5806 "src/asm/parser.c"
+ break;
+
+ case 458: /* z80_set: "set" const_3bit "," reg_r */
+#line 2116 "src/asm/parser.y"
+ {
+ sect_AbsByte(0xCB);
+ sect_AbsByte(0xC0 | ((yyvsp[-2].constValue) << 3) | (yyvsp[0].constValue));
+ }
+#line 5815 "src/asm/parser.c"
+ break;
+
+ case 459: /* z80_sla: "sla" reg_r */
+#line 2122 "src/asm/parser.y"
+ {
+ sect_AbsByte(0xCB);
+ sect_AbsByte(0x20 | (yyvsp[0].constValue));
+ }
+#line 5824 "src/asm/parser.c"
+ break;
+
+ case 460: /* z80_sra: "sra" reg_r */
+#line 2128 "src/asm/parser.y"
+ {
+ sect_AbsByte(0xCB);
+ sect_AbsByte(0x28 | (yyvsp[0].constValue));
+ }
+#line 5833 "src/asm/parser.c"
+ break;
+
+ case 461: /* z80_srl: "srl" reg_r */
+#line 2134 "src/asm/parser.y"
+ {
+ sect_AbsByte(0xCB);
+ sect_AbsByte(0x38 | (yyvsp[0].constValue));
+ }
+#line 5842 "src/asm/parser.c"
+ break;
+
+ case 462: /* z80_stop: "stop" */
+#line 2140 "src/asm/parser.y"
+ {
+ sect_AbsByte(0x10);
+ sect_AbsByte(0x00);
+ }
+#line 5851 "src/asm/parser.c"
+ break;
+
+ case 463: /* z80_stop: "stop" reloc_8bit */
+#line 2144 "src/asm/parser.y"
+ {
+ sect_AbsByte(0x10);
+ sect_RelByte(&(yyvsp[0].expr), 1);
+ }
+#line 5860 "src/asm/parser.c"
+ break;
+
+ case 464: /* z80_sub: "sub" op_a_n */
+#line 2150 "src/asm/parser.y"
+ {
+ sect_AbsByte(0xD6);
+ sect_RelByte(&(yyvsp[0].expr), 1);
+ }
+#line 5869 "src/asm/parser.c"
+ break;
+
+ case 465: /* z80_sub: "sub" op_a_r */
+#line 2154 "src/asm/parser.y"
+ { sect_AbsByte(0x90 | (yyvsp[0].constValue)); }
+#line 5875 "src/asm/parser.c"
+ break;
+
+ case 466: /* z80_swap: "swap" reg_r */
+#line 2157 "src/asm/parser.y"
+ {
+ sect_AbsByte(0xCB);
+ sect_AbsByte(0x30 | (yyvsp[0].constValue));
+ }
+#line 5884 "src/asm/parser.c"
+ break;
+
+ case 467: /* z80_xor: "xor" op_a_n */
+#line 2163 "src/asm/parser.y"
+ {
+ sect_AbsByte(0xEE);
+ sect_RelByte(&(yyvsp[0].expr), 1);
+ }
+#line 5893 "src/asm/parser.c"
+ break;
+
+ case 468: /* z80_xor: "xor" op_a_r */
+#line 2167 "src/asm/parser.y"
+ { sect_AbsByte(0xA8 | (yyvsp[0].constValue)); }
+#line 5899 "src/asm/parser.c"
+ break;
+
+ case 469: /* op_mem_ind: "[" reloc_16bit "]" */
+#line 2170 "src/asm/parser.y"
+ { (yyval.expr) = (yyvsp[-1].expr); }
+#line 5905 "src/asm/parser.c"
+ break;
+
+ case 471: /* op_a_r: T_MODE_A "," reg_r */
+#line 2174 "src/asm/parser.y"
+ { (yyval.constValue) = (yyvsp[0].constValue); }
+#line 5911 "src/asm/parser.c"
+ break;
+
+ case 473: /* op_a_n: T_MODE_A "," reloc_8bit */
+#line 2178 "src/asm/parser.y"
+ { (yyval.expr) = (yyvsp[0].expr); }
+#line 5917 "src/asm/parser.c"
+ break;
+
+ case 489: /* ccode_expr: "!" ccode_expr */
+#line 2210 "src/asm/parser.y"
+ {
+ (yyval.constValue) = (yyvsp[0].constValue) ^ 1;
+ }
+#line 5925 "src/asm/parser.c"
+ break;
+
+ case 490: /* ccode: "nz" */
+#line 2215 "src/asm/parser.y"
+ { (yyval.constValue) = CC_NZ; }
+#line 5931 "src/asm/parser.c"
+ break;
+
+ case 491: /* ccode: "z" */
+#line 2216 "src/asm/parser.y"
+ { (yyval.constValue) = CC_Z; }
+#line 5937 "src/asm/parser.c"
+ break;
+
+ case 492: /* ccode: "nc" */
+#line 2217 "src/asm/parser.y"
+ { (yyval.constValue) = CC_NC; }
+#line 5943 "src/asm/parser.c"
+ break;
+
+ case 493: /* ccode: "c" */
+#line 2218 "src/asm/parser.y"
+ { (yyval.constValue) = CC_C; }
+#line 5949 "src/asm/parser.c"
+ break;
+
+ case 494: /* reg_r: T_MODE_B */
+#line 2221 "src/asm/parser.y"
+ { (yyval.constValue) = REG_B; }
+#line 5955 "src/asm/parser.c"
+ break;
+
+ case 495: /* reg_r: T_MODE_C */
+#line 2222 "src/asm/parser.y"
+ { (yyval.constValue) = REG_C; }
+#line 5961 "src/asm/parser.c"
+ break;
+
+ case 496: /* reg_r: T_MODE_D */
+#line 2223 "src/asm/parser.y"
+ { (yyval.constValue) = REG_D; }
+#line 5967 "src/asm/parser.c"
+ break;
+
+ case 497: /* reg_r: T_MODE_E */
+#line 2224 "src/asm/parser.y"
+ { (yyval.constValue) = REG_E; }
+#line 5973 "src/asm/parser.c"
+ break;
+
+ case 498: /* reg_r: T_MODE_H */
+#line 2225 "src/asm/parser.y"
+ { (yyval.constValue) = REG_H; }
+#line 5979 "src/asm/parser.c"
+ break;
+
+ case 499: /* reg_r: T_MODE_L */
+#line 2226 "src/asm/parser.y"
+ { (yyval.constValue) = REG_L; }
+#line 5985 "src/asm/parser.c"
+ break;
+
+ case 500: /* reg_r: "[" "hl" "]" */
+#line 2227 "src/asm/parser.y"
+ { (yyval.constValue) = REG_HL_IND; }
+#line 5991 "src/asm/parser.c"
+ break;
+
+ case 501: /* reg_r: T_MODE_A */
+#line 2228 "src/asm/parser.y"
+ { (yyval.constValue) = REG_A; }
+#line 5997 "src/asm/parser.c"
+ break;
+
+ case 502: /* reg_tt: "bc" */
+#line 2231 "src/asm/parser.y"
+ { (yyval.constValue) = REG_BC; }
+#line 6003 "src/asm/parser.c"
+ break;
+
+ case 503: /* reg_tt: "de" */
+#line 2232 "src/asm/parser.y"
+ { (yyval.constValue) = REG_DE; }
+#line 6009 "src/asm/parser.c"
+ break;
+
+ case 504: /* reg_tt: "hl" */
+#line 2233 "src/asm/parser.y"
+ { (yyval.constValue) = REG_HL; }
+#line 6015 "src/asm/parser.c"
+ break;
+
+ case 505: /* reg_tt: "af" */
+#line 2234 "src/asm/parser.y"
+ { (yyval.constValue) = REG_AF; }
+#line 6021 "src/asm/parser.c"
+ break;
+
+ case 506: /* reg_ss: "bc" */
+#line 2237 "src/asm/parser.y"
+ { (yyval.constValue) = REG_BC; }
+#line 6027 "src/asm/parser.c"
+ break;
+
+ case 507: /* reg_ss: "de" */
+#line 2238 "src/asm/parser.y"
+ { (yyval.constValue) = REG_DE; }
+#line 6033 "src/asm/parser.c"
+ break;
+
+ case 508: /* reg_ss: "hl" */
+#line 2239 "src/asm/parser.y"
+ { (yyval.constValue) = REG_HL; }
+#line 6039 "src/asm/parser.c"
+ break;
+
+ case 509: /* reg_ss: "sp" */
+#line 2240 "src/asm/parser.y"
+ { (yyval.constValue) = REG_SP; }
+#line 6045 "src/asm/parser.c"
+ break;
+
+ case 510: /* reg_rr: "[" "bc" "]" */
+#line 2243 "src/asm/parser.y"
+ { (yyval.constValue) = REG_BC_IND; }
+#line 6051 "src/asm/parser.c"
+ break;
+
+ case 511: /* reg_rr: "[" "de" "]" */
+#line 2244 "src/asm/parser.y"
+ { (yyval.constValue) = REG_DE_IND; }
+#line 6057 "src/asm/parser.c"
+ break;
+
+ case 512: /* reg_rr: hl_ind_inc */
+#line 2245 "src/asm/parser.y"
+ { (yyval.constValue) = REG_HL_INDINC; }
+#line 6063 "src/asm/parser.c"
+ break;
+
+ case 513: /* reg_rr: hl_ind_dec */
+#line 2246 "src/asm/parser.y"
+ { (yyval.constValue) = REG_HL_INDDEC; }
+#line 6069 "src/asm/parser.c"
+ break;
+
+
+#line 6073 "src/asm/parser.c"
+
+ default: break;
+ }
+ if (yychar_backup != yychar)
+ YY_LAC_DISCARD ("yychar change");
+ }
+ /* User semantic actions sometimes alter yychar, and that requires
+ that yytoken be updated with the new translation. We take the
+ approach of translating immediately before every use of yytoken.
+ One alternative is translating here after every semantic action,
+ but that translation would be missed if the semantic action invokes
+ YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or
+ if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an
+ incorrect destructor might then be invoked immediately. In the
+ case of YYERROR or YYBACKUP, subsequent parser actions might lead
+ to an incorrect destructor call or verbose syntax error message
+ before the lookahead is translated. */
+ YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc);
+
+ YYPOPSTACK (yylen);
+ yylen = 0;
+
+ *++yyvsp = yyval;
+
+ /* Now 'shift' the result of the reduction. Determine what state
+ that goes to, based on the state we popped back to and the rule
+ number reduced by. */
+ {
+ const int yylhs = yyr1[yyn] - YYNTOKENS;
+ const int yyi = yypgoto[yylhs] + *yyssp;
+ yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp
+ ? yytable[yyi]
+ : yydefgoto[yylhs]);
+ }
+
+ goto yynewstate;
+
+
+/*--------------------------------------.
+| yyerrlab -- here on detecting error. |
+`--------------------------------------*/
+yyerrlab:
+ /* Make sure we have latest lookahead translation. See comments at
+ user semantic actions for why this is necessary. */
+ yytoken = yychar == YYEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar);
+ /* If not already recovering from an error, report this error. */
+ if (!yyerrstatus)
+ {
+ ++yynerrs;
+ {
+ yypcontext_t yyctx
+ = {yyssp, yyesa, &yyes, &yyes_capacity, yytoken};
+ char const *yymsgp = YY_("syntax error");
+ int yysyntax_error_status;
+ if (yychar != YYEMPTY)
+ YY_LAC_ESTABLISH;
+ yysyntax_error_status = yysyntax_error (&yymsg_alloc, &yymsg, &yyctx);
+ if (yysyntax_error_status == 0)
+ yymsgp = yymsg;
+ else if (yysyntax_error_status == -1)
+ {
+ if (yymsg != yymsgbuf)
+ YYSTACK_FREE (yymsg);
+ yymsg = YY_CAST (char *,
+ YYSTACK_ALLOC (YY_CAST (YYSIZE_T, yymsg_alloc)));
+ if (yymsg)
+ {
+ yysyntax_error_status
+ = yysyntax_error (&yymsg_alloc, &yymsg, &yyctx);
+ yymsgp = yymsg;
+ }
+ else
+ {
+ yymsg = yymsgbuf;
+ yymsg_alloc = sizeof yymsgbuf;
+ yysyntax_error_status = YYENOMEM;
+ }
+ }
+ yyerror (yymsgp);
+ if (yysyntax_error_status == YYENOMEM)
+ YYNOMEM;
+ }
+ }
+
+ if (yyerrstatus == 3)
+ {
+ /* If just tried and failed to reuse lookahead token after an
+ error, discard it. */
+
+ if (yychar <= T_EOF)
+ {
+ /* Return failure if at end of input. */
+ if (yychar == T_EOF)
+ YYABORT;
+ }
+ else
+ {
+ yydestruct ("Error: discarding",
+ yytoken, &yylval);
+ yychar = YYEMPTY;
+ }
+ }
+
+ /* Else will try to reuse lookahead token after shifting the error
+ token. */
+ goto yyerrlab1;
+
+
+/*---------------------------------------------------.
+| yyerrorlab -- error raised explicitly by YYERROR. |
+`---------------------------------------------------*/
+yyerrorlab:
+ /* Pacify compilers when the user code never invokes YYERROR and the
+ label yyerrorlab therefore never appears in user code. */
+ if (0)
+ YYERROR;
+ ++yynerrs;
+
+ /* Do not reclaim the symbols of the rule whose action triggered
+ this YYERROR. */
+ YYPOPSTACK (yylen);
+ yylen = 0;
+ YY_STACK_PRINT (yyss, yyssp);
+ yystate = *yyssp;
+ goto yyerrlab1;
+
+
+/*-------------------------------------------------------------.
+| yyerrlab1 -- common code for both syntax error and YYERROR. |
+`-------------------------------------------------------------*/
+yyerrlab1:
+ yyerrstatus = 3; /* Each real token shifted decrements this. */
+
+ /* Pop stack until we find a state that shifts the error token. */
+ for (;;)
+ {
+ yyn = yypact[yystate];
+ if (!yypact_value_is_default (yyn))
+ {
+ yyn += YYSYMBOL_YYerror;
+ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror)
+ {
+ yyn = yytable[yyn];
+ if (0 < yyn)
+ break;
+ }
+ }
+
+ /* Pop the current state because it cannot handle the error token. */
+ if (yyssp == yyss)
+ YYABORT;
+
+
+ yydestruct ("Error: popping",
+ YY_ACCESSING_SYMBOL (yystate), yyvsp);
+ YYPOPSTACK (1);
+ yystate = *yyssp;
+ YY_STACK_PRINT (yyss, yyssp);
+ }
+
+ /* If the stack popping above didn't lose the initial context for the
+ current lookahead token, the shift below will for sure. */
+ YY_LAC_DISCARD ("error recovery");
+
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ *++yyvsp = yylval;
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+
+
+ /* Shift the error token. */
+ YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp);
+
+ yystate = yyn;
+ goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here. |
+`-------------------------------------*/
+yyacceptlab:
+ yyresult = 0;
+ goto yyreturnlab;
+
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here. |
+`-----------------------------------*/
+yyabortlab:
+ yyresult = 1;
+ goto yyreturnlab;
+
+
+/*-----------------------------------------------------------.
+| yyexhaustedlab -- YYNOMEM (memory exhaustion) comes here. |
+`-----------------------------------------------------------*/
+yyexhaustedlab:
+ yyerror (YY_("memory exhausted"));
+ yyresult = 2;
+ goto yyreturnlab;
+
+
+/*----------------------------------------------------------.
+| yyreturnlab -- parsing is finished, clean up and return. |
+`----------------------------------------------------------*/
+yyreturnlab:
+ if (yychar != YYEMPTY)
+ {
+ /* Make sure we have latest lookahead translation. See comments at
+ user semantic actions for why this is necessary. */
+ yytoken = YYTRANSLATE (yychar);
+ yydestruct ("Cleanup: discarding lookahead",
+ yytoken, &yylval);
+ }
+ /* Do not reclaim the symbols of the rule whose action triggered
+ this YYABORT or YYACCEPT. */
+ YYPOPSTACK (yylen);
+ YY_STACK_PRINT (yyss, yyssp);
+ while (yyssp != yyss)
+ {
+ yydestruct ("Cleanup: popping",
+ YY_ACCESSING_SYMBOL (+*yyssp), yyvsp);
+ YYPOPSTACK (1);
+ }
+#ifndef yyoverflow
+ if (yyss != yyssa)
+ YYSTACK_FREE (yyss);
+#endif
+ if (yyes != yyesa)
+ YYSTACK_FREE (yyes);
+ if (yymsg != yymsgbuf)
+ YYSTACK_FREE (yymsg);
+ return yyresult;
+}
+
+#line 2257 "src/asm/parser.y"
+
--- /dev/null
+++ b/src/asm/parser.h
@@ -1,0 +1,305 @@
+/* A Bison parser, made by GNU Bison 3.8.2. */
+
+/* Bison interface for Yacc-like parsers in C
+
+ Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation,
+ Inc.
+
+ 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, either version 3 of the License, or
+ (at your option) any later version.
+
+ 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, see <https://www.gnu.org/licenses/>. */
+
+/* As a special exception, you may create a larger work that contains
+ part or all of the Bison parser skeleton and distribute that work
+ under terms of your choice, so long as that work isn't itself a
+ parser generator using the skeleton or a modified version thereof
+ as a parser skeleton. Alternatively, if you modify or redistribute
+ the parser skeleton itself, you may (at your option) remove this
+ special exception, which will cause the skeleton and the resulting
+ Bison output files to be licensed under the GNU General Public
+ License without this special exception.
+
+ This special exception was added by the Free Software Foundation in
+ version 2.2 of Bison. */
+
+/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,
+ especially those whose name start with YY_ or yy_. They are
+ private implementation details that can be changed or removed. */
+
+#ifndef YY_YY_SRC_ASM_PARSER_H_INCLUDED
+# define YY_YY_SRC_ASM_PARSER_H_INCLUDED
+/* Debug traces. */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+#if YYDEBUG
+extern int yydebug;
+#endif
+
+/* Token kinds. */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+ enum yytokentype
+ {
+ YYEMPTY = -2,
+ T_EOF = 0, /* "end of file" */
+ YYerror = 1, /* error */
+ YYUNDEF = 2, /* "invalid token" */
+ T_NUMBER = 3, /* "number" */
+ T_STRING = 4, /* "string" */
+ T_PERIOD = 5, /* "." */
+ T_COMMA = 6, /* "," */
+ T_COLON = 7, /* ":" */
+ T_LBRACK = 8, /* "[" */
+ T_RBRACK = 9, /* "]" */
+ T_LPAREN = 10, /* "(" */
+ T_RPAREN = 11, /* ")" */
+ T_NEWLINE = 12, /* "newline" */
+ T_OP_LOGICNOT = 13, /* "!" */
+ T_OP_LOGICAND = 14, /* "&&" */
+ T_OP_LOGICOR = 15, /* "||" */
+ T_OP_LOGICGT = 16, /* ">" */
+ T_OP_LOGICLT = 17, /* "<" */
+ T_OP_LOGICGE = 18, /* ">=" */
+ T_OP_LOGICLE = 19, /* "<=" */
+ T_OP_LOGICNE = 20, /* "!=" */
+ T_OP_LOGICEQU = 21, /* "==" */
+ T_OP_ADD = 22, /* "+" */
+ T_OP_SUB = 23, /* "-" */
+ T_OP_OR = 24, /* "|" */
+ T_OP_XOR = 25, /* "^" */
+ T_OP_AND = 26, /* "&" */
+ T_OP_SHL = 27, /* "<<" */
+ T_OP_SHR = 28, /* ">>" */
+ T_OP_USHR = 29, /* ">>>" */
+ T_OP_MUL = 30, /* "*" */
+ T_OP_DIV = 31, /* "/" */
+ T_OP_MOD = 32, /* "%" */
+ T_OP_NOT = 33, /* "~" */
+ NEG = 34, /* NEG */
+ T_OP_EXP = 35, /* "**" */
+ T_OP_DEF = 36, /* "DEF" */
+ T_OP_BANK = 37, /* "BANK" */
+ T_OP_ALIGN = 38, /* "ALIGN" */
+ T_OP_SIZEOF = 39, /* "SIZEOF" */
+ T_OP_STARTOF = 40, /* "STARTOF" */
+ T_OP_SIN = 41, /* "SIN" */
+ T_OP_COS = 42, /* "COS" */
+ T_OP_TAN = 43, /* "TAN" */
+ T_OP_ASIN = 44, /* "ASIN" */
+ T_OP_ACOS = 45, /* "ACOS" */
+ T_OP_ATAN = 46, /* "ATAN" */
+ T_OP_ATAN2 = 47, /* "ATAN2" */
+ T_OP_FDIV = 48, /* "FDIV" */
+ T_OP_FMUL = 49, /* "FMUL" */
+ T_OP_FMOD = 50, /* "FMOD" */
+ T_OP_POW = 51, /* "POW" */
+ T_OP_LOG = 52, /* "LOG" */
+ T_OP_ROUND = 53, /* "ROUND" */
+ T_OP_CEIL = 54, /* "CEIL" */
+ T_OP_FLOOR = 55, /* "FLOOR" */
+ T_OP_HIGH = 56, /* "HIGH" */
+ T_OP_LOW = 57, /* "LOW" */
+ T_OP_ISCONST = 58, /* "ISCONST" */
+ T_OP_STRCMP = 59, /* "STRCMP" */
+ T_OP_STRIN = 60, /* "STRIN" */
+ T_OP_STRRIN = 61, /* "STRRIN" */
+ T_OP_STRSUB = 62, /* "STRSUB" */
+ T_OP_STRLEN = 63, /* "STRLEN" */
+ T_OP_STRCAT = 64, /* "STRCAT" */
+ T_OP_STRUPR = 65, /* "STRUPR" */
+ T_OP_STRLWR = 66, /* "STRLWR" */
+ T_OP_STRRPL = 67, /* "STRRPL" */
+ T_OP_STRFMT = 68, /* "STRFMT" */
+ T_OP_CHARLEN = 69, /* "CHARLEN" */
+ T_OP_CHARSUB = 70, /* "CHARSUB" */
+ T_LABEL = 71, /* "label" */
+ T_ID = 72, /* "identifier" */
+ T_LOCAL_ID = 73, /* "local identifier" */
+ T_ANON = 74, /* "anonymous label" */
+ T_POP_EQU = 75, /* "EQU" */
+ T_POP_EQUAL = 76, /* "=" */
+ T_POP_EQUS = 77, /* "EQUS" */
+ T_POP_ADDEQ = 78, /* "+=" */
+ T_POP_SUBEQ = 79, /* "-=" */
+ T_POP_MULEQ = 80, /* "*=" */
+ T_POP_DIVEQ = 81, /* "/=" */
+ T_POP_MODEQ = 82, /* "%=" */
+ T_POP_OREQ = 83, /* "|=" */
+ T_POP_XOREQ = 84, /* "^=" */
+ T_POP_ANDEQ = 85, /* "&=" */
+ T_POP_SHLEQ = 86, /* "<<=" */
+ T_POP_SHREQ = 87, /* ">>=" */
+ T_POP_INCLUDE = 88, /* "INCLUDE" */
+ T_POP_PRINT = 89, /* "PRINT" */
+ T_POP_PRINTLN = 90, /* "PRINTLN" */
+ T_POP_IF = 91, /* "IF" */
+ T_POP_ELIF = 92, /* "ELIF" */
+ T_POP_ELSE = 93, /* "ELSE" */
+ T_POP_ENDC = 94, /* "ENDC" */
+ T_POP_EXPORT = 95, /* "EXPORT" */
+ T_POP_DB = 96, /* "DB" */
+ T_POP_DS = 97, /* "DS" */
+ T_POP_DW = 98, /* "DW" */
+ T_POP_DL = 99, /* "DL" */
+ T_POP_SECTION = 100, /* "SECTION" */
+ T_POP_FRAGMENT = 101, /* "FRAGMENT" */
+ T_POP_RB = 102, /* "RB" */
+ T_POP_RW = 103, /* "RW" */
+ T_POP_MACRO = 104, /* "MACRO" */
+ T_POP_ENDM = 105, /* "ENDM" */
+ T_POP_RSRESET = 106, /* "RSRESET" */
+ T_POP_RSSET = 107, /* "RSSET" */
+ T_POP_UNION = 108, /* "UNION" */
+ T_POP_NEXTU = 109, /* "NEXTU" */
+ T_POP_ENDU = 110, /* "ENDU" */
+ T_POP_INCBIN = 111, /* "INCBIN" */
+ T_POP_REPT = 112, /* "REPT" */
+ T_POP_FOR = 113, /* "FOR" */
+ T_POP_CHARMAP = 114, /* "CHARMAP" */
+ T_POP_NEWCHARMAP = 115, /* "NEWCHARMAP" */
+ T_POP_SETCHARMAP = 116, /* "SETCHARMAP" */
+ T_POP_PUSHC = 117, /* "PUSHC" */
+ T_POP_POPC = 118, /* "POPC" */
+ T_POP_SHIFT = 119, /* "SHIFT" */
+ T_POP_ENDR = 120, /* "ENDR" */
+ T_POP_BREAK = 121, /* "BREAK" */
+ T_POP_LOAD = 122, /* "LOAD" */
+ T_POP_ENDL = 123, /* "ENDL" */
+ T_POP_FAIL = 124, /* "FAIL" */
+ T_POP_WARN = 125, /* "WARN" */
+ T_POP_FATAL = 126, /* "FATAL" */
+ T_POP_ASSERT = 127, /* "ASSERT" */
+ T_POP_STATIC_ASSERT = 128, /* "STATIC_ASSERT" */
+ T_POP_PURGE = 129, /* "PURGE" */
+ T_POP_REDEF = 130, /* "REDEF" */
+ T_POP_POPS = 131, /* "POPS" */
+ T_POP_PUSHS = 132, /* "PUSHS" */
+ T_POP_POPO = 133, /* "POPO" */
+ T_POP_PUSHO = 134, /* "PUSHO" */
+ T_POP_OPT = 135, /* "OPT" */
+ T_SECT_ROM0 = 136, /* "ROM0" */
+ T_SECT_ROMX = 137, /* "ROMX" */
+ T_SECT_WRAM0 = 138, /* "WRAM0" */
+ T_SECT_WRAMX = 139, /* "WRAMX" */
+ T_SECT_HRAM = 140, /* "HRAM" */
+ T_SECT_VRAM = 141, /* "VRAM" */
+ T_SECT_SRAM = 142, /* "SRAM" */
+ T_SECT_OAM = 143, /* "OAM" */
+ T_Z80_ADC = 144, /* "adc" */
+ T_Z80_ADD = 145, /* "add" */
+ T_Z80_AND = 146, /* "and" */
+ T_Z80_BIT = 147, /* "bit" */
+ T_Z80_CALL = 148, /* "call" */
+ T_Z80_CCF = 149, /* "ccf" */
+ T_Z80_CP = 150, /* "cp" */
+ T_Z80_CPL = 151, /* "cpl" */
+ T_Z80_DAA = 152, /* "daa" */
+ T_Z80_DEC = 153, /* "dec" */
+ T_Z80_DI = 154, /* "di" */
+ T_Z80_EI = 155, /* "ei" */
+ T_Z80_HALT = 156, /* "halt" */
+ T_Z80_INC = 157, /* "inc" */
+ T_Z80_JP = 158, /* "jp" */
+ T_Z80_JR = 159, /* "jr" */
+ T_Z80_LD = 160, /* "ld" */
+ T_Z80_LDI = 161, /* "ldi" */
+ T_Z80_LDD = 162, /* "ldd" */
+ T_Z80_LDH = 163, /* "ldh" */
+ T_Z80_NOP = 164, /* "nop" */
+ T_Z80_OR = 165, /* "or" */
+ T_Z80_POP = 166, /* "pop" */
+ T_Z80_PUSH = 167, /* "push" */
+ T_Z80_RES = 168, /* "res" */
+ T_Z80_RET = 169, /* "ret" */
+ T_Z80_RETI = 170, /* "reti" */
+ T_Z80_RST = 171, /* "rst" */
+ T_Z80_RL = 172, /* "rl" */
+ T_Z80_RLA = 173, /* "rla" */
+ T_Z80_RLC = 174, /* "rlc" */
+ T_Z80_RLCA = 175, /* "rlca" */
+ T_Z80_RR = 176, /* "rr" */
+ T_Z80_RRA = 177, /* "rra" */
+ T_Z80_RRC = 178, /* "rrc" */
+ T_Z80_RRCA = 179, /* "rrca" */
+ T_Z80_SBC = 180, /* "sbc" */
+ T_Z80_SCF = 181, /* "scf" */
+ T_Z80_SET = 182, /* "set" */
+ T_Z80_STOP = 183, /* "stop" */
+ T_Z80_SLA = 184, /* "sla" */
+ T_Z80_SRA = 185, /* "sra" */
+ T_Z80_SRL = 186, /* "srl" */
+ T_Z80_SUB = 187, /* "sub" */
+ T_Z80_SWAP = 188, /* "swap" */
+ T_Z80_XOR = 189, /* "xor" */
+ T_TOKEN_A = 190, /* "a" */
+ T_TOKEN_B = 191, /* "b" */
+ T_TOKEN_C = 192, /* "c" */
+ T_TOKEN_D = 193, /* "d" */
+ T_TOKEN_E = 194, /* "e" */
+ T_TOKEN_H = 195, /* "h" */
+ T_TOKEN_L = 196, /* "l" */
+ T_MODE_AF = 197, /* "af" */
+ T_MODE_BC = 198, /* "bc" */
+ T_MODE_DE = 199, /* "de" */
+ T_MODE_SP = 200, /* "sp" */
+ T_MODE_HL = 201, /* "hl" */
+ T_MODE_HL_DEC = 202, /* "hld/hl-" */
+ T_MODE_HL_INC = 203, /* "hli/hl+" */
+ T_CC_NZ = 204, /* "nz" */
+ T_CC_Z = 205, /* "z" */
+ T_CC_NC = 206, /* "nc" */
+ T_EOB = 207 /* "end of buffer" */
+ };
+ typedef enum yytokentype yytoken_kind_t;
+#endif
+
+/* Value type. */
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+union YYSTYPE
+{
+#line 473 "src/asm/parser.y"
+
+ char symName[MAXSYMLEN + 1];
+ char string[MAXSTRLEN + 1];
+ struct Expression expr;
+ int32_t constValue;
+ enum RPNCommand compoundEqual;
+ enum SectionModifier sectMod;
+ struct SectionSpec sectSpec;
+ struct MacroArgs *macroArg;
+ enum AssertionType assertType;
+ struct DsArgList dsArgs;
+ struct {
+ int32_t start;
+ int32_t stop;
+ int32_t step;
+ } forArgs;
+ struct StrFmtArgList strfmtArgs;
+ bool captureTerminated;
+
+#line 291 "src/asm/parser.h"
+
+};
+typedef union YYSTYPE YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
+# define YYSTYPE_IS_DECLARED 1
+#endif
+
+
+extern YYSTYPE yylval;
+
+
+int yyparse (void);
+
+
+#endif /* !YY_YY_SRC_ASM_PARSER_H_INCLUDED */
--- a/src/asm/parser.y
+++ b/src/asm/parser.y
@@ -541,7 +541,7 @@
%left T_OP_SHL T_OP_SHR T_OP_USHR
%left T_OP_MUL T_OP_DIV T_OP_MOD
-%precedence NEG // negation -- unary minus
+//%prec NEG // negation -- unary minus
%token T_OP_EXP "**"
%left T_OP_EXP
--- a/src/asm/section.c
+++ b/src/asm/section.c
@@ -831,7 +831,6 @@
if (!reserveSpace(fsize - startPos))
goto cleanup;
} else {
- if (errno != ESPIPE)
error("Error determining size of INCBIN file '%s': %s\n",
s, strerror(errno));
// The file isn't seekable, so we'll just skip bytes
@@ -908,7 +907,6 @@
fseek(f, start_pos, SEEK_SET);
} else {
- if (errno != ESPIPE)
error("Error determining size of INCBIN file '%s': %s\n",
s, strerror(errno));
// The file isn't seekable, so we'll just skip bytes
@@ -978,7 +976,7 @@
free(entry);
}
-bool sect_IsSizeKnown(struct Section const NONNULL(sect))
+bool sect_IsSizeKnown(struct Section const *sect)
{
// SECTION UNION and SECTION FRAGMENT can still grow
if (sect->modifier != SECTION_NORMAL)
--- a/src/asm/symbol.c
+++ b/src/asm/symbol.c
@@ -596,7 +596,7 @@
}
// Write an anonymous label's name to a buffer
-void sym_WriteAnonLabelName(char buf[MIN_NB_ELMS(MAXSYMLEN + 1)], uint32_t ofs, bool neg)
+void sym_WriteAnonLabelName(char *buf, uint32_t ofs, bool neg)
{
uint32_t id = 0;
--- /dev/null
+++ b/src/asm/utf8decoder.c
@@ -1,0 +1,1 @@
+#include "../extern/utf8decoder.c"
--- /dev/null
+++ b/src/asm/version.c
@@ -1,0 +1,1 @@
+#include "../version.c"
--- a/src/asm/warning.c
+++ b/src/asm/warning.c
@@ -379,8 +379,7 @@
return;
case WARNING_DEFAULT:
- unreachable_();
- // Not reached
+ break;
case WARNING_ENABLED:
break;
--- a/src/error.c
+++ b/src/error.c
@@ -15,7 +15,7 @@
#include "error.h"
#include "platform.h"
-static void vwarn(char const NONNULL(fmt), va_list ap)
+static void vwarn(char const *fmt, va_list ap)
{
fprintf(stderr, "warning: ");
vfprintf(stderr, fmt, ap);
@@ -23,7 +23,7 @@
perror(NULL);
}
-static void vwarnx(char const NONNULL(fmt), va_list ap)
+static void vwarnx(char const *fmt, va_list ap)
{
fprintf(stderr, "warning");
fputs(": ", stderr);
@@ -31,7 +31,7 @@
putc('\n', stderr);
}
-_Noreturn static void verr(char const NONNULL(fmt), va_list ap)
+_Noreturn static void verr(char const *fmt, va_list ap)
{
fprintf(stderr, "error: ");
vfprintf(stderr, fmt, ap);
@@ -41,7 +41,7 @@
exit(1);
}
-_Noreturn static void verrx(char const NONNULL(fmt), va_list ap)
+_Noreturn static void verrx(char const *fmt, va_list ap)
{
fprintf(stderr, "error");
fputs(": ", stderr);
@@ -50,7 +50,7 @@
exit(1);
}
-void warn(char const NONNULL(fmt), ...)
+void warn(char const *fmt, ...)
{
va_list ap;
@@ -59,7 +59,7 @@
va_end(ap);
}
-void warnx(char const NONNULL(fmt), ...)
+void warnx(char const *fmt, ...)
{
va_list ap;
@@ -68,7 +68,7 @@
va_end(ap);
}
-_Noreturn void err(char const NONNULL(fmt), ...)
+_Noreturn void err(char const *fmt, ...)
{
va_list ap;
@@ -77,7 +77,7 @@
va_end(ap);
}
-_Noreturn void errx(char const NONNULL(fmt), ...)
+_Noreturn void errx(char const *fmt, ...)
{
va_list ap;
--- /dev/null
+++ b/src/fix/getopt.c
@@ -1,0 +1,1 @@
+#include "../extern/getopt.c"
--- a/src/fix/main.c
+++ b/src/fix/main.c
@@ -469,11 +469,13 @@
if (!features)
break;
mbc = ROM_RAM - 1;
+#ifndef __plan9__
static_assert(ROM_RAM + 1 == ROM_RAM_BATTERY, "Enum sanity check failed!");
static_assert(MBC1 + 1 == MBC1_RAM, "Enum sanity check failed!");
static_assert(MBC1 + 2 == MBC1_RAM_BATTERY, "Enum sanity check failed!");
static_assert(MMM01 + 1 == MMM01_RAM, "Enum sanity check failed!");
static_assert(MMM01 + 2 == MMM01_RAM_BATTERY, "Enum sanity check failed!");
+#endif
// fallthrough
case MBC1:
case MMM01:
@@ -501,10 +503,12 @@
mbc = MBC3_TIMER_BATTERY;
// RAM is handled below
}
+#ifndef __plan9__
static_assert(MBC3 + 1 == MBC3_RAM, "Enum sanity check failed!");
static_assert(MBC3 + 2 == MBC3_RAM_BATTERY, "Enum sanity check failed!");
static_assert(MBC3_TIMER_BATTERY + 1 == MBC3_TIMER_RAM_BATTERY,
"Enum sanity check failed!");
+#endif
if (features == RAM)
mbc++;
else if (features == (RAM | BATTERY))
@@ -518,11 +522,13 @@
features &= ~RUMBLE;
mbc = MBC5_RUMBLE;
}
+#ifndef __plan9__
static_assert(MBC5 + 1 == MBC5_RAM, "Enum sanity check failed!");
static_assert(MBC5 + 2 == MBC5_RAM_BATTERY, "Enum sanity check failed!");
static_assert(MBC5_RUMBLE + 1 == MBC5_RUMBLE_RAM, "Enum sanity check failed!");
static_assert(MBC5_RUMBLE + 2 == MBC5_RUMBLE_RAM_BATTERY,
"Enum sanity check failed!");
+#endif
if (features == RAM)
mbc++;
else if (features == (RAM | BATTERY))
@@ -672,10 +678,9 @@
case MBC_BAD:
case MBC_WRONG_FEATURES:
case MBC_BAD_RANGE:
- unreachable_();
+ break;
}
-
- unreachable_();
+ return NULL;
}
static bool hasRAM(enum MbcType type)
@@ -736,8 +741,7 @@
case TPP1_BATTERY_TIMER_MULTIRUMBLE_RUMBLE:
break;
}
-
- unreachable_();
+ return false;
}
static const uint8_t ninLogo[] = {
@@ -796,7 +800,7 @@
while (len) {
ssize_t ret = read(fd, buf, len);
- if (ret == -1 && errno != EINTR) // Return errors, unless we only were interrupted
+ if (ret == -1) // Return errors, unless we only were interrupted
return -1;
// EOF reached
if (ret == 0)
@@ -822,7 +826,7 @@
while (len) {
ssize_t ret = write(fd, buf, len);
- if (ret == -1 && errno != EINTR) // Return errors, unless we only were interrupted
+ if (ret == -1) // Return errors, unless we only were interrupted
return -1;
// EOF reached
if (ret == 0)
@@ -884,7 +888,7 @@
* @param name The file's name, to be displayed for error output
* @param fileSize The file's size if known, 0 if not.
*/
-static void processFile(int input, int output, char const *name, off_t fileSize)
+static void processFile(int input, int output, char const *name, ulong fileSize)
{
// Both of these should be true for seekable files, and neither otherwise
if (input == output)
@@ -992,8 +996,10 @@
report("FATAL: \"%s\" has more than 65536 banks\n", name);
return;
}
+#ifndef __plan9__
// This should be guaranteed from the size cap...
static_assert(0x10000 * BANK_SIZE <= SSIZE_MAX, "Max input file size too large for OS");
+#endif
// Compute number of banks and ROMX len from file size
nbBanks = (fileSize + (BANK_SIZE - 1)) / BANK_SIZE;
// = ceil(totalRomxLen / BANK_SIZE)
@@ -1013,7 +1019,9 @@
// Update bank count, ONLY IF at least one byte was read
if (bankLen) {
// We're gonna read another bank, check that it won't be too much
+#ifndef __plan9__
static_assert(0x10000 * BANK_SIZE <= SSIZE_MAX, "Max input file size too large for OS");
+#endif
if (nbBanks == 0x10000) {
report("FATAL: \"%s\" has more than 65536 banks\n", name);
goto cleanup;
@@ -1103,7 +1111,7 @@
// In case the output depends on the input, reset to the beginning of the file, and only
// write the header
if (input == output) {
- if (lseek(output, 0, SEEK_SET) == (off_t)-1) {
+ if (seek(output, 0, SEEK_SET) == (size_t)-1) {
report("FATAL: Failed to rewind \"%s\": %s\n", name, strerror(errno));
goto cleanup;
}
@@ -1141,7 +1149,7 @@
// Output padding
if (padValue != UNSPECIFIED) {
if (input == output) {
- if (lseek(output, 0, SEEK_END) == (off_t)-1) {
+ if (seek(output, 0, SEEK_END) == (size_t)-1) {
report("FATAL: Failed to seek to end of \"%s\": %s\n",
name, strerror(errno));
goto cleanup;
@@ -1151,7 +1159,9 @@
size_t len = (nbBanks - 1) * BANK_SIZE - totalRomxLen; // Don't count ROM0!
while (len) {
+#ifndef __plan9__
static_assert(sizeof(bank) <= SSIZE_MAX, "Bank too large for reading");
+#endif
size_t thisLen = len > sizeof(bank) ? sizeof(bank) : len;
ssize_t ret = writeBytes(output, bank, thisLen);
@@ -1194,6 +1204,17 @@
goto finish;
}
+#ifdef __plan9__
+ Dir *d;
+ size_t size;
+ d = dirfstat(input);
+ if(d == nil)
+ report("FATA: failed to stat: %r\n");
+ size = d->length;
+ free(d);
+ processFile(input, input, name, size);
+#else
+
if (fstat(input, &stat) == -1) {
report("FATAL: Failed to stat \"%s\": %s\n", name, strerror(errno));
} else if (!S_ISREG(stat.st_mode)) { // FIXME: Do we want to support other types?
@@ -1207,6 +1228,7 @@
} else {
processFile(input, input, name, stat.st_size);
}
+#endif
close(input);
}
--- /dev/null
+++ b/src/fix/mkfile
@@ -1,0 +1,16 @@
+</$objtype/mkfile
+
+TARG=rgbfix
+BIN=$home/bin/$objtype
+
+# ThIs MaKeS It PoRtAbLe
+POSIX=-D PRIu32="%ud" -DPRId32="%d" -DPRIx32="%x" -DPRIX32="%X" -DPRIo32="%o" -DSTDOUT_FILENO=1 -DSTDIN_FILENO=0 -DPRIu8="%ud" -DPRIu16="%ud" -DPRId16="%d" -DPRIx16="%x" -DPRIX16="%X" -DMB_LEN_MAX=4 -DUINT32_C='(uint32_t)' -DSSIZE_MAX='0xFFFFFFFF'
+
+CFLAGS=-Fpw -I ../../include -I/sys/include/npe -D__plan9__ -D__${objtype}__ $POSIX
+
+OFILES=\
+ main.$O \
+ getopt.$O \
+ version.$O \
+
+</sys/src/cmd/mkone
--- /dev/null
+++ b/src/fix/version.c
@@ -1,0 +1,1 @@
+#include "../version.c"
--- a/src/hashmap.c
+++ b/src/hashmap.c
@@ -51,7 +51,7 @@
struct HashMapEntry *newEntry = malloc(sizeof(*newEntry));
if (!newEntry)
- err("%s: Failed to allocate new entry", __func__);
+ err("%r: Failed to allocate new entry");
newEntry->hash = hashedKey >> HALF_HASH_NB_BITS;
newEntry->key = key;
--- a/src/link/assign.c
+++ b/src/link/assign.c
@@ -428,8 +428,6 @@
if (!nbSectionsToAssign)
return;
}
-
- unreachable_();
}
void assign_Cleanup(void)
--- /dev/null
+++ b/src/link/error.c
@@ -1,0 +1,1 @@
+#include "../error.c"
--- /dev/null
+++ b/src/link/getopt.c
@@ -1,0 +1,1 @@
+#include "../extern/getopt.c"
--- /dev/null
+++ b/src/link/hashmap.c
@@ -1,0 +1,1 @@
+#include "../hashmap.c"
--- /dev/null
+++ b/src/link/linkdefs.c
@@ -1,0 +1,1 @@
+#include "../linkdefs.c"
--- a/src/link/main.c
+++ b/src/link/main.c
@@ -527,4 +527,5 @@
// Do cleanup before quitting, though.
cleanup();
+ return 0;
}
--- /dev/null
+++ b/src/link/mkfile
@@ -1,0 +1,29 @@
+</$objtype/mkfile
+
+BIN=$home/bin/$objtype
+TARG=rgblink
+
+# ThIs MaKeS It PoRtAbLe
+POSIX=-D PRIu32="%ud" -DPRId32="%d" -DPRIx32="%x" -DPRIX32="%X" -DPRIo32="%o" -DSTDOUT_FILENO=1 -DSTDIN_FILENO=0 -DPRIu8="%ud" -DPRIu16="%ud" -DPRId16="%d" -DPRIx16="%x" -DPRIX16="%X" -DMB_LEN_MAX=4 -DUINT32_C='(uint32_t)'
+
+CFLAGS=-Fpw -I ../../include -I/sys/include/npe -D__plan9__ -D__${objtype}__ $POSIX
+
+OFILES=\
+ assign.$O \
+ main.$O \
+ object.$O \
+ output.$O \
+ patch.$O \
+ script.$O \
+ sdas_obj.$O \
+ section.$O \
+ symbol.$O \
+ getopt.$O \
+ utf8decoder.$O \
+ error.$O \
+ hashmap.$O \
+ linkdefs.$O \
+ opmath.$O \
+ version.$O \
+
+</sys/src/cmd/mkone
--- /dev/null
+++ b/src/link/opmath.c
@@ -1,0 +1,1 @@
+#include "../opmath.c"
--- a/src/link/output.c
+++ b/src/link/output.c
@@ -503,7 +503,7 @@
* Write the total used and free space by section type to the map file
* @param usedMap The total used space by section type
*/
-static void writeMapSummary(uint32_t usedMap[MIN_NB_ELMS(SECTTYPE_INVALID)])
+static void writeMapSummary(uint32_t *usedMap)
{
if (!mapFile)
return;
--- a/src/link/script.c
+++ b/src/link/script.c
@@ -178,8 +178,8 @@
int curchar = getc(linkerScript);
if (curchar == EOF && ferror(linkerScript))
- err("%s(%" PRIu32 "): Unexpected error in %s",
- linkerScriptName, lineNo, __func__);
+ err("%r(%" PRIu32 "): Unexpected error in %s",
+ linkerScriptName, lineNo);
return curchar;
}
@@ -253,8 +253,7 @@
capacity *= 2;
token.attr.string = realloc(token.attr.string, capacity);
if (!token.attr.string)
- err("%s: Failed to allocate memory for string",
- __func__);
+ err("%r: Failed to allocate memory for string");
}
token.attr.string[size++] = curchar;
} while (curchar);
@@ -269,8 +268,7 @@
capacity *= 2;
str = realloc(str, capacity);
if (!str)
- err("%s: Failed to allocate memory for token",
- __func__);
+ err("%r: Failed to allocate memory for token");
}
str[size] = toupper(curchar);
size++;
@@ -333,7 +331,7 @@
{
switch (command) {
case COMMAND_INVALID:
- unreachable_();
+ break;
case COMMAND_ORG:
break;
@@ -405,12 +403,12 @@
switch (parserState) {
case PARSER_FIRSTTIME:
- unreachable_();
+ break;
case PARSER_LINESTART:
switch (token->type) {
case TOKEN_INVALID:
- unreachable_();
+ break;
case TOKEN_EOF:
if (!popFile())
--- a/src/link/section.c
+++ b/src/link/section.c
@@ -186,7 +186,7 @@
break;
case SECTION_NORMAL:
- unreachable_();
+ break;
}
other->nextu = target->nextu;
--- /dev/null
+++ b/src/link/utf8decoder.c
@@ -1,0 +1,1 @@
+#include "../extern/utf8decoder.c"
--- /dev/null
+++ b/src/link/version.c
@@ -1,0 +1,1 @@
+#include "../version.c"