From d800537433a9eaa6ac899fe35f02ae89fae0b07e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D1=80=D0=B0=D0=BD=D0=B8=D0=BC=D0=B8=D1=80=20=D0=9A?= =?UTF-8?q?=D0=B0=D1=80=D0=B0=D1=9F=D0=B8=D1=9B?= Date: Fri, 25 Oct 2024 16:57:13 -0700 Subject: [PATCH] Added CI. --- .github/workflows/main.yml | 158 + makefile | 238 -- scripts/genie.lua | 1 - scripts/lemon.lua | 22 - tools/bin/darwin/lemon | Bin 95148 -> 0 bytes tools/bin/darwin/lempar.c | 981 ------- tools/bin/linux/lemon | Bin 84728 -> 0 bytes tools/bin/linux/lempar.c | 981 ------- tools/bin/windows/lemon.exe | Bin 104448 -> 0 bytes tools/bin/windows/lempar.c | 981 ------- tools/lemon/lemon.c | 5466 ----------------------------------- tools/lemon/lempar.c | 981 ------- 12 files changed, 158 insertions(+), 9651 deletions(-) create mode 100644 .github/workflows/main.yml delete mode 100644 makefile delete mode 100644 scripts/lemon.lua delete mode 100755 tools/bin/darwin/lemon delete mode 100644 tools/bin/darwin/lempar.c delete mode 100755 tools/bin/linux/lemon delete mode 100644 tools/bin/linux/lempar.c delete mode 100644 tools/bin/windows/lemon.exe delete mode 100644 tools/bin/windows/lempar.c delete mode 100644 tools/lemon/lemon.c delete mode 100644 tools/lemon/lempar.c diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 000000000..368f77f71 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,158 @@ +name: CI + +concurrency: + group: ${{ github.ref }} + cancel-in-progress: true + +on: + push: + pull_request: + +jobs: + msvc: + strategy: + fail-fast: true + matrix: + include: [ + { config: Debug, platform: Win32, bindir: 'win32_vs2019' }, + { config: Debug, platform: x64, bindir: 'win64_vs2019' }, + { config: Release, platform: Win32, bindir: 'win32_vs2019' }, + { config: Release, platform: x64, bindir: 'win64_vs2019' }, + ] + name: msvc-${{ matrix.config }}-${{ matrix.platform }} + runs-on: windows-2019 + steps: + - name: Checkout bx + uses: actions/checkout@v3 + with: + repository: bkaradzic/bx + path: bx + - name: Prepare + uses: microsoft/setup-msbuild@v1.1 + - name: Build + shell: cmd + run: | + cd bx + ..\bx\tools\bin\windows\genie.exe vs2019 + msbuild ".build/projects/vs2019/bx.sln" /m /v:minimal /p:Configuration=${{ matrix.config }} /p:Platform=${{ matrix.platform }} + - name: Check + shell: cmd + run: | + cd bx + dir /s ".build\${{ matrix.bindir }}\bin" + ".build\${{ matrix.bindir }}\bin\bx.test${{ matrix.config }}.exe" + mingw: + strategy: + fail-fast: true + matrix: + include: [ + { msystem: MINGW64, project: 'mingw-gcc', bindir: 'win64_mingw-gcc' }, + { msystem: CLANG64, project: 'mingw-clang', bindir: 'win64_mingw-clang' }, + ] + name: mingw-${{ matrix.msystem }} + runs-on: windows-latest + steps: + - name: Checkout bx + uses: actions/checkout@v3 + with: + repository: bkaradzic/bx + path: bx + - name: Prepare + uses: msys2/setup-msys2@v2 + with: + msystem: ${{ matrix.msystem }} + update: true + install: make + pacboy: cc:p + - name: Build + shell: msys2 {0} + run: | + cd bx + make ${{ matrix.project }}-release64 -j$(nproc) AR=ar CC=cc CXX=c++ MINGW=$MINGW_PREFIX + - name: Check + shell: cmd + run: | + cd bx + dir /s ".build\${{ matrix.bindir }}\bin" + ".build\${{ matrix.bindir }}\bin\bx.testRelease.exe" --version + linux: + strategy: + fail-fast: true + matrix: + include: [ + { config: debug, binsuffix: Debug }, + { config: release, binsuffix: Release }, + ] + name: linux-${{ matrix.config }}64 + runs-on: ubuntu-22.04 + steps: + - name: Checkout bx + uses: actions/checkout@v3 + with: + repository: bkaradzic/bx + path: bx + - name: Build + run: | + sudo apt install libgl-dev + cd bx + make -j$(nproc) linux-${{ matrix.config }}64 + - name: Check + run: | + cd bx + ls -lash ".build/linux64_gcc/bin" + ".build/linux64_gcc/bin/bx.test${{ matrix.binsuffix}}" + osx: + strategy: + fail-fast: true + matrix: + include: [ + { config: debug, binsuffix: Debug }, + { config: release, binsuffix: Release }, + ] + name: osx-x64-${{ matrix.config }} + runs-on: macos-latest + steps: + - name: Checkout bx + uses: actions/checkout@v3 + with: + repository: bkaradzic/bx + path: bx + - name: Build + run: | + cd bx + make -j$(sysctl -n hw.physicalcpu) osx-x64-${{ matrix.config }} + - name: Check + run: | + cd bx + ls -lash ".build/osx-x64/bin" + ".build/osx-x64/bin/bx.test${{ matrix.binsuffix}}" + android: + strategy: + fail-fast: true + matrix: + include: [ + { platform: arm64 }, + ] + name: android-${{ matrix.platform }} + runs-on: ubuntu-22.04 + steps: + - uses: nttld/setup-ndk@v1 + id: setup-ndk + with: + ndk-version: r25b + add-to-path: false + - name: Checkout bx + uses: actions/checkout@v3 + with: + repository: bkaradzic/bx + path: bx + - name: Build + run: | + cd bx + make -j$(sysctl -n hw.physicalcpu) android-${{ matrix.platform }} + env: + ANDROID_NDK_ROOT: ${{ steps.setup-ndk.outputs.ndk-path }} + - name: Check + run: | + cd bx + ls -lash ".build/android-${{ matrix.platform }}/bin" diff --git a/makefile b/makefile deleted file mode 100644 index 153eef97b..000000000 --- a/makefile +++ /dev/null @@ -1,238 +0,0 @@ -# -# Copyright 2011-2024 Branimir Karadzic. All rights reserved. -# License: https://github.com/bkaradzic/bx/blob/master/LICENSE -# - -GENIE=../bx/tools/bin/$(OS)/genie - -all: - $(GENIE) vs2017 - $(GENIE) vs2019 - $(GENIE) --gcc=android-arm gmake - $(GENIE) --gcc=android-arm64 gmake - $(GENIE) --gcc=android-x86 gmake - $(GENIE) --gcc=mingw-gcc gmake - $(GENIE) --gcc=linux-gcc gmake - $(GENIE) --gcc=haiku gmake - $(GENIE) --gcc=osx-x64 gmake - $(GENIE) --gcc=osx-arm64 gmake - $(GENIE) --gcc=ios-arm gmake - $(GENIE) --gcc=ios-simulator gmake - $(GENIE) --gcc=tvos-simulator gmake - $(GENIE) xcode8 - -.build/projects/gmake-android-arm: - $(GENIE) --gcc=android-arm gmake -android-arm-debug: .build/projects/gmake-android-arm - make -R -C .build/projects/gmake-android-arm config=debug -android-arm-release: .build/projects/gmake-android-arm - make -R -C .build/projects/gmake-android-arm config=release -android-arm: android-arm-debug android-arm-release - -.build/projects/gmake-android-arm64: - $(GENIE) --gcc=android-arm64 gmake -android-arm64-debug: .build/projects/gmake-android-arm64 - make -R -C .build/projects/gmake-android-arm64 config=debug -android-arm64-release: .build/projects/gmake-android-arm64 - make -R -C .build/projects/gmake-android-arm64 config=release -android-arm64: android-arm64-debug android-arm64-release - -.build/projects/gmake-android-x86: - $(GENIE) --gcc=android-x86 gmake -android-x86-debug: .build/projects/gmake-android-x86 - make -R -C .build/projects/gmake-android-x86 config=debug -android-x86-release: .build/projects/gmake-android-x86 - make -R -C .build/projects/gmake-android-x86 config=release -android-x86: android-x86-debug android-x86-release - -.build/projects/gmake-linux: - $(GENIE) --gcc=linux-gcc gmake -linux-debug64: .build/projects/gmake-linux - make -R -C .build/projects/gmake-linux config=debug64 -linux-release64: .build/projects/gmake-linux - make -R -C .build/projects/gmake-linux config=release64 -linux: linux-debug64 linux-release64 - -.build/projects/gmake-haiku: - $(GENIE) --gcc=haiku gmake -haiku-debug64: .build/projects/gmake-haiku - make -R -C .build/projects/gmake-haiku config=debug64 -haiku-release64: .build/projects/gmake-haiku - make -R -C .build/projects/gmake-haiku config=release64 -haiku: haiku-debug64 haiku-release64 - -.build/projects/gmake-mingw-gcc: - $(GENIE) --gcc=mingw-gcc gmake -mingw-gcc-debug32: .build/projects/gmake-mingw-gcc - make -R -C .build/projects/gmake-mingw-gcc config=debug32 -mingw-gcc-release32: .build/projects/gmake-mingw-gcc - make -R -C .build/projects/gmake-mingw-gcc config=release32 -mingw-gcc-debug64: .build/projects/gmake-mingw-gcc - make -R -C .build/projects/gmake-mingw-gcc config=debug64 -mingw-gcc-release64: .build/projects/gmake-mingw-gcc - make -R -C .build/projects/gmake-mingw-gcc config=release64 -mingw-gcc: mingw-gcc-debug32 mingw-gcc-release32 mingw-gcc-debug64 mingw-gcc-release64 - -.build/projects/gmake-mingw-clang: - $(GENIE) --clang=mingw-clang gmake -mingw-clang-debug32: .build/projects/gmake-mingw-clang - make -R -C .build/projects/gmake-mingw-clang config=debug32 -mingw-clang-release32: .build/projects/gmake-mingw-clang - make -R -C .build/projects/gmake-mingw-clang config=release32 -mingw-clang-debug64: .build/projects/gmake-mingw-clang - make -R -C .build/projects/gmake-mingw-clang config=debug64 -mingw-clang-release64: .build/projects/gmake-mingw-clang - make -R -C .build/projects/gmake-mingw-clang config=release64 -mingw-clang: mingw-clang-debug32 mingw-clang-release32 mingw-clang-debug64 mingw-clang-release64 - -.build/projects/vs2017: - $(GENIE) vs2017 - -.build/projects/gmake-osx-x64: - $(GENIE) --gcc=osx-x64 gmake -osx-x64-debug: .build/projects/gmake-osx-x64 - make -C .build/projects/gmake-osx-x64 config=debug -osx-x64-release: .build/projects/gmake-osx-x64 - make -C .build/projects/gmake-osx-x64 config=release -osx-x64: osx-x64-debug osx-x64-release - -.build/projects/gmake-osx-arm64: - $(GENIE) --gcc=osx-arm64 gmake -osx-arm64-debug: .build/projects/gmake-osx-arm64 - make -C .build/projects/gmake-osx-arm64 config=debug -osx-arm64-release: .build/projects/gmake-osx-arm64 - make -C .build/projects/gmake-osx-arm64 config=release -osx-arm64: osx-arm64-debug osx-arm64-release - -.build/projects/gmake-ios-arm: - $(GENIE) --gcc=ios-arm gmake -ios-arm-debug: .build/projects/gmake-ios-arm - make -R -C .build/projects/gmake-ios-arm config=debug -ios-arm-release: .build/projects/gmake-ios-arm - make -R -C .build/projects/gmake-ios-arm config=release -ios-arm: ios-arm-debug ios-arm-release - -.build/projects/gmake-ios-simulator: - $(GENIE) --gcc=ios-simulator gmake -ios-simulator-debug: .build/projects/gmake-ios-simulator - make -R -C .build/projects/gmake-ios-simulator config=debug -ios-simulator-release: .build/projects/gmake-ios-simulator - make -R -C .build/projects/gmake-ios-simulator config=release -ios-simulator: ios-simulator-debug ios-simulator-release - -rebuild-shaders: - make -R -C examples rebuild - -analyze: - cppcheck src/ - cppcheck examples/ - -docs: - doxygen scripts/bgfx.doxygen - markdown README.md > .build/docs/readme.html - -clean: - @echo Cleaning... - -@rm -rf .build - @mkdir .build - -### - -SILENT ?= @ - -UNAME := $(shell uname) -ifeq ($(UNAME),$(filter $(UNAME),Linux GNU Darwin Haiku)) -ifeq ($(UNAME),$(filter $(UNAME),Darwin Haiku)) -ifeq ($(UNAME),$(filter $(UNAME),Darwin)) -OS=darwin -BUILD_PROJECT_DIR=gmake-osx-x64 -BUILD_OUTPUT_DIR=osx-x64 -BUILD_TOOLS_CONFIG=release -EXE= -else -OS=haiku -BUILD_PROJECT_DIR=gmake-haiku -BUILD_OUTPUT_DIR=haiku64_gcc -BUILD_TOOLS_CONFIG=release64 -EXE= -endif -else -OS=linux -BUILD_PROJECT_DIR=gmake-linux -BUILD_OUTPUT_DIR=linux64_gcc -BUILD_TOOLS_CONFIG=release64 -EXE= -endif -else -OS=windows -BUILD_PROJECT_DIR=gmake-mingw-gcc -BUILD_OUTPUT_DIR=win32_mingw-gcc -BUILD_TOOLS_CONFIG=release64 -EXE=.exe -endif - -# bin2c -.build/osx-x64/bin/bin2cRelease: .build/projects/gmake-osx-x64 - $(SILENT) make -C .build/projects/gmake-osx-x64 bin2c config=$(BUILD_TOOLS_CONFIG) - -tools/bin/darwin/bin2c: .build/osx-x64/bin/bin2cRelease - $(SILENT) cp $(<) $(@) - -.build/linux64_gcc/bin/bin2cRelease: .build/projects/gmake-linux - $(SILENT) make -C .build/projects/gmake-linux bin2c config=$(BUILD_TOOLS_CONFIG) - -tools/bin/linux/bin2c: .build/linux64_gcc/bin/bin2cRelease - $(SILENT) cp $(<) $(@) - -.build/haiku64_gcc/bin/bin2cRelease: .build/projects/gmake-haiku - $(SILENT) make -C .build/projects/gmake-haiku bin2c config=$(BUILD_TOOLS_CONFIG) - -tools/bin/haiku/bin2c: .build/haiku64_gcc/bin/bin2cRelease - $(SILENT) cp $(<) $(@) - -.build/win64_mingw-gcc/bin/bin2cRelease.exe: .build/projects/gmake-mingw-gcc - $(SILENT) make -C .build/projects/gmake-mingw-gcc bin2c config=$(BUILD_TOOLS_CONFIG) - -tools/bin/windows/bin2c.exe: .build/win64_mingw-gcc/bin/bin2cRelease.exe - $(SILENT) cp $(<) $(@) - -bin2c: tools/bin/$(OS)/bin2c$(EXE) - -# lemon -.build/osx-x64/bin/lemonRelease: .build/projects/gmake-osx-x64 - $(SILENT) make -C .build/projects/gmake-osx-x64 lemon config=$(BUILD_TOOLS_CONFIG) - -tools/bin/darwin/lemon: .build/osx-x64/bin/lemonRelease - $(SILENT) cp $(<) $(@) - -.build/linux64_gcc/bin/lemonRelease: .build/projects/gmake-linux - $(SILENT) make -C .build/projects/gmake-linux lemon config=$(BUILD_TOOLS_CONFIG) - -tools/bin/linux/lemon: .build/linux64_gcc/bin/lemonRelease - $(SILENT) cp $(<) $(@) - -.build/haiku64_gcc/bin/lemonRelease: .build/projects/gmake-haiku - $(SILENT) make -C .build/projects/gmake-haiku lemon config=$(BUILD_TOOLS_CONFIG) - -tools/bin/haiku/lemon: .build/haiku64_gcc/bin/lemonRelease - $(SILENT) cp $(<) $(@) - -.build/win64_mingw-gcc/bin/lemonRelease.exe: .build/projects/gmake-mingw-gcc - $(SILENT) make -C .build/projects/gmake-mingw-gcc lemon config=$(BUILD_TOOLS_CONFIG) - -tools/bin/windows/lemon.exe: .build/win64_mingw-gcc/bin/lemonRelease.exe - $(SILENT) cp $(<) $(@) - -tools/bin/$(OS)/lempar.c: tools/lemon/lempar.c - $(SILENT) cp $(<) $(@) - -lemon: tools/bin/$(OS)/lemon$(EXE) tools/bin/$(OS)/lempar.c - -tools: bin2c lemon - -dist: tools/bin/darwin/bin2c tools/bin/linux/bin2c tools/bin/windows/bin2c.exe tools/bin/haiku/bin2c - -.build/$(BUILD_OUTPUT_DIR)/bin/bx.testRelease$(EXE): .build/projects/$(BUILD_PROJECT_DIR) - $(SILENT) make -C .build/projects/$(BUILD_PROJECT_DIR) bx.test config=$(BUILD_TOOLS_CONFIG) - -test: .build/$(BUILD_OUTPUT_DIR)/bin/bx.testRelease$(EXE) diff --git a/scripts/genie.lua b/scripts/genie.lua index f59bb5374..e20e0d6d5 100644 --- a/scripts/genie.lua +++ b/scripts/genie.lua @@ -39,7 +39,6 @@ end dofile "bx.lua" dofile "bin2c.lua" -dofile "lemon.lua" project "bx.test" kind "ConsoleApp" diff --git a/scripts/lemon.lua b/scripts/lemon.lua deleted file mode 100644 index d7d38b0e3..000000000 --- a/scripts/lemon.lua +++ /dev/null @@ -1,22 +0,0 @@ --- --- Copyright 2010-2024 Branimir Karadzic. All rights reserved. --- License: https://github.com/bkaradzic/bx/blob/master/LICENSE --- - -project "lemon" - kind "ConsoleApp" - - files { - path.join(BX_DIR, "tools/lemon/lemon.c") - } - - configuration { "not vs*" } - buildoptions { - "-Wno-implicit-fallthrough", - "-Wno-sign-compare", - "-Wno-unused-parameter", - } - - configuration {} - - strip() diff --git a/tools/bin/darwin/lemon b/tools/bin/darwin/lemon deleted file mode 100755 index c00a276b405356e06f0dcf046c08c9dd57bbc025..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95148 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 diff --git a/tools/bin/darwin/lempar.c b/tools/bin/darwin/lempar.c deleted file mode 100644 index 5e2024fff..000000000 --- a/tools/bin/darwin/lempar.c +++ /dev/null @@ -1,981 +0,0 @@ -/* -** 2000-05-29 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** Driver template for the LEMON parser generator. -** -** The "lemon" program processes an LALR(1) input grammar file, then uses -** this template to construct a parser. The "lemon" program inserts text -** at each "%%" line. Also, any "P-a-r-s-e" identifier prefix (without the -** interstitial "-" characters) contained in this template is changed into -** the value of the %name directive from the grammar. Otherwise, the content -** of this template is copied straight through into the generate parser -** source file. -** -** The following is the concatenation of all %include directives from the -** input grammar file: -*/ -#include -/************ Begin %include sections from the grammar ************************/ -%% -/**************** End of %include directives **********************************/ -/* These constants specify the various numeric values for terminal symbols -** in a format understandable to "makeheaders". This section is blank unless -** "lemon" is run with the "-m" command-line option. -***************** Begin makeheaders token definitions *************************/ -%% -/**************** End makeheaders token definitions ***************************/ - -/* The next sections is a series of control #defines. -** various aspects of the generated parser. -** YYCODETYPE is the data type used to store the integer codes -** that represent terminal and non-terminal symbols. -** "unsigned char" is used if there are fewer than -** 256 symbols. Larger types otherwise. -** YYNOCODE is a number of type YYCODETYPE that is not used for -** any terminal or nonterminal symbol. -** YYFALLBACK If defined, this indicates that one or more tokens -** (also known as: "terminal symbols") have fall-back -** values which should be used if the original symbol -** would not parse. This permits keywords to sometimes -** be used as identifiers, for example. -** YYACTIONTYPE is the data type used for "action codes" - numbers -** that indicate what to do in response to the next -** token. -** ParseTOKENTYPE is the data type used for minor type for terminal -** symbols. Background: A "minor type" is a semantic -** value associated with a terminal or non-terminal -** symbols. For example, for an "ID" terminal symbol, -** the minor type might be the name of the identifier. -** Each non-terminal can have a different minor type. -** Terminal symbols all have the same minor type, though. -** This macros defines the minor type for terminal -** symbols. -** YYMINORTYPE is the data type used for all minor types. -** This is typically a union of many types, one of -** which is ParseTOKENTYPE. The entry in the union -** for terminal symbols is called "yy0". -** YYSTACKDEPTH is the maximum depth of the parser's stack. If -** zero the stack is dynamically sized using realloc() -** ParseARG_SDECL A static variable declaration for the %extra_argument -** ParseARG_PDECL A parameter declaration for the %extra_argument -** ParseARG_STORE Code to store %extra_argument into yypParser -** ParseARG_FETCH Code to extract %extra_argument from yypParser -** YYERRORSYMBOL is the code number of the error symbol. If not -** defined, then do no error processing. -** YYNSTATE the combined number of states. -** YYNRULE the number of rules in the grammar -** YY_MAX_SHIFT Maximum value for shift actions -** YY_MIN_SHIFTREDUCE Minimum value for shift-reduce actions -** YY_MAX_SHIFTREDUCE Maximum value for shift-reduce actions -** YY_MIN_REDUCE Minimum value for reduce actions -** YY_MAX_REDUCE Maximum value for reduce actions -** YY_ERROR_ACTION The yy_action[] code for syntax error -** YY_ACCEPT_ACTION The yy_action[] code for accept -** YY_NO_ACTION The yy_action[] code for no-op -*/ -#ifndef INTERFACE -# define INTERFACE 1 -#endif -/************* Begin control #defines *****************************************/ -%% -/************* End control #defines *******************************************/ - -/* Define the yytestcase() macro to be a no-op if is not already defined -** otherwise. -** -** Applications can choose to define yytestcase() in the %include section -** to a macro that can assist in verifying code coverage. For production -** code the yytestcase() macro should be turned off. But it is useful -** for testing. -*/ -#ifndef yytestcase -# define yytestcase(X) -#endif - - -/* Next are the tables used to determine what action to take based on the -** current state and lookahead token. These tables are used to implement -** functions that take a state number and lookahead value and return an -** action integer. -** -** Suppose the action integer is N. Then the action is determined as -** follows -** -** 0 <= N <= YY_MAX_SHIFT Shift N. That is, push the lookahead -** token onto the stack and goto state N. -** -** N between YY_MIN_SHIFTREDUCE Shift to an arbitrary state then -** and YY_MAX_SHIFTREDUCE reduce by rule N-YY_MIN_SHIFTREDUCE. -** -** N between YY_MIN_REDUCE Reduce by rule N-YY_MIN_REDUCE -** and YY_MAX_REDUCE -** -** N == YY_ERROR_ACTION A syntax error has occurred. -** -** N == YY_ACCEPT_ACTION The parser accepts its input. -** -** N == YY_NO_ACTION No such action. Denotes unused -** slots in the yy_action[] table. -** -** The action table is constructed as a single large table named yy_action[]. -** Given state S and lookahead X, the action is computed as either: -** -** (A) N = yy_action[ yy_shift_ofst[S] + X ] -** (B) N = yy_default[S] -** -** The (A) formula is preferred. The B formula is used instead if: -** (1) The yy_shift_ofst[S]+X value is out of range, or -** (2) yy_lookahead[yy_shift_ofst[S]+X] is not equal to X, or -** (3) yy_shift_ofst[S] equal YY_SHIFT_USE_DFLT. -** (Implementation note: YY_SHIFT_USE_DFLT is chosen so that -** YY_SHIFT_USE_DFLT+X will be out of range for all possible lookaheads X. -** Hence only tests (1) and (2) need to be evaluated.) -** -** The formulas above are for computing the action when the lookahead is -** a terminal symbol. If the lookahead is a non-terminal (as occurs after -** a reduce action) then the yy_reduce_ofst[] array is used in place of -** the yy_shift_ofst[] array and YY_REDUCE_USE_DFLT is used in place of -** YY_SHIFT_USE_DFLT. -** -** The following are the tables generated in this section: -** -** yy_action[] A single table containing all actions. -** yy_lookahead[] A table containing the lookahead for each entry in -** yy_action. Used to detect hash collisions. -** yy_shift_ofst[] For each state, the offset into yy_action for -** shifting terminals. -** yy_reduce_ofst[] For each state, the offset into yy_action for -** shifting non-terminals after a reduce. -** yy_default[] Default action for each state. -** -*********** Begin parsing tables **********************************************/ -%% -/********** End of lemon-generated parsing tables *****************************/ - -/* The next table maps tokens (terminal symbols) into fallback tokens. -** If a construct like the following: -** -** %fallback ID X Y Z. -** -** appears in the grammar, then ID becomes a fallback token for X, Y, -** and Z. Whenever one of the tokens X, Y, or Z is input to the parser -** but it does not parse, the type of the token is changed to ID and -** the parse is retried before an error is thrown. -** -** This feature can be used, for example, to cause some keywords in a language -** to revert to identifiers if they keyword does not apply in the context where -** it appears. -*/ -#ifdef YYFALLBACK -static const YYCODETYPE yyFallback[] = { -%% -}; -#endif /* YYFALLBACK */ - -/* The following structure represents a single element of the -** parser's stack. Information stored includes: -** -** + The state number for the parser at this level of the stack. -** -** + The value of the token stored at this level of the stack. -** (In other words, the "major" token.) -** -** + The semantic value stored at this level of the stack. This is -** the information used by the action routines in the grammar. -** It is sometimes called the "minor" token. -** -** After the "shift" half of a SHIFTREDUCE action, the stateno field -** actually contains the reduce action for the second half of the -** SHIFTREDUCE. -*/ -struct yyStackEntry { - YYACTIONTYPE stateno; /* The state-number, or reduce action in SHIFTREDUCE */ - YYCODETYPE major; /* The major token value. This is the code - ** number for the token at this stack level */ - YYMINORTYPE minor; /* The user-supplied minor token value. This - ** is the value of the token */ -}; -typedef struct yyStackEntry yyStackEntry; - -/* The state of the parser is completely contained in an instance of -** the following structure */ -struct yyParser { - yyStackEntry *yytos; /* Pointer to top element of the stack */ -#ifdef YYTRACKMAXSTACKDEPTH - int yyhwm; /* High-water mark of the stack */ -#endif -#ifndef YYNOERRORRECOVERY - int yyerrcnt; /* Shifts left before out of the error */ -#endif - ParseARG_SDECL /* A place to hold %extra_argument */ -#if YYSTACKDEPTH<=0 - int yystksz; /* Current side of the stack */ - yyStackEntry *yystack; /* The parser's stack */ - yyStackEntry yystk0; /* First stack entry */ -#else - yyStackEntry yystack[YYSTACKDEPTH]; /* The parser's stack */ - yyStackEntry *yystackEnd; /* Last entry in the stack */ -#endif -}; -typedef struct yyParser yyParser; - -#ifndef NDEBUG -#include -static FILE *yyTraceFILE = 0; -static char *yyTracePrompt = 0; -#endif /* NDEBUG */ - -#ifndef NDEBUG -/* -** Turn parser tracing on by giving a stream to which to write the trace -** and a prompt to preface each trace message. Tracing is turned off -** by making either argument NULL -** -** Inputs: -**
    -**
  • A FILE* to which trace output should be written. -** If NULL, then tracing is turned off. -**
  • A prefix string written at the beginning of every -** line of trace output. If NULL, then tracing is -** turned off. -**
-** -** Outputs: -** None. -*/ -void ParseTrace(FILE *TraceFILE, char *zTracePrompt){ - yyTraceFILE = TraceFILE; - yyTracePrompt = zTracePrompt; - if( yyTraceFILE==0 ) yyTracePrompt = 0; - else if( yyTracePrompt==0 ) yyTraceFILE = 0; -} -#endif /* NDEBUG */ - -#ifndef NDEBUG -/* For tracing shifts, the names of all terminals and nonterminals -** are required. The following table supplies these names */ -static const char *const yyTokenName[] = { -%% -}; -#endif /* NDEBUG */ - -#ifndef NDEBUG -/* For tracing reduce actions, the names of all rules are required. -*/ -static const char *const yyRuleName[] = { -%% -}; -#endif /* NDEBUG */ - - -#if YYSTACKDEPTH<=0 -/* -** Try to increase the size of the parser stack. Return the number -** of errors. Return 0 on success. -*/ -static int yyGrowStack(yyParser *p){ - int newSize; - int idx; - yyStackEntry *pNew; - - newSize = p->yystksz*2 + 100; - idx = p->yytos ? (int)(p->yytos - p->yystack) : 0; - if( p->yystack==&p->yystk0 ){ - pNew = malloc(newSize*sizeof(pNew[0])); - if( pNew ) pNew[0] = p->yystk0; - }else{ - pNew = realloc(p->yystack, newSize*sizeof(pNew[0])); - } - if( pNew ){ - p->yystack = pNew; - p->yytos = &p->yystack[idx]; -#ifndef NDEBUG - if( yyTraceFILE ){ - fprintf(yyTraceFILE,"%sStack grows from %d to %d entries.\n", - yyTracePrompt, p->yystksz, newSize); - } -#endif - p->yystksz = newSize; - } - return pNew==0; -} -#endif - -/* Datatype of the argument to the memory allocated passed as the -** second argument to ParseAlloc() below. This can be changed by -** putting an appropriate #define in the %include section of the input -** grammar. -*/ -#ifndef YYMALLOCARGTYPE -# define YYMALLOCARGTYPE size_t -#endif - -/* Initialize a new parser that has already been allocated. -*/ -void ParseInit(void *yypParser){ - yyParser *pParser = (yyParser*)yypParser; -#ifdef YYTRACKMAXSTACKDEPTH - pParser->yyhwm = 0; -#endif -#if YYSTACKDEPTH<=0 - pParser->yytos = NULL; - pParser->yystack = NULL; - pParser->yystksz = 0; - if( yyGrowStack(pParser) ){ - pParser->yystack = &pParser->yystk0; - pParser->yystksz = 1; - } -#endif -#ifndef YYNOERRORRECOVERY - pParser->yyerrcnt = -1; -#endif - pParser->yytos = pParser->yystack; - pParser->yystack[0].stateno = 0; - pParser->yystack[0].major = 0; -#if YYSTACKDEPTH>0 - pParser->yystackEnd = &pParser->yystack[YYSTACKDEPTH-1]; -#endif -} - -#ifndef Parse_ENGINEALWAYSONSTACK -/* -** This function allocates a new parser. -** The only argument is a pointer to a function which works like -** malloc. -** -** Inputs: -** A pointer to the function used to allocate memory. -** -** Outputs: -** A pointer to a parser. This pointer is used in subsequent calls -** to Parse and ParseFree. -*/ -void *ParseAlloc(void *(*mallocProc)(YYMALLOCARGTYPE)){ - yyParser *pParser; - pParser = (yyParser*)(*mallocProc)( (YYMALLOCARGTYPE)sizeof(yyParser) ); - if( pParser ) ParseInit(pParser); - return pParser; -} -#endif /* Parse_ENGINEALWAYSONSTACK */ - - -/* The following function deletes the "minor type" or semantic value -** associated with a symbol. The symbol can be either a terminal -** or nonterminal. "yymajor" is the symbol code, and "yypminor" is -** a pointer to the value to be deleted. The code used to do the -** deletions is derived from the %destructor and/or %token_destructor -** directives of the input grammar. -*/ -static void yy_destructor( - yyParser *yypParser, /* The parser */ - YYCODETYPE yymajor, /* Type code for object to destroy */ - YYMINORTYPE *yypminor /* The object to be destroyed */ -){ - ParseARG_FETCH; - switch( yymajor ){ - /* Here is inserted the actions which take place when a - ** terminal or non-terminal is destroyed. This can happen - ** when the symbol is popped from the stack during a - ** reduce or during error processing or when a parser is - ** being destroyed before it is finished parsing. - ** - ** Note: during a reduce, the only symbols destroyed are those - ** which appear on the RHS of the rule, but which are *not* used - ** inside the C code. - */ -/********* Begin destructor definitions ***************************************/ -%% -/********* End destructor definitions *****************************************/ - default: break; /* If no destructor action specified: do nothing */ - } -} - -/* -** Pop the parser's stack once. -** -** If there is a destructor routine associated with the token which -** is popped from the stack, then call it. -*/ -static void yy_pop_parser_stack(yyParser *pParser){ - yyStackEntry *yytos; - assert( pParser->yytos!=0 ); - assert( pParser->yytos > pParser->yystack ); - yytos = pParser->yytos--; -#ifndef NDEBUG - if( yyTraceFILE ){ - fprintf(yyTraceFILE,"%sPopping %s\n", - yyTracePrompt, - yyTokenName[yytos->major]); - } -#endif - yy_destructor(pParser, yytos->major, &yytos->minor); -} - -/* -** Clear all secondary memory allocations from the parser -*/ -void ParseFinalize(void *p){ - yyParser *pParser = (yyParser*)p; - while( pParser->yytos>pParser->yystack ) yy_pop_parser_stack(pParser); -#if YYSTACKDEPTH<=0 - if( pParser->yystack!=&pParser->yystk0 ) free(pParser->yystack); -#endif -} - -#ifndef Parse_ENGINEALWAYSONSTACK -/* -** Deallocate and destroy a parser. Destructors are called for -** all stack elements before shutting the parser down. -** -** If the YYPARSEFREENEVERNULL macro exists (for example because it -** is defined in a %include section of the input grammar) then it is -** assumed that the input pointer is never NULL. -*/ -void ParseFree( - void *p, /* The parser to be deleted */ - void (*freeProc)(void*) /* Function used to reclaim memory */ -){ -#ifndef YYPARSEFREENEVERNULL - if( p==0 ) return; -#endif - ParseFinalize(p); - (*freeProc)(p); -} -#endif /* Parse_ENGINEALWAYSONSTACK */ - -/* -** Return the peak depth of the stack for a parser. -*/ -#ifdef YYTRACKMAXSTACKDEPTH -int ParseStackPeak(void *p){ - yyParser *pParser = (yyParser*)p; - return pParser->yyhwm; -} -#endif - -/* -** Find the appropriate action for a parser given the terminal -** look-ahead token iLookAhead. -*/ -static unsigned int yy_find_shift_action( - yyParser *pParser, /* The parser */ - YYCODETYPE iLookAhead /* The look-ahead token */ -){ - int i; - int stateno = pParser->yytos->stateno; - - if( stateno>=YY_MIN_REDUCE ) return stateno; - assert( stateno <= YY_SHIFT_COUNT ); - do{ - i = yy_shift_ofst[stateno]; - assert( iLookAhead!=YYNOCODE ); - i += iLookAhead; - if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){ -#ifdef YYFALLBACK - YYCODETYPE iFallback; /* Fallback token */ - if( iLookAhead %s\n", - yyTracePrompt, yyTokenName[iLookAhead], yyTokenName[iFallback]); - } -#endif - assert( yyFallback[iFallback]==0 ); /* Fallback loop must terminate */ - iLookAhead = iFallback; - continue; - } -#endif -#ifdef YYWILDCARD - { - int j = i - iLookAhead + YYWILDCARD; - if( -#if YY_SHIFT_MIN+YYWILDCARD<0 - j>=0 && -#endif -#if YY_SHIFT_MAX+YYWILDCARD>=YY_ACTTAB_COUNT - j0 - ){ -#ifndef NDEBUG - if( yyTraceFILE ){ - fprintf(yyTraceFILE, "%sWILDCARD %s => %s\n", - yyTracePrompt, yyTokenName[iLookAhead], - yyTokenName[YYWILDCARD]); - } -#endif /* NDEBUG */ - return yy_action[j]; - } - } -#endif /* YYWILDCARD */ - return yy_default[stateno]; - }else{ - return yy_action[i]; - } - }while(1); -} - -/* -** Find the appropriate action for a parser given the non-terminal -** look-ahead token iLookAhead. -*/ -static int yy_find_reduce_action( - int stateno, /* Current state number */ - YYCODETYPE iLookAhead /* The look-ahead token */ -){ - int i; -#ifdef YYERRORSYMBOL - if( stateno>YY_REDUCE_COUNT ){ - return yy_default[stateno]; - } -#else - assert( stateno<=YY_REDUCE_COUNT ); -#endif - i = yy_reduce_ofst[stateno]; - assert( i!=YY_REDUCE_USE_DFLT ); - assert( iLookAhead!=YYNOCODE ); - i += iLookAhead; -#ifdef YYERRORSYMBOL - if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){ - return yy_default[stateno]; - } -#else - assert( i>=0 && iyytos>yypParser->yystack ) yy_pop_parser_stack(yypParser); - /* Here code is inserted which will execute if the parser - ** stack every overflows */ -/******** Begin %stack_overflow code ******************************************/ -%% -/******** End %stack_overflow code ********************************************/ - ParseARG_STORE; /* Suppress warning about unused %extra_argument var */ -} - -/* -** Print tracing information for a SHIFT action -*/ -#ifndef NDEBUG -static void yyTraceShift(yyParser *yypParser, int yyNewState){ - if( yyTraceFILE ){ - if( yyNewStateyytos->major], - yyNewState); - }else{ - fprintf(yyTraceFILE,"%sShift '%s'\n", - yyTracePrompt,yyTokenName[yypParser->yytos->major]); - } - } -} -#else -# define yyTraceShift(X,Y) -#endif - -/* -** Perform a shift action. -*/ -static void yy_shift( - yyParser *yypParser, /* The parser to be shifted */ - int yyNewState, /* The new state to shift in */ - int yyMajor, /* The major token to shift in */ - ParseTOKENTYPE yyMinor /* The minor token to shift in */ -){ - yyStackEntry *yytos; - yypParser->yytos++; -#ifdef YYTRACKMAXSTACKDEPTH - if( (int)(yypParser->yytos - yypParser->yystack)>yypParser->yyhwm ){ - yypParser->yyhwm++; - assert( yypParser->yyhwm == (int)(yypParser->yytos - yypParser->yystack) ); - } -#endif -#if YYSTACKDEPTH>0 - if( yypParser->yytos>yypParser->yystackEnd ){ - yypParser->yytos--; - yyStackOverflow(yypParser); - return; - } -#else - if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz] ){ - if( yyGrowStack(yypParser) ){ - yypParser->yytos--; - yyStackOverflow(yypParser); - return; - } - } -#endif - if( yyNewState > YY_MAX_SHIFT ){ - yyNewState += YY_MIN_REDUCE - YY_MIN_SHIFTREDUCE; - } - yytos = yypParser->yytos; - yytos->stateno = (YYACTIONTYPE)yyNewState; - yytos->major = (YYCODETYPE)yyMajor; - yytos->minor.yy0 = yyMinor; - yyTraceShift(yypParser, yyNewState); -} - -/* The following table contains information about every rule that -** is used during the reduce. -*/ -static const struct { - YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */ - signed char nrhs; /* Negative of the number of RHS symbols in the rule */ -} yyRuleInfo[] = { -%% -}; - -static void yy_accept(yyParser*); /* Forward Declaration */ - -/* -** Perform a reduce action and the shift that must immediately -** follow the reduce. -** -** The yyLookahead and yyLookaheadToken parameters provide reduce actions -** access to the lookahead token (if any). The yyLookahead will be YYNOCODE -** if the lookahead token has already been consumed. As this procedure is -** only called from one place, optimizing compilers will in-line it, which -** means that the extra parameters have no performance impact. -*/ -static void yy_reduce( - yyParser *yypParser, /* The parser */ - unsigned int yyruleno, /* Number of the rule by which to reduce */ - int yyLookahead, /* Lookahead token, or YYNOCODE if none */ - ParseTOKENTYPE yyLookaheadToken /* Value of the lookahead token */ -){ - int yygoto; /* The next state */ - int yyact; /* The next action */ - yyStackEntry *yymsp; /* The top of the parser's stack */ - int yysize; /* Amount to pop the stack */ - ParseARG_FETCH; - yymsp = yypParser->yytos; -#ifndef NDEBUG - if( yyTraceFILE && yyruleno<(int)(sizeof(yyRuleName)/sizeof(yyRuleName[0])) ){ - yysize = yyRuleInfo[yyruleno].nrhs; - fprintf(yyTraceFILE, "%sReduce [%s], go to state %d.\n", yyTracePrompt, - yyRuleName[yyruleno], yymsp[yysize].stateno); - } -#endif /* NDEBUG */ - - /* Check that the stack is large enough to grow by a single entry - ** if the RHS of the rule is empty. This ensures that there is room - ** enough on the stack to push the LHS value */ - if( yyRuleInfo[yyruleno].nrhs==0 ){ -#ifdef YYTRACKMAXSTACKDEPTH - if( (int)(yypParser->yytos - yypParser->yystack)>yypParser->yyhwm ){ - yypParser->yyhwm++; - assert( yypParser->yyhwm == (int)(yypParser->yytos - yypParser->yystack)); - } -#endif -#if YYSTACKDEPTH>0 - if( yypParser->yytos>=yypParser->yystackEnd ){ - yyStackOverflow(yypParser); - return; - } -#else - if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz-1] ){ - if( yyGrowStack(yypParser) ){ - yyStackOverflow(yypParser); - return; - } - yymsp = yypParser->yytos; - } -#endif - } - - switch( yyruleno ){ - /* Beginning here are the reduction cases. A typical example - ** follows: - ** case 0: - ** #line - ** { ... } // User supplied code - ** #line - ** break; - */ -/********** Begin reduce actions **********************************************/ -%% -/********** End reduce actions ************************************************/ - }; - assert( yyrulenoYY_MAX_SHIFT && yyact<=YY_MAX_SHIFTREDUCE) ); - - /* It is not possible for a REDUCE to be followed by an error */ - assert( yyact!=YY_ERROR_ACTION ); - - if( yyact==YY_ACCEPT_ACTION ){ - yypParser->yytos += yysize; - yy_accept(yypParser); - }else{ - yymsp += yysize+1; - yypParser->yytos = yymsp; - yymsp->stateno = (YYACTIONTYPE)yyact; - yymsp->major = (YYCODETYPE)yygoto; - yyTraceShift(yypParser, yyact); - } -} - -/* -** The following code executes when the parse fails -*/ -#ifndef YYNOERRORRECOVERY -static void yy_parse_failed( - yyParser *yypParser /* The parser */ -){ - ParseARG_FETCH; -#ifndef NDEBUG - if( yyTraceFILE ){ - fprintf(yyTraceFILE,"%sFail!\n",yyTracePrompt); - } -#endif - while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser); - /* Here code is inserted which will be executed whenever the - ** parser fails */ -/************ Begin %parse_failure code ***************************************/ -%% -/************ End %parse_failure code *****************************************/ - ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */ -} -#endif /* YYNOERRORRECOVERY */ - -/* -** The following code executes when a syntax error first occurs. -*/ -static void yy_syntax_error( - yyParser *yypParser, /* The parser */ - int yymajor, /* The major type of the error token */ - ParseTOKENTYPE yyminor /* The minor type of the error token */ -){ - ParseARG_FETCH; -#define TOKEN yyminor -/************ Begin %syntax_error code ****************************************/ -%% -/************ End %syntax_error code ******************************************/ - ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */ -} - -/* -** The following is executed when the parser accepts -*/ -static void yy_accept( - yyParser *yypParser /* The parser */ -){ - ParseARG_FETCH; -#ifndef NDEBUG - if( yyTraceFILE ){ - fprintf(yyTraceFILE,"%sAccept!\n",yyTracePrompt); - } -#endif -#ifndef YYNOERRORRECOVERY - yypParser->yyerrcnt = -1; -#endif - assert( yypParser->yytos==yypParser->yystack ); - /* Here code is inserted which will be executed whenever the - ** parser accepts */ -/*********** Begin %parse_accept code *****************************************/ -%% -/*********** End %parse_accept code *******************************************/ - ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */ -} - -/* The main parser program. -** The first argument is a pointer to a structure obtained from -** "ParseAlloc" which describes the current state of the parser. -** The second argument is the major token number. The third is -** the minor token. The fourth optional argument is whatever the -** user wants (and specified in the grammar) and is available for -** use by the action routines. -** -** Inputs: -**
    -**
  • A pointer to the parser (an opaque structure.) -**
  • The major token number. -**
  • The minor token number. -**
  • An option argument of a grammar-specified type. -**
-** -** Outputs: -** None. -*/ -void Parse( - void *yyp, /* The parser */ - int yymajor, /* The major token code number */ - ParseTOKENTYPE yyminor /* The value for the token */ - ParseARG_PDECL /* Optional %extra_argument parameter */ -){ - YYMINORTYPE yyminorunion; - unsigned int yyact; /* The parser action. */ -#if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY) - int yyendofinput; /* True if we are at the end of input */ -#endif -#ifdef YYERRORSYMBOL - int yyerrorhit = 0; /* True if yymajor has invoked an error */ -#endif - yyParser *yypParser; /* The parser */ - - yypParser = (yyParser*)yyp; - assert( yypParser->yytos!=0 ); -#if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY) - yyendofinput = (yymajor==0); -#endif - ParseARG_STORE; - -#ifndef NDEBUG - if( yyTraceFILE ){ - fprintf(yyTraceFILE,"%sInput '%s'\n",yyTracePrompt,yyTokenName[yymajor]); - } -#endif - - do{ - yyact = yy_find_shift_action(yypParser,(YYCODETYPE)yymajor); - if( yyact <= YY_MAX_SHIFTREDUCE ){ - yy_shift(yypParser,yyact,yymajor,yyminor); -#ifndef YYNOERRORRECOVERY - yypParser->yyerrcnt--; -#endif - yymajor = YYNOCODE; - }else if( yyact <= YY_MAX_REDUCE ){ - yy_reduce(yypParser,yyact-YY_MIN_REDUCE,yymajor,yyminor); - }else{ - assert( yyact == YY_ERROR_ACTION ); - yyminorunion.yy0 = yyminor; -#ifdef YYERRORSYMBOL - int yymx; -#endif -#ifndef NDEBUG - if( yyTraceFILE ){ - fprintf(yyTraceFILE,"%sSyntax Error!\n",yyTracePrompt); - } -#endif -#ifdef YYERRORSYMBOL - /* A syntax error has occurred. - ** The response to an error depends upon whether or not the - ** grammar defines an error token "ERROR". - ** - ** This is what we do if the grammar does define ERROR: - ** - ** * Call the %syntax_error function. - ** - ** * Begin popping the stack until we enter a state where - ** it is legal to shift the error symbol, then shift - ** the error symbol. - ** - ** * Set the error count to three. - ** - ** * Begin accepting and shifting new tokens. No new error - ** processing will occur until three tokens have been - ** shifted successfully. - ** - */ - if( yypParser->yyerrcnt<0 ){ - yy_syntax_error(yypParser,yymajor,yyminor); - } - yymx = yypParser->yytos->major; - if( yymx==YYERRORSYMBOL || yyerrorhit ){ -#ifndef NDEBUG - if( yyTraceFILE ){ - fprintf(yyTraceFILE,"%sDiscard input token %s\n", - yyTracePrompt,yyTokenName[yymajor]); - } -#endif - yy_destructor(yypParser, (YYCODETYPE)yymajor, &yyminorunion); - yymajor = YYNOCODE; - }else{ - while( yypParser->yytos >= yypParser->yystack - && yymx != YYERRORSYMBOL - && (yyact = yy_find_reduce_action( - yypParser->yytos->stateno, - YYERRORSYMBOL)) >= YY_MIN_REDUCE - ){ - yy_pop_parser_stack(yypParser); - } - if( yypParser->yytos < yypParser->yystack || yymajor==0 ){ - yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); - yy_parse_failed(yypParser); -#ifndef YYNOERRORRECOVERY - yypParser->yyerrcnt = -1; -#endif - yymajor = YYNOCODE; - }else if( yymx!=YYERRORSYMBOL ){ - yy_shift(yypParser,yyact,YYERRORSYMBOL,yyminor); - } - } - yypParser->yyerrcnt = 3; - yyerrorhit = 1; -#elif defined(YYNOERRORRECOVERY) - /* If the YYNOERRORRECOVERY macro is defined, then do not attempt to - ** do any kind of error recovery. Instead, simply invoke the syntax - ** error routine and continue going as if nothing had happened. - ** - ** Applications can set this macro (for example inside %include) if - ** they intend to abandon the parse upon the first syntax error seen. - */ - yy_syntax_error(yypParser,yymajor, yyminor); - yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); - yymajor = YYNOCODE; - -#else /* YYERRORSYMBOL is not defined */ - /* This is what we do if the grammar does not define ERROR: - ** - ** * Report an error message, and throw away the input token. - ** - ** * If the input token is $, then fail the parse. - ** - ** As before, subsequent error messages are suppressed until - ** three input tokens have been successfully shifted. - */ - if( yypParser->yyerrcnt<=0 ){ - yy_syntax_error(yypParser,yymajor, yyminor); - } - yypParser->yyerrcnt = 3; - yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); - if( yyendofinput ){ - yy_parse_failed(yypParser); -#ifndef YYNOERRORRECOVERY - yypParser->yyerrcnt = -1; -#endif - } - yymajor = YYNOCODE; -#endif - } - }while( yymajor!=YYNOCODE && yypParser->yytos>yypParser->yystack ); -#ifndef NDEBUG - if( yyTraceFILE ){ - yyStackEntry *i; - char cDiv = '['; - fprintf(yyTraceFILE,"%sReturn. Stack=",yyTracePrompt); - for(i=&yypParser->yystack[1]; i<=yypParser->yytos; i++){ - fprintf(yyTraceFILE,"%c%s", cDiv, yyTokenName[i->major]); - cDiv = ' '; - } - fprintf(yyTraceFILE,"]\n"); - } -#endif - return; -} diff --git a/tools/bin/linux/lemon b/tools/bin/linux/lemon deleted file mode 100755 index 6c5e3bdcdff95706ff9a0bd4a7dd8c689415fed1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84728 zcmeFadwf*Y)%ZP=i;NmPL5V~~8+EXWh!O>x5u!OTkuxw6R8U$kU;~I11z|=(xdbP% z9FGTStF3)}Y^~O(w$-XtDc&IAl7Lr0MHCghV9yv3M1_b--tXGyoXKRA=ly+tf4qOZ zpH3??d+oK?UVH7e*Is+=OBU3|&(8}61O6vJaBe_S>rZnbHD1QD;axa2fvP~yKuzHI zK;OV29CmvieA3i9dxJ+aD#`rp~*L^ex?y7)`t-M@D$W{|TW z$;abU#3i8ny>j<^<^1p6UiJRBFHhl7{;TrjnfqNvo_xyGzkxt*x$$1P-0!G|?|(}j z^0|0>V$%OjePg_GOHT0Qk@Nk$$A|yz*LNZ1d{Ma^{O|vI;tX8m*LRS9nBmpue|zE$ zoH6a1pPxPGjA@ewOuOd#^ntIi&9_Mp>eO+WoiRk83Tbx1dkxL{m>erpz(M^5!c zZ!azRw?4Zzed!sGZmc`w+`j!zzpwurul;(LPebYy9QjCjZ^)>${O-?xf}`3WTqy87 zfyofvF!|N%B6}=2AYj@W?^nUmXPgvxC5;KYplPPaFhp9t1x9An?B*1TJd*L-i&P zf`7|F;DZlB=aGZppLG!U|3IgVyxh-J06)a%zYYRla}fCN4g$aEAn?Nv0zdsA?LGb= z_@xJdI|qT^cM$l~2a(T`gW$h>5O~=^`0oY$B+BG|J^;`waBQIAA`tla_CJ7~s~59& zc3{GU88ffBJ~3rN{nTp%lV@L(2uztiWAgQZS&5m~*Ize7zGv1?of(*tm^^J7*s~H> z)n6;f6Q*2s&9uObWTJlRRWk!KCto#f+Vpz9Z@T9CNm42?-TRsrm~!>xM7{cVR-oR+ z17RAqTsQf;S(6ij&i?~bW=)=aEp<%EVrh!h5RiXo33mOAIe{tl)27dw9JtPZhj3*WU=iNt0(n@TQs9Bqj%@z@1`78Zu$RjoI{Xm^FQ70$}~@t0qjj z=K8CqU32qfX=WA+SJl@~o;6FD6oE{bAi@(l%uGzU?y7697xI$>BjT}P!zY}1`dOJ@ zm4h-ryMCQ@de`qWPahnZ5F1-J0bVCxea)=IAb*v((>{BBws%tAK=38 z@%$hkKEs0t#<&H2xSyVy1OM9dacAVfo4xTcI|sh(SeNdi9Qg0^UHFn5_){L8dvf5L zJvtBP!0!#YbRN%vFR66fyDSHOpNGFT2fp|am(J!Kc;Gk}?&QFq_UP=+fiLs;@5q5y zd2~V-y7YWG|I4FOngbv2;g{#YpYiYq=D;8J>aEIwFY)LYIq=avTt3F+z@PW%jL(5D z^XN>?fj{T*Gdl;q*~4Fy1AoE8Uy=hKFN)9So*Z~_Ul;yx4t#}2=kXl)BOd?Da^N){ zowYge8J-@l&w)Sg(b=2>pX$+Za^S7rxY(To|FcJ@BL}|7qZ9J-eSLV_)5GE%_-Zd* zngeg~xykz@DjI5 z^{Y|euFeJpv~vfvo*%*V-sAC`dz0=u)|;*0s8 zjx2bQ50r0DZo&%_OXd^Gf*+BAGUsH$wJdmP7Tlk!B)cpN-YW~gJPV%frw+`5d!YqY zswxXE>pcHclLbH82l8!X!TV&v$7I39$Miqrv*5@0K)xqt!H>;?PtAg7F9v61!Ns@r zKeMyoC-^|V8?xX(%7QP-f|q5%mt?_D%!1#O1<&?J@6UqE+R^_!oCOd2K)xT(g7?dU zFUx|Tk_B(hf|qB(*Ji;hvf%5p;HPH6|MT-d68Mh<{v(0^NZ>yb_>TnsBZ2=&;6D=h zj|BcBf𝔞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≤rvlZ&9(RSNd^~T)F1r#!`ht z=)thY5439;`O|nFPR_?n3y1viOY9p$vz4+IIg6#VyOp8No^kB#{o(f9v$1QP&JA$j zAFY_xMZ2cPFbl$6^!gh^P7CuM5kW2qk7!LVN#|SF84U9zmw4dTJ#MHqK0%K2EM$pE zVp!pXo6LKoHNmpPah@IsI4GKz$x7~!qsnsMQO&MC-lDNT!DjKORx8fQ(y@a(+3e!# z-O{l=Iw3g*k|((Sr4tmN{|z)ZJ2&}BJlH|NLHI*pGbXB&BAdVxyL$?9p;S{V>9*Q2 zuq_TE7pE>ql1(87rYeW692&Q#j^X~r=MBo{#+(uXkx+`fWvyQiRabA5ulysM~^nU8FN94(d6+1Ms$h*mHbQh~@bN}M!mswvYqot$_P|Dz*4SWPbs zKt4Q+7*=l-nEIHs(KYX2!+sL8FU2pHlX{J>fU4~NwatUY5CnH?%V&0ymHez9y}O`t zqrMOC;Z3#s6=he=9@Ns_SJ{UHPUufcI~tcj1h+L*8`(Z-$ z+W@JR1@^+u0|yT5+i>FAehqvQX|uKEv*N!tG{8Z$mG?mM3@y6JYzed&sdw_@75ia_ zRl2hWsl?1fWW!k$_;V_&Y+iy6_wKQ%Hii-l^#Y_xbTXA z>`@j-Wc$C#R;bROz>#j$VLiPUT;6*qNWaaGjLA9h$BfBo`Y)ovgaP`$%C@tXRbT5o z>Z^s8+I4gK^NY5=22}lpj&AOQyFZk5MveO)3wLzDe%$)Ydezw6NPlD4AzOxI;oGoI z$bvDw%?z>@x2_ z*-wQ77}W)}?LSj?N^XIe``D;uTb?@P=7C`quoWSjv_}(KRR^?oIo2OkRHC1rYQtGs z6N*M|DWA`KxMNv;NO(lzKO?}Q_T=Bx6=gZuRsw`?bB$xs1}T#~H1!?6GJ$gHc}^A( zZX4VGTQw@rYvZ)7D*4Y_q{*2!{tx8bsUb06TBob#se`5L1+SYM2+SYs&XY`919kcH z0leR^N9h6fm2pDoSkEA_p9YXtXj_*B8=Jb%=hIjJ`IDt>ryKbP@K;?}@g>&8%Y$gFbBUM>ow zm$6ChUMX10NosENtV!M-tN)7N&P#YW>ZMoS<#QI_D?@5Hhrc;tAS(jho{j7d=aiV) z;ng>2gLw%j3e@FmgNxTYqvr6wI)4*l{;9G0-MT&I02i-QpXC`9o7#IWAx|FDH@FbW zU$E%iVqGL#LTO*>>=zK9jky+vSBZU8y9>yRtkA8Ll^C01;B~sqH zs5o6fLi!_WZcKNO>(4*Dmzj35(-kiYrHcLLg##5Sc_&d}xcbGcV!i^%6PMPMlKi#& zDW!@IN=X7RgPnK5~-_R%*J% zhqy>O6ovwcyj4rQd!bGLMT@zo3E17WRQE!~KrJr=)BST10fm%xFLa{!ry{VHIrl;z zy2ra0Du#s*Jh=0-@SA0i-RGVk154df)0X$(EfVqE`-+pqInOPgob95^WS+MBT5J?7 z$GK1L)R{|S*u7#L;t)D};$~)P9+W&?)|Wr2Gk3Kg&iOjtHIdz!AIGfo*i3WcbRCw_ zk%&YxvQLs5)?+Dvst^bOwd_Q|KD#{bJ*Rih+TAe+p zO$y5BK2od`zd2!S?o&i$n0l9Daj>0}AfrktV?cxuV^G5hov(SuAZ}k?lP?dAERik1 z5Z5tSL2}K{edp6KUzO8eicfne`om*?LzijGS87X-4t9uN9X-*Z>70Bko?>X%w-As` z93A6!xk|}DFY<%{4}eT-;r=1F`g9(_>lKX4o187Bb&+?Hi{#E8w+d)f^u%`Ow%@Xj zifPwx5^my%yhu`QwD*08tklf{9xXxUPyvB1O(z+|qQ`M_cRGoXDz~KNeJm*-wWoHf zyKEWzE`M8xKEH)aqhrO#XVzzzWv&_zTH`Z_hKQegUQV@FZayySy7_nnPjj5OUUstl zn~z6k&ed>Pi$mo*6KBZn9m9N|Rj$)PYtShI>*|F?HQtElUv>om9;I>ZFxI*ZJa2!o za5!!VT5g_-uYR__I3;1^>{#CG~MyT?W)UZzO(v8S035p$$t#F6ko%-l2y(1 z>Og+>S^UPZTr%X^#ujby9Ddms^SXs$KOZh*sLKFzw%jeYkAqwsmkH<`Ra2`UQJZqC zy$TkWGY!{SEGiiXT4R)y=bP-JteE@ZfMjHr$?1mHMn#+n?MP0$jEP2!FXtw7 z!jRd)dnbu-?>f`Lhs70XmU=JYQA1oG=JVg+gyA6!T7|%%Ceyk8GySqCj;0QQ(pEGe z*k0q?7u+^nX~KVm+vFy0ZyCD-)u5DLW8_ZL83<5uMo~6ict8hQ3Wet~!ei9)NyP6f zHmlh{R_bL;yaN*WojvJ7YCJuNVC1qIQ*88wYNwMKdWG;W?2_TmbWp)97)&!?_mAO6)5DoL_i&Gu)AP9@ftJX6AK14M$V z3uFAr7rW%Fc`zj%iAU%4BHcERlgg^g=nD0x4tU%OFYOMc5-OMhLEh=l#B)@DdxRj# z(B_=#Apx#+!kTnuse8I%x3(DZ!p!C2@{#tSuY~bh^DFj74Ra7{j?;L~I7v6`O+Ep+ z1P;VdHBpq|(43=|oYu@D38areXhv$q<3b?upct

88<8H}>gd+zX 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±kTM^X&{U08ykZ24j(tr< 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 Pn*7H*5lq;qPwRgHyP1?^ diff --git a/tools/bin/linux/lempar.c b/tools/bin/linux/lempar.c deleted file mode 100644 index 5e2024fff..000000000 --- a/tools/bin/linux/lempar.c +++ /dev/null @@ -1,981 +0,0 @@ -/* -** 2000-05-29 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** Driver template for the LEMON parser generator. -** -** The "lemon" program processes an LALR(1) input grammar file, then uses -** this template to construct a parser. The "lemon" program inserts text -** at each "%%" line. Also, any "P-a-r-s-e" identifier prefix (without the -** interstitial "-" characters) contained in this template is changed into -** the value of the %name directive from the grammar. Otherwise, the content -** of this template is copied straight through into the generate parser -** source file. -** -** The following is the concatenation of all %include directives from the -** input grammar file: -*/ -#include -/************ Begin %include sections from the grammar ************************/ -%% -/**************** End of %include directives **********************************/ -/* These constants specify the various numeric values for terminal symbols -** in a format understandable to "makeheaders". This section is blank unless -** "lemon" is run with the "-m" command-line option. -***************** Begin makeheaders token definitions *************************/ -%% -/**************** End makeheaders token definitions ***************************/ - -/* The next sections is a series of control #defines. -** various aspects of the generated parser. -** YYCODETYPE is the data type used to store the integer codes -** that represent terminal and non-terminal symbols. -** "unsigned char" is used if there are fewer than -** 256 symbols. Larger types otherwise. -** YYNOCODE is a number of type YYCODETYPE that is not used for -** any terminal or nonterminal symbol. -** YYFALLBACK If defined, this indicates that one or more tokens -** (also known as: "terminal symbols") have fall-back -** values which should be used if the original symbol -** would not parse. This permits keywords to sometimes -** be used as identifiers, for example. -** YYACTIONTYPE is the data type used for "action codes" - numbers -** that indicate what to do in response to the next -** token. -** ParseTOKENTYPE is the data type used for minor type for terminal -** symbols. Background: A "minor type" is a semantic -** value associated with a terminal or non-terminal -** symbols. For example, for an "ID" terminal symbol, -** the minor type might be the name of the identifier. -** Each non-terminal can have a different minor type. -** Terminal symbols all have the same minor type, though. -** This macros defines the minor type for terminal -** symbols. -** YYMINORTYPE is the data type used for all minor types. -** This is typically a union of many types, one of -** which is ParseTOKENTYPE. The entry in the union -** for terminal symbols is called "yy0". -** YYSTACKDEPTH is the maximum depth of the parser's stack. If -** zero the stack is dynamically sized using realloc() -** ParseARG_SDECL A static variable declaration for the %extra_argument -** ParseARG_PDECL A parameter declaration for the %extra_argument -** ParseARG_STORE Code to store %extra_argument into yypParser -** ParseARG_FETCH Code to extract %extra_argument from yypParser -** YYERRORSYMBOL is the code number of the error symbol. If not -** defined, then do no error processing. -** YYNSTATE the combined number of states. -** YYNRULE the number of rules in the grammar -** YY_MAX_SHIFT Maximum value for shift actions -** YY_MIN_SHIFTREDUCE Minimum value for shift-reduce actions -** YY_MAX_SHIFTREDUCE Maximum value for shift-reduce actions -** YY_MIN_REDUCE Minimum value for reduce actions -** YY_MAX_REDUCE Maximum value for reduce actions -** YY_ERROR_ACTION The yy_action[] code for syntax error -** YY_ACCEPT_ACTION The yy_action[] code for accept -** YY_NO_ACTION The yy_action[] code for no-op -*/ -#ifndef INTERFACE -# define INTERFACE 1 -#endif -/************* Begin control #defines *****************************************/ -%% -/************* End control #defines *******************************************/ - -/* Define the yytestcase() macro to be a no-op if is not already defined -** otherwise. -** -** Applications can choose to define yytestcase() in the %include section -** to a macro that can assist in verifying code coverage. For production -** code the yytestcase() macro should be turned off. But it is useful -** for testing. -*/ -#ifndef yytestcase -# define yytestcase(X) -#endif - - -/* Next are the tables used to determine what action to take based on the -** current state and lookahead token. These tables are used to implement -** functions that take a state number and lookahead value and return an -** action integer. -** -** Suppose the action integer is N. Then the action is determined as -** follows -** -** 0 <= N <= YY_MAX_SHIFT Shift N. That is, push the lookahead -** token onto the stack and goto state N. -** -** N between YY_MIN_SHIFTREDUCE Shift to an arbitrary state then -** and YY_MAX_SHIFTREDUCE reduce by rule N-YY_MIN_SHIFTREDUCE. -** -** N between YY_MIN_REDUCE Reduce by rule N-YY_MIN_REDUCE -** and YY_MAX_REDUCE -** -** N == YY_ERROR_ACTION A syntax error has occurred. -** -** N == YY_ACCEPT_ACTION The parser accepts its input. -** -** N == YY_NO_ACTION No such action. Denotes unused -** slots in the yy_action[] table. -** -** The action table is constructed as a single large table named yy_action[]. -** Given state S and lookahead X, the action is computed as either: -** -** (A) N = yy_action[ yy_shift_ofst[S] + X ] -** (B) N = yy_default[S] -** -** The (A) formula is preferred. The B formula is used instead if: -** (1) The yy_shift_ofst[S]+X value is out of range, or -** (2) yy_lookahead[yy_shift_ofst[S]+X] is not equal to X, or -** (3) yy_shift_ofst[S] equal YY_SHIFT_USE_DFLT. -** (Implementation note: YY_SHIFT_USE_DFLT is chosen so that -** YY_SHIFT_USE_DFLT+X will be out of range for all possible lookaheads X. -** Hence only tests (1) and (2) need to be evaluated.) -** -** The formulas above are for computing the action when the lookahead is -** a terminal symbol. If the lookahead is a non-terminal (as occurs after -** a reduce action) then the yy_reduce_ofst[] array is used in place of -** the yy_shift_ofst[] array and YY_REDUCE_USE_DFLT is used in place of -** YY_SHIFT_USE_DFLT. -** -** The following are the tables generated in this section: -** -** yy_action[] A single table containing all actions. -** yy_lookahead[] A table containing the lookahead for each entry in -** yy_action. Used to detect hash collisions. -** yy_shift_ofst[] For each state, the offset into yy_action for -** shifting terminals. -** yy_reduce_ofst[] For each state, the offset into yy_action for -** shifting non-terminals after a reduce. -** yy_default[] Default action for each state. -** -*********** Begin parsing tables **********************************************/ -%% -/********** End of lemon-generated parsing tables *****************************/ - -/* The next table maps tokens (terminal symbols) into fallback tokens. -** If a construct like the following: -** -** %fallback ID X Y Z. -** -** appears in the grammar, then ID becomes a fallback token for X, Y, -** and Z. Whenever one of the tokens X, Y, or Z is input to the parser -** but it does not parse, the type of the token is changed to ID and -** the parse is retried before an error is thrown. -** -** This feature can be used, for example, to cause some keywords in a language -** to revert to identifiers if they keyword does not apply in the context where -** it appears. -*/ -#ifdef YYFALLBACK -static const YYCODETYPE yyFallback[] = { -%% -}; -#endif /* YYFALLBACK */ - -/* The following structure represents a single element of the -** parser's stack. Information stored includes: -** -** + The state number for the parser at this level of the stack. -** -** + The value of the token stored at this level of the stack. -** (In other words, the "major" token.) -** -** + The semantic value stored at this level of the stack. This is -** the information used by the action routines in the grammar. -** It is sometimes called the "minor" token. -** -** After the "shift" half of a SHIFTREDUCE action, the stateno field -** actually contains the reduce action for the second half of the -** SHIFTREDUCE. -*/ -struct yyStackEntry { - YYACTIONTYPE stateno; /* The state-number, or reduce action in SHIFTREDUCE */ - YYCODETYPE major; /* The major token value. This is the code - ** number for the token at this stack level */ - YYMINORTYPE minor; /* The user-supplied minor token value. This - ** is the value of the token */ -}; -typedef struct yyStackEntry yyStackEntry; - -/* The state of the parser is completely contained in an instance of -** the following structure */ -struct yyParser { - yyStackEntry *yytos; /* Pointer to top element of the stack */ -#ifdef YYTRACKMAXSTACKDEPTH - int yyhwm; /* High-water mark of the stack */ -#endif -#ifndef YYNOERRORRECOVERY - int yyerrcnt; /* Shifts left before out of the error */ -#endif - ParseARG_SDECL /* A place to hold %extra_argument */ -#if YYSTACKDEPTH<=0 - int yystksz; /* Current side of the stack */ - yyStackEntry *yystack; /* The parser's stack */ - yyStackEntry yystk0; /* First stack entry */ -#else - yyStackEntry yystack[YYSTACKDEPTH]; /* The parser's stack */ - yyStackEntry *yystackEnd; /* Last entry in the stack */ -#endif -}; -typedef struct yyParser yyParser; - -#ifndef NDEBUG -#include -static FILE *yyTraceFILE = 0; -static char *yyTracePrompt = 0; -#endif /* NDEBUG */ - -#ifndef NDEBUG -/* -** Turn parser tracing on by giving a stream to which to write the trace -** and a prompt to preface each trace message. Tracing is turned off -** by making either argument NULL -** -** Inputs: -**

    -**
  • A FILE* to which trace output should be written. -** If NULL, then tracing is turned off. -**
  • A prefix string written at the beginning of every -** line of trace output. If NULL, then tracing is -** turned off. -**
-** -** Outputs: -** None. -*/ -void ParseTrace(FILE *TraceFILE, char *zTracePrompt){ - yyTraceFILE = TraceFILE; - yyTracePrompt = zTracePrompt; - if( yyTraceFILE==0 ) yyTracePrompt = 0; - else if( yyTracePrompt==0 ) yyTraceFILE = 0; -} -#endif /* NDEBUG */ - -#ifndef NDEBUG -/* For tracing shifts, the names of all terminals and nonterminals -** are required. The following table supplies these names */ -static const char *const yyTokenName[] = { -%% -}; -#endif /* NDEBUG */ - -#ifndef NDEBUG -/* For tracing reduce actions, the names of all rules are required. -*/ -static const char *const yyRuleName[] = { -%% -}; -#endif /* NDEBUG */ - - -#if YYSTACKDEPTH<=0 -/* -** Try to increase the size of the parser stack. Return the number -** of errors. Return 0 on success. -*/ -static int yyGrowStack(yyParser *p){ - int newSize; - int idx; - yyStackEntry *pNew; - - newSize = p->yystksz*2 + 100; - idx = p->yytos ? (int)(p->yytos - p->yystack) : 0; - if( p->yystack==&p->yystk0 ){ - pNew = malloc(newSize*sizeof(pNew[0])); - if( pNew ) pNew[0] = p->yystk0; - }else{ - pNew = realloc(p->yystack, newSize*sizeof(pNew[0])); - } - if( pNew ){ - p->yystack = pNew; - p->yytos = &p->yystack[idx]; -#ifndef NDEBUG - if( yyTraceFILE ){ - fprintf(yyTraceFILE,"%sStack grows from %d to %d entries.\n", - yyTracePrompt, p->yystksz, newSize); - } -#endif - p->yystksz = newSize; - } - return pNew==0; -} -#endif - -/* Datatype of the argument to the memory allocated passed as the -** second argument to ParseAlloc() below. This can be changed by -** putting an appropriate #define in the %include section of the input -** grammar. -*/ -#ifndef YYMALLOCARGTYPE -# define YYMALLOCARGTYPE size_t -#endif - -/* Initialize a new parser that has already been allocated. -*/ -void ParseInit(void *yypParser){ - yyParser *pParser = (yyParser*)yypParser; -#ifdef YYTRACKMAXSTACKDEPTH - pParser->yyhwm = 0; -#endif -#if YYSTACKDEPTH<=0 - pParser->yytos = NULL; - pParser->yystack = NULL; - pParser->yystksz = 0; - if( yyGrowStack(pParser) ){ - pParser->yystack = &pParser->yystk0; - pParser->yystksz = 1; - } -#endif -#ifndef YYNOERRORRECOVERY - pParser->yyerrcnt = -1; -#endif - pParser->yytos = pParser->yystack; - pParser->yystack[0].stateno = 0; - pParser->yystack[0].major = 0; -#if YYSTACKDEPTH>0 - pParser->yystackEnd = &pParser->yystack[YYSTACKDEPTH-1]; -#endif -} - -#ifndef Parse_ENGINEALWAYSONSTACK -/* -** This function allocates a new parser. -** The only argument is a pointer to a function which works like -** malloc. -** -** Inputs: -** A pointer to the function used to allocate memory. -** -** Outputs: -** A pointer to a parser. This pointer is used in subsequent calls -** to Parse and ParseFree. -*/ -void *ParseAlloc(void *(*mallocProc)(YYMALLOCARGTYPE)){ - yyParser *pParser; - pParser = (yyParser*)(*mallocProc)( (YYMALLOCARGTYPE)sizeof(yyParser) ); - if( pParser ) ParseInit(pParser); - return pParser; -} -#endif /* Parse_ENGINEALWAYSONSTACK */ - - -/* The following function deletes the "minor type" or semantic value -** associated with a symbol. The symbol can be either a terminal -** or nonterminal. "yymajor" is the symbol code, and "yypminor" is -** a pointer to the value to be deleted. The code used to do the -** deletions is derived from the %destructor and/or %token_destructor -** directives of the input grammar. -*/ -static void yy_destructor( - yyParser *yypParser, /* The parser */ - YYCODETYPE yymajor, /* Type code for object to destroy */ - YYMINORTYPE *yypminor /* The object to be destroyed */ -){ - ParseARG_FETCH; - switch( yymajor ){ - /* Here is inserted the actions which take place when a - ** terminal or non-terminal is destroyed. This can happen - ** when the symbol is popped from the stack during a - ** reduce or during error processing or when a parser is - ** being destroyed before it is finished parsing. - ** - ** Note: during a reduce, the only symbols destroyed are those - ** which appear on the RHS of the rule, but which are *not* used - ** inside the C code. - */ -/********* Begin destructor definitions ***************************************/ -%% -/********* End destructor definitions *****************************************/ - default: break; /* If no destructor action specified: do nothing */ - } -} - -/* -** Pop the parser's stack once. -** -** If there is a destructor routine associated with the token which -** is popped from the stack, then call it. -*/ -static void yy_pop_parser_stack(yyParser *pParser){ - yyStackEntry *yytos; - assert( pParser->yytos!=0 ); - assert( pParser->yytos > pParser->yystack ); - yytos = pParser->yytos--; -#ifndef NDEBUG - if( yyTraceFILE ){ - fprintf(yyTraceFILE,"%sPopping %s\n", - yyTracePrompt, - yyTokenName[yytos->major]); - } -#endif - yy_destructor(pParser, yytos->major, &yytos->minor); -} - -/* -** Clear all secondary memory allocations from the parser -*/ -void ParseFinalize(void *p){ - yyParser *pParser = (yyParser*)p; - while( pParser->yytos>pParser->yystack ) yy_pop_parser_stack(pParser); -#if YYSTACKDEPTH<=0 - if( pParser->yystack!=&pParser->yystk0 ) free(pParser->yystack); -#endif -} - -#ifndef Parse_ENGINEALWAYSONSTACK -/* -** Deallocate and destroy a parser. Destructors are called for -** all stack elements before shutting the parser down. -** -** If the YYPARSEFREENEVERNULL macro exists (for example because it -** is defined in a %include section of the input grammar) then it is -** assumed that the input pointer is never NULL. -*/ -void ParseFree( - void *p, /* The parser to be deleted */ - void (*freeProc)(void*) /* Function used to reclaim memory */ -){ -#ifndef YYPARSEFREENEVERNULL - if( p==0 ) return; -#endif - ParseFinalize(p); - (*freeProc)(p); -} -#endif /* Parse_ENGINEALWAYSONSTACK */ - -/* -** Return the peak depth of the stack for a parser. -*/ -#ifdef YYTRACKMAXSTACKDEPTH -int ParseStackPeak(void *p){ - yyParser *pParser = (yyParser*)p; - return pParser->yyhwm; -} -#endif - -/* -** Find the appropriate action for a parser given the terminal -** look-ahead token iLookAhead. -*/ -static unsigned int yy_find_shift_action( - yyParser *pParser, /* The parser */ - YYCODETYPE iLookAhead /* The look-ahead token */ -){ - int i; - int stateno = pParser->yytos->stateno; - - if( stateno>=YY_MIN_REDUCE ) return stateno; - assert( stateno <= YY_SHIFT_COUNT ); - do{ - i = yy_shift_ofst[stateno]; - assert( iLookAhead!=YYNOCODE ); - i += iLookAhead; - if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){ -#ifdef YYFALLBACK - YYCODETYPE iFallback; /* Fallback token */ - if( iLookAhead %s\n", - yyTracePrompt, yyTokenName[iLookAhead], yyTokenName[iFallback]); - } -#endif - assert( yyFallback[iFallback]==0 ); /* Fallback loop must terminate */ - iLookAhead = iFallback; - continue; - } -#endif -#ifdef YYWILDCARD - { - int j = i - iLookAhead + YYWILDCARD; - if( -#if YY_SHIFT_MIN+YYWILDCARD<0 - j>=0 && -#endif -#if YY_SHIFT_MAX+YYWILDCARD>=YY_ACTTAB_COUNT - j0 - ){ -#ifndef NDEBUG - if( yyTraceFILE ){ - fprintf(yyTraceFILE, "%sWILDCARD %s => %s\n", - yyTracePrompt, yyTokenName[iLookAhead], - yyTokenName[YYWILDCARD]); - } -#endif /* NDEBUG */ - return yy_action[j]; - } - } -#endif /* YYWILDCARD */ - return yy_default[stateno]; - }else{ - return yy_action[i]; - } - }while(1); -} - -/* -** Find the appropriate action for a parser given the non-terminal -** look-ahead token iLookAhead. -*/ -static int yy_find_reduce_action( - int stateno, /* Current state number */ - YYCODETYPE iLookAhead /* The look-ahead token */ -){ - int i; -#ifdef YYERRORSYMBOL - if( stateno>YY_REDUCE_COUNT ){ - return yy_default[stateno]; - } -#else - assert( stateno<=YY_REDUCE_COUNT ); -#endif - i = yy_reduce_ofst[stateno]; - assert( i!=YY_REDUCE_USE_DFLT ); - assert( iLookAhead!=YYNOCODE ); - i += iLookAhead; -#ifdef YYERRORSYMBOL - if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){ - return yy_default[stateno]; - } -#else - assert( i>=0 && iyytos>yypParser->yystack ) yy_pop_parser_stack(yypParser); - /* Here code is inserted which will execute if the parser - ** stack every overflows */ -/******** Begin %stack_overflow code ******************************************/ -%% -/******** End %stack_overflow code ********************************************/ - ParseARG_STORE; /* Suppress warning about unused %extra_argument var */ -} - -/* -** Print tracing information for a SHIFT action -*/ -#ifndef NDEBUG -static void yyTraceShift(yyParser *yypParser, int yyNewState){ - if( yyTraceFILE ){ - if( yyNewStateyytos->major], - yyNewState); - }else{ - fprintf(yyTraceFILE,"%sShift '%s'\n", - yyTracePrompt,yyTokenName[yypParser->yytos->major]); - } - } -} -#else -# define yyTraceShift(X,Y) -#endif - -/* -** Perform a shift action. -*/ -static void yy_shift( - yyParser *yypParser, /* The parser to be shifted */ - int yyNewState, /* The new state to shift in */ - int yyMajor, /* The major token to shift in */ - ParseTOKENTYPE yyMinor /* The minor token to shift in */ -){ - yyStackEntry *yytos; - yypParser->yytos++; -#ifdef YYTRACKMAXSTACKDEPTH - if( (int)(yypParser->yytos - yypParser->yystack)>yypParser->yyhwm ){ - yypParser->yyhwm++; - assert( yypParser->yyhwm == (int)(yypParser->yytos - yypParser->yystack) ); - } -#endif -#if YYSTACKDEPTH>0 - if( yypParser->yytos>yypParser->yystackEnd ){ - yypParser->yytos--; - yyStackOverflow(yypParser); - return; - } -#else - if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz] ){ - if( yyGrowStack(yypParser) ){ - yypParser->yytos--; - yyStackOverflow(yypParser); - return; - } - } -#endif - if( yyNewState > YY_MAX_SHIFT ){ - yyNewState += YY_MIN_REDUCE - YY_MIN_SHIFTREDUCE; - } - yytos = yypParser->yytos; - yytos->stateno = (YYACTIONTYPE)yyNewState; - yytos->major = (YYCODETYPE)yyMajor; - yytos->minor.yy0 = yyMinor; - yyTraceShift(yypParser, yyNewState); -} - -/* The following table contains information about every rule that -** is used during the reduce. -*/ -static const struct { - YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */ - signed char nrhs; /* Negative of the number of RHS symbols in the rule */ -} yyRuleInfo[] = { -%% -}; - -static void yy_accept(yyParser*); /* Forward Declaration */ - -/* -** Perform a reduce action and the shift that must immediately -** follow the reduce. -** -** The yyLookahead and yyLookaheadToken parameters provide reduce actions -** access to the lookahead token (if any). The yyLookahead will be YYNOCODE -** if the lookahead token has already been consumed. As this procedure is -** only called from one place, optimizing compilers will in-line it, which -** means that the extra parameters have no performance impact. -*/ -static void yy_reduce( - yyParser *yypParser, /* The parser */ - unsigned int yyruleno, /* Number of the rule by which to reduce */ - int yyLookahead, /* Lookahead token, or YYNOCODE if none */ - ParseTOKENTYPE yyLookaheadToken /* Value of the lookahead token */ -){ - int yygoto; /* The next state */ - int yyact; /* The next action */ - yyStackEntry *yymsp; /* The top of the parser's stack */ - int yysize; /* Amount to pop the stack */ - ParseARG_FETCH; - yymsp = yypParser->yytos; -#ifndef NDEBUG - if( yyTraceFILE && yyruleno<(int)(sizeof(yyRuleName)/sizeof(yyRuleName[0])) ){ - yysize = yyRuleInfo[yyruleno].nrhs; - fprintf(yyTraceFILE, "%sReduce [%s], go to state %d.\n", yyTracePrompt, - yyRuleName[yyruleno], yymsp[yysize].stateno); - } -#endif /* NDEBUG */ - - /* Check that the stack is large enough to grow by a single entry - ** if the RHS of the rule is empty. This ensures that there is room - ** enough on the stack to push the LHS value */ - if( yyRuleInfo[yyruleno].nrhs==0 ){ -#ifdef YYTRACKMAXSTACKDEPTH - if( (int)(yypParser->yytos - yypParser->yystack)>yypParser->yyhwm ){ - yypParser->yyhwm++; - assert( yypParser->yyhwm == (int)(yypParser->yytos - yypParser->yystack)); - } -#endif -#if YYSTACKDEPTH>0 - if( yypParser->yytos>=yypParser->yystackEnd ){ - yyStackOverflow(yypParser); - return; - } -#else - if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz-1] ){ - if( yyGrowStack(yypParser) ){ - yyStackOverflow(yypParser); - return; - } - yymsp = yypParser->yytos; - } -#endif - } - - switch( yyruleno ){ - /* Beginning here are the reduction cases. A typical example - ** follows: - ** case 0: - ** #line - ** { ... } // User supplied code - ** #line - ** break; - */ -/********** Begin reduce actions **********************************************/ -%% -/********** End reduce actions ************************************************/ - }; - assert( yyrulenoYY_MAX_SHIFT && yyact<=YY_MAX_SHIFTREDUCE) ); - - /* It is not possible for a REDUCE to be followed by an error */ - assert( yyact!=YY_ERROR_ACTION ); - - if( yyact==YY_ACCEPT_ACTION ){ - yypParser->yytos += yysize; - yy_accept(yypParser); - }else{ - yymsp += yysize+1; - yypParser->yytos = yymsp; - yymsp->stateno = (YYACTIONTYPE)yyact; - yymsp->major = (YYCODETYPE)yygoto; - yyTraceShift(yypParser, yyact); - } -} - -/* -** The following code executes when the parse fails -*/ -#ifndef YYNOERRORRECOVERY -static void yy_parse_failed( - yyParser *yypParser /* The parser */ -){ - ParseARG_FETCH; -#ifndef NDEBUG - if( yyTraceFILE ){ - fprintf(yyTraceFILE,"%sFail!\n",yyTracePrompt); - } -#endif - while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser); - /* Here code is inserted which will be executed whenever the - ** parser fails */ -/************ Begin %parse_failure code ***************************************/ -%% -/************ End %parse_failure code *****************************************/ - ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */ -} -#endif /* YYNOERRORRECOVERY */ - -/* -** The following code executes when a syntax error first occurs. -*/ -static void yy_syntax_error( - yyParser *yypParser, /* The parser */ - int yymajor, /* The major type of the error token */ - ParseTOKENTYPE yyminor /* The minor type of the error token */ -){ - ParseARG_FETCH; -#define TOKEN yyminor -/************ Begin %syntax_error code ****************************************/ -%% -/************ End %syntax_error code ******************************************/ - ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */ -} - -/* -** The following is executed when the parser accepts -*/ -static void yy_accept( - yyParser *yypParser /* The parser */ -){ - ParseARG_FETCH; -#ifndef NDEBUG - if( yyTraceFILE ){ - fprintf(yyTraceFILE,"%sAccept!\n",yyTracePrompt); - } -#endif -#ifndef YYNOERRORRECOVERY - yypParser->yyerrcnt = -1; -#endif - assert( yypParser->yytos==yypParser->yystack ); - /* Here code is inserted which will be executed whenever the - ** parser accepts */ -/*********** Begin %parse_accept code *****************************************/ -%% -/*********** End %parse_accept code *******************************************/ - ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */ -} - -/* The main parser program. -** The first argument is a pointer to a structure obtained from -** "ParseAlloc" which describes the current state of the parser. -** The second argument is the major token number. The third is -** the minor token. The fourth optional argument is whatever the -** user wants (and specified in the grammar) and is available for -** use by the action routines. -** -** Inputs: -**
    -**
  • A pointer to the parser (an opaque structure.) -**
  • The major token number. -**
  • The minor token number. -**
  • An option argument of a grammar-specified type. -**
-** -** Outputs: -** None. -*/ -void Parse( - void *yyp, /* The parser */ - int yymajor, /* The major token code number */ - ParseTOKENTYPE yyminor /* The value for the token */ - ParseARG_PDECL /* Optional %extra_argument parameter */ -){ - YYMINORTYPE yyminorunion; - unsigned int yyact; /* The parser action. */ -#if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY) - int yyendofinput; /* True if we are at the end of input */ -#endif -#ifdef YYERRORSYMBOL - int yyerrorhit = 0; /* True if yymajor has invoked an error */ -#endif - yyParser *yypParser; /* The parser */ - - yypParser = (yyParser*)yyp; - assert( yypParser->yytos!=0 ); -#if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY) - yyendofinput = (yymajor==0); -#endif - ParseARG_STORE; - -#ifndef NDEBUG - if( yyTraceFILE ){ - fprintf(yyTraceFILE,"%sInput '%s'\n",yyTracePrompt,yyTokenName[yymajor]); - } -#endif - - do{ - yyact = yy_find_shift_action(yypParser,(YYCODETYPE)yymajor); - if( yyact <= YY_MAX_SHIFTREDUCE ){ - yy_shift(yypParser,yyact,yymajor,yyminor); -#ifndef YYNOERRORRECOVERY - yypParser->yyerrcnt--; -#endif - yymajor = YYNOCODE; - }else if( yyact <= YY_MAX_REDUCE ){ - yy_reduce(yypParser,yyact-YY_MIN_REDUCE,yymajor,yyminor); - }else{ - assert( yyact == YY_ERROR_ACTION ); - yyminorunion.yy0 = yyminor; -#ifdef YYERRORSYMBOL - int yymx; -#endif -#ifndef NDEBUG - if( yyTraceFILE ){ - fprintf(yyTraceFILE,"%sSyntax Error!\n",yyTracePrompt); - } -#endif -#ifdef YYERRORSYMBOL - /* A syntax error has occurred. - ** The response to an error depends upon whether or not the - ** grammar defines an error token "ERROR". - ** - ** This is what we do if the grammar does define ERROR: - ** - ** * Call the %syntax_error function. - ** - ** * Begin popping the stack until we enter a state where - ** it is legal to shift the error symbol, then shift - ** the error symbol. - ** - ** * Set the error count to three. - ** - ** * Begin accepting and shifting new tokens. No new error - ** processing will occur until three tokens have been - ** shifted successfully. - ** - */ - if( yypParser->yyerrcnt<0 ){ - yy_syntax_error(yypParser,yymajor,yyminor); - } - yymx = yypParser->yytos->major; - if( yymx==YYERRORSYMBOL || yyerrorhit ){ -#ifndef NDEBUG - if( yyTraceFILE ){ - fprintf(yyTraceFILE,"%sDiscard input token %s\n", - yyTracePrompt,yyTokenName[yymajor]); - } -#endif - yy_destructor(yypParser, (YYCODETYPE)yymajor, &yyminorunion); - yymajor = YYNOCODE; - }else{ - while( yypParser->yytos >= yypParser->yystack - && yymx != YYERRORSYMBOL - && (yyact = yy_find_reduce_action( - yypParser->yytos->stateno, - YYERRORSYMBOL)) >= YY_MIN_REDUCE - ){ - yy_pop_parser_stack(yypParser); - } - if( yypParser->yytos < yypParser->yystack || yymajor==0 ){ - yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); - yy_parse_failed(yypParser); -#ifndef YYNOERRORRECOVERY - yypParser->yyerrcnt = -1; -#endif - yymajor = YYNOCODE; - }else if( yymx!=YYERRORSYMBOL ){ - yy_shift(yypParser,yyact,YYERRORSYMBOL,yyminor); - } - } - yypParser->yyerrcnt = 3; - yyerrorhit = 1; -#elif defined(YYNOERRORRECOVERY) - /* If the YYNOERRORRECOVERY macro is defined, then do not attempt to - ** do any kind of error recovery. Instead, simply invoke the syntax - ** error routine and continue going as if nothing had happened. - ** - ** Applications can set this macro (for example inside %include) if - ** they intend to abandon the parse upon the first syntax error seen. - */ - yy_syntax_error(yypParser,yymajor, yyminor); - yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); - yymajor = YYNOCODE; - -#else /* YYERRORSYMBOL is not defined */ - /* This is what we do if the grammar does not define ERROR: - ** - ** * Report an error message, and throw away the input token. - ** - ** * If the input token is $, then fail the parse. - ** - ** As before, subsequent error messages are suppressed until - ** three input tokens have been successfully shifted. - */ - if( yypParser->yyerrcnt<=0 ){ - yy_syntax_error(yypParser,yymajor, yyminor); - } - yypParser->yyerrcnt = 3; - yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); - if( yyendofinput ){ - yy_parse_failed(yypParser); -#ifndef YYNOERRORRECOVERY - yypParser->yyerrcnt = -1; -#endif - } - yymajor = YYNOCODE; -#endif - } - }while( yymajor!=YYNOCODE && yypParser->yytos>yypParser->yystack ); -#ifndef NDEBUG - if( yyTraceFILE ){ - yyStackEntry *i; - char cDiv = '['; - fprintf(yyTraceFILE,"%sReturn. Stack=",yyTracePrompt); - for(i=&yypParser->yystack[1]; i<=yypParser->yytos; i++){ - fprintf(yyTraceFILE,"%c%s", cDiv, yyTokenName[i->major]); - cDiv = ' '; - } - fprintf(yyTraceFILE,"]\n"); - } -#endif - return; -} diff --git a/tools/bin/windows/lemon.exe b/tools/bin/windows/lemon.exe deleted file mode 100644 index ea46fecf9966536daa4f0ca0f7acb432d43994e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 104448 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

D*sQMcE$@eY4I5WSL6+ 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%0DEMeH znVBRblbLZIkW_8c5_*XNrL9$J{Vbogt?l);)T&j>weg9zwvCUrYF|`QlR|C0YSmWF z{jYuYNhU+0_PdW?`}>?o^WaJZvc5LHyz=l6m_sytFW{rY&x`ceE&TgP>Gn#b4k9h9Nils`{`l#X?SDhxJ6qxU-K*b7 z@gDpjL+-rfQn@a$Vi(gpw|8*rtgrJP5Z-9~o{}?v^{Epo{P)`*M8ZOk=fM_|y^_rO zHlHeE@pD{K)prpjR|aHJzI!AO>}hbXtLqv0#7?o|<7^8&$r(;%wlbZRo<=Tx$C5?= z0E$E}7CAW!NPRPxBh?IfE@7zXzF<0U6EE5N>&mX5Rd)R%@2W>8u+v&PDBp(JKC76V z^cLVHtR6TWoY(m+M8Z}2dXVRx-h!%bUM#}Id?6e8bf@GTGjHONhy6{ezGvp>+3ePv zb@)2#;ZB{Yi?oc(osg+^5OK7?u&U%tD@%M@?rht9&<}{rhEynrXEw$RqoYe z(AHl=GSd+GIhkNKm@ri^o2uettoBH}V`?sCm9U?}h4D3gGpGyYRm)x7>*0~P(Tquq zDBK5-;v(a$R%p~uAA#rf*Co!C-TShBKU1QMPSRiVI&asr)2vr+l6rE|l6H`#N^vFk zS9IP@;NaBX5+*A=vYS(R=EZ#A{SPR4-ks+#F(anD=k?GaTY9M@iaXw|&)fP6shD3q z!^d{8e|p~1_isNE^?>=m<=t5!Z@+xCtb4M&FIUxV3hkb8H%|G4Pv>kh*q3!WPWiE8 zl{}{7ES1caeiitxY<-n4VJ*t{6nKl`(d1%uag9n9N|VthbESJYEytxDB2~FGTAn2K z{bDKVZ8wp9A@x_K1kT@zdT}5|&YBdj?s{n_LM!iz{L&g)X5-X?rL#kWq7 zU`fZa2`aDidIIF0Y`Py?Q~S8YH}C2cYC-j?3H~Ee;k@@rr0$-)1B7+i+JvVRGM>}I zWVN0yCtYbom(%kvVfY(-LdxQe_PKmVoG&Pm{91~v+;Z<8kV^gw-V^8Cx8Mmm<;HOK z)*_VqwST8G>sv6ShwaGPe%i>s(Vbf$XJSRlWbNj?Z6oQ8XCi5-jYzw{fO_aI)%BLs zHaoHudG(b_JRL_&#!!EOtGk3Nsz}m`EuWP42QP%||E)x0emFz=litqUgVfQ7eOcr2 zkzfDsn8M1IuvE-eL%G%PmA+G`4I44MSXI}neOvbGo{c5h zc6$GvtTGTunXMSy1<&V^KlS2{7Hm(*J@bpL(0vg=QL z`0Ee~{3j}d0{>YG&zHiVj`lDzE5|;VUYE#@x?auxZv*D+%A6 zwd5-ytJr#yo~9K*`dI(H)L6zB1ZK{Vp^3}TL?*}FoK>^ni9X*CX~cBV^;P5J$dTx? zMRCu5=SYD(*6ZZ?LAInX#gYf=u3vAviy0`U6 z$c|2}QrecVbvdhVtL!_O_*;sXxT^dCGVgj-T63i{!1OObW$g~4y4!MLWor>i=5##c z!c2+Lmr+FZyZ$N)e1k4+HGPI@AfE&B!U9d$@N>y-HM;a{-+`IXUHinyNf*C(C<_^b z`tRWhl&wD)hrp?5j~H;7NhNcbf)#VYjWA;O-TWXCgCV!a%5%|E}h>~&` zlw^s2`K%bsv}$JF63wgWyNXa5j`SEP--lQ)ov6Q=;+^@s490KpP>ZK@6Y<`cb)G!N zl30tWtMJdLrz)J3X} z9fI45&e!GkWxaH~E{!&vY_X|aGUu7T>C~%x#uEf!QO}b6el4>G+nVmny2GUC8@Ody zyCrYNpJHKnNY?$eFvwQOdR;2q_sHyLOPkoNTCrItikk%j1*50;;5FEHJ?qW>$HaEX z&wjr5NydPYuZ_EzaReV_#fBtOQ@N%J&^0f-#8TiK8c?>-;!~IrD!>~ z-eXF~kKijT^?V62?8(~ftUc0mP)_3PD3l_MrOi%Alr!vX&D*5z*5UcrS zMK+Q#pC`LByVC#8mcCPOc_%sT9=1HF-79_fpGX^tWt4fjxfEdV)o+~BoqTy>-gWoq zeW7Q`{k)PwV0YHLQ%SR9@(+t8sr}@U9cg*g-<@?oJmHW}CiMOCJG$M!M7+KqL+e|7 z_%QFjVix)MHLXU3$yqHZ@>({7YgFnYEw@WZkhW)|<#s*%*_$;3Q2PB_`joyqyZ;gt z3V!-!$80X43m)zJ35Z%fC~>9_K)txo{SlE|IVt35V#I~;Q{BKJi zubNdSqb0`TU@niLdQ0ST6}IlUhU(LQuJk|79=iRF2(~ReOvn26e3b0`WjYySNW;M+ z_%_6^xQ|v+o!R^8SGM-tBh{_QtGJ(iwta7M*h@b3AR9`_mubc??m}b~Yc~%c58#6D zmvs%hnP*Nc8T=)~WuM;5h0pa|A-3gF#_?W0A|joPd$f|g-Si0C(Pdr5jAO-ZR4eto z#K5QpRC{(;MSxHz&IFy)O(dzv*DAWMdCcbTS$%7@?00q@S+V2e zL&gU|4QS=WTV&3(RxA9=EBvviWMbb`%N-i{wq-wd{XPhs3=L;%Ip#gP}x z$X8Rpw`KVSs5J@Lf6v>xmlC*I3T^H>&5wWI%geNG>+u|4%C3;w^(1M4jt0&I^0FLPbH{t-LT($ ziBoR78TITmr`hf*+$T%8N8H!Ul6U3s`iOWPWqak?UQ@(t@Su*BZ+qp7*CFw`T_@xd z5mTktPn7^Z&m-G7eFu)G7R<-gr>89V)0VwDqAJe&>O-v22M9}Re?7X`EyfL=y2T#h zjaf#P{&L10`y&Zul19HnjU}ItaPm6$GVUJ!p@gqE5zn5O*O{$3&iGhDb$;KA$C3Hv zq_;DF3FlDew;dyym)e;tmR0vyG=hEW_=@z*@6&CwO*KeoQbZD~L*`wQ`S_vCuT0N8 zs55_!$-&{A|G|lP_C)5{I}YdCD;eKKTG5;1uf_2cLgK2t8<-~YS*}@>DGxj)$HH;VjE?g9ceFwTN*o(Df|2 zOC}k5@D?MF4m~M0{5!`|5(7g)UqJHanU&evdto{qO5x}1qd0h7Mb`@#_ut6{zqSw7 zUjI7IEzy;5{yF}R`@ak4WMs5wlycLfU_nOw7?#w}{x&%H6HF^gr+-rn79@P9IaR}> zBkQ&Brr#HS`PAVUKfTy`qUouTX@*1p@u<>hYpX93u)?88&`PvNlD;-87>`HeORfJA zW;5ICzgmdXX3_0-y9_kgxXrko@Lk5Oe0KP5+&W?=j)uGH!?e2aLOTnw|ck zjPTzXw^P6U#_jO$`2TO?aIiJzix>I-x6A#oJX-=q@AFfZntY*f5Se)rOFaQ+IH+q0C9HS~ zk@$TPD-umwjX^6O45a+Q08Ce>%eTm~N*bf_WGK>1E9I!dLRzEHQ%GYVc%+Xbu`Cox z2AhNN6|_RScRc6|XZj_Qaq=4WMIKkOr#bVK!NL9D8t}QJxIKwfBoJ(3gbP^Fm=?;= zFyu+Jh7t*KwS4jBRBJGTenhOq=1|h#0?Sn1PC*?nO@-pYghjQTs6_B2oHp{e_~J+q z!G|JNQ#eXvMw$y_QRX=$Ui%~(P!;!ICsCW(SerDEO_ z2M138s@dmwj9rg~qqrxtb0+X6aef0l3W)nI@GU?NwD4K#i_C_9NB0vkpFe0+zX|n- z_*#QV!HyM;1*ti{marqzQ)>Qvt2P*;*>t}PMPevOS`>oUwzoD$!wEQ_Kc5b{C}5!> zqWtttYw6PE>T)42^dv6EM|)Uvl_*Q1CDfF(%+FJJMnL=8x|r#!;})8*p}0Q3KNw5u zWO~j6zmoA`Sy*%DS~YYkQ4{Ix;gCOxpVV(uM*i;jSf2nEAclfAwqp!}^rm3M9~{At zu#Ht3Bc^4|pG#l#`%;OZ6oV_EKP{Rvgpfy|1U=kw>3E~!l+2oE(`lw8w0)-Y7)Cr zeN}^l4*@p=r{li)<2KB~ec&8)5(q#SEuG&OiY%Rn=0c)n3nWHX4*6r=F)=(rGFI>^yE^@yD^Ab>(QLm9^HAkHsYO*TV z)Rot+Dk&|;8H@x%O*tyrjs^vrtW<=7$RbM%Ta>ig+e491@+@(B5_Q$*l&`7VP*aY# z*Z4tt0-Cm?YsVGVh7GGL*HqU^WCBmNP3VX$#ENf?5Hv;tBV~nsjlr&YJJAz9Tsrhp~ ziNYu?y*VCA1`~`<^q}_ka0`P3?NTIS!aafq+p|jNPM4$i1uS2a3$Wsg?jtUb<&VX~Wo=za={aTPHFXu~ zxeWWFm}3Mi@Op&h*}786dW?8Ze(x8L{Dz|Fvd7NvgT&K9uD7+-uI>r1QGt*NtQ#y~41FsdQH%$6`i8#bi%CG5MsGP&?# zbnY@nB_=K`&X}z*!|*H)%u`nk+x4_!blcRgTU%aVwyMf0=&*2`3z)PSIV_ykvxPEN zc**+o@DcT(m%zQAOV&r55=o~9Y5j1+2Gf?Aj2e9#B|m$*nUUd$c$xCU-uSTAX~iqy z**i~90zC^De3!3~;h;rktaIn=G9tLy{7QJ^02H%mV6s&dCR(t%;o{s z6>wnx?EI|sISFmyjLbTfL`mmFY5tt_)Tq6kK|Lu^m{!OdHWFo;9FSRrll?Fc;$!5@ zJlGDWdZINJd0GY4HFcG%D=#Q7v#QtC%@K+D5-huuLwTQM@=jAhyZeslDTjyJ8hV&| znzUFcn6X3QBSTMy#y9jd9F1=DwFG?uM^9d>7#v*8cU`6dZr~tu|Iy$&{41&l2Tuid ztr;9#4}Jwa8c6tMMow42PufZl?PGB&%R!kV(6|A#u}D=8uK|{O2jK*MdC}QSG)~;5oFTU}=T;J7ZcV_0rRBc45l6{dXZ;J)lbYZm?wGu(8$;_oQ zjSxlN(snXMHZx%noMu!@P&Yrj8`dVhyTU&v)uOCUDv4!l%n%>U(d{OZ+$Co_l}K4P zixJ>Z{K6G!36@F}J<)gMoUy-xNlG=hq;D~5)fe5gQ`FIAcwp0>K1*j_FP%gy@UW)& zlIi?Vjw}zTTr2fuA1M}PQ%uI^q>t4hb*{!F)Zm`b{x7!Q>abZ53K6#%^ST|XKtbQbZm!gVW#3i zv6B9c^|G>KV{Wqwwk6}fdS@5U6f0}Mp#rtTPL&9KQfClP*4ykWSzoDmsJSJn=xFqZ zsGo$+l2xz5RTCzxkwWdv)#gw*;P=G?rYwJ$R9e34A{!&o%@Kwg{OlcMYh$o|b2QFy zN{4pz)oF(@;u)=0W`{+0daKph+0@HXk7t-ir-=8CFG3iOY3svUdqwH-=s?}-zOb0> zcB-JaSVzRu5oGb|M8eoKvzLO2PqQGXw&@49ZAlNa=-84=ks8`CQI0U27L+(5D!rd% zm+$d7Eikl~sZ*&3#pe^wb3%aI< zXYTPhP5-`pl#5ncL(!>|F2b&qDX(5@4r_JWZrhd!_SiLq^$?qe$xu@$C{J%qOO0qE z*;H`kqcb=8yWj;4*kjX^Apz5Bv=Z4cr0wwW<}rS^!LK0^OL z=eOb`gM%@k>ZrlNz2MJq+T$YN5bzjh79In?4c-of#m#>BcED#K7ktBv!NGX~?3Z(+ z*kG8mWhW4KP1;C0q|A}1Hn!{->2Wo|5F}C$*y2gIa?TJhbD9yOvYyn?7ves4^y54! z(V5fu>`^fd(Yr`y%SR?LPM*v+l61BryWI2;oj&UKr{Y69H`+uMw#c4X0@X;{#j)yS zZl+7)kp@c%J?V0GJMGy`Aj;fJ#tdxHMmj5doAGdak*ea^S;WGWCS;RwK@sP1`IWb^ zs0+8-y~jKl7}j_SGtW=tA<-;l8|?DdSh9Uc1Ubsy=o29(LkU)oiKWUJj!gX%VsMAX zs3Ff}G|59U+d3zdjDra=`Ai-eSM2Tjgt8Z%7EidC=h08%A%g9cwx1Y!t3b~==O|A= zOG5_6p)6os@AXQ3YwSlF5vnYcg+^b3I?~GVV2q8aBITDz{K}&8{6xlE1Z_8HIwM7@ zOqFT7DgD<>TU&kpc(h0{tK~#oGaHZW1Ty8X3G?iwB^nL{<9d=(*rfAC*m3h%D^WB@ zHA^aoKcil>bP}`2Oh-QwL~kqYSnrwt?83^~qm{t5ms~8KO3I@gACr-dL0M#=4>~e! zCjypve~}7Pf2~9I6Cm4y>z0veG<;NlAU>)`eWjm)!K-ljar$f1&*BcY{L$u zjhTri>2wVD7D7i%MXJpxj1=W`9Xm(5vRbPR2qt{wbAuvv{(H6m?85U$m5U?NAw0;B z19^iSI@5dXa%Mu#L5&CUGl0vo2Ge0O;pt#6goppXO8j)-+?|}g8v^HihJy*xKinMx z#SfKecSDbjYmP0pBbfgs&QsYyw3UgfeKyG|D63vwQn_Z18VZ(Yb17y}AuLM4+RC#D z)4ysn=dM5w2VMh9}O*7x2DYD!kGm+Pa&16=XpPCx_H4H z8UMwy$iktSU6JNF*n)U4$(m(34wfe;T>0)`YuCGjy})mPL%`cWF8-^L%jUw(r!S@t zFgIY4V&=s9NiioN0|9NAJTab&h`qN$t-j_UhZ3}@P?mLGD4tCD!sn)f@pf}2K${;d zq`f|8q2U|K#c8~ubT#p4lDwRhVu`R5j7Huz567A<%c*-T5ljUbScCeQg^VqXImxJ> z=NC?o@yO_5|K2NIV~FumjCopohp(cTJnwN_^xrSPJ6H#F0M`J;fC9u{Vnv!*qM%gD z7g1$=e>u7Py`hfqOnAREA2eL@{h)DgHoTUTX1KPaQ(^~ruR%=!M83Je6yQkUXh4oM zPY2``2;NpvCjut{Cj+Md1;AXO5a3M{#mh@dzh?lpe*+(LD1(b_ydVD_EXeOmrk(fF zjo%%A|1uNaVX!J$Sz1=UO8FZ7vd!aNuyE1h(@sBQ32&X-KjE9#36$(Tjs0`VpH*zf z*#?zSgxShnb!xBTMdzf_*N z{F|?py_5I#h5zTe?LVJ*&xM}S=&gZ*>_?n#;UpWzru>gYvhKL!t}m{7{jHDnkFQ>` zdf^Q3TNRr>d%?0FB|iPz>Zz&W1S2W0IZx^MHe|SWo~uRU1gi#HRAaiWFO7`fd-X_n z!;>T3$aN?$A@)8$GW<}6JNLlI@L3t|;)h3uug@s2Cc|Bv;jYMVTi1-tZ-0hc4U7!W z&u~xAaC@}2D$+(1H$Fd zf}aICB@XyqV7vJ9Hr!FbPG}1p0Iq?Kf!_gkNgM{0Bycly2l!s#R_Gq^d}d>}Lwmu^ zz+UJW*u?Nn84!Lz&=aA+_1B0#P;YXBbv+|UEy z7jAT;>P^s)DbPifRMOo0yfClXauLb5oH-OJ?p}s~{JNbPf1X z;3?={@XNp<=mGHYpQLPP3w#c6K;nZR1sdo(z2HTc(Z14;!25uml+_E~bOrhZ-2v_g z)NSMmuGz|(3R>`Q{{^{0?+3fOXjAgf2OqkUe1r$^|Lvx}(0jn2xElFTRs(qMPDDmp zFZf-c16qAvsU<)UbTRnIYn8eM+5+DPtcUIeU%!h!1-%=*>MnE`K5M{R@5XN6zZ3ie z;1F~V_#iL{LBNKACmS0KlCE~RQ$n{`Y8+l zeDHAxsSExVc+MgE8~$E!IZ%gx4R{?;1Kj|Yk0w_@?*v~DltJ$XzW}U<9spnXC*(j~ z8o(F4OrH`O`~px1JplgFE3_B%Ztw#@6?8B7$NxcE^63Q!Ud3)e$H1=x4bbW}@_8Ly zm9oIo{{sJ{wZPrL66l@an}Eg8dj!8hy`YQ14*`!z{@_2nrBtuv1D^3W`UA8D-VJo3 z+ky`OZO{YYZ@&%yq66T!fGTM94yF<)gZ6@d?4qvFz2NVRcd6eX&pqHD0hg0c4|v59 z4Bi4PBmPeCPk^V1-wUoQBp>25fOi6mB@Vb_zDqrZ zzu@A9lrQ;!zXR-r&pqG;i(M)}KE>dlp9v4hvlm>tlzI`T2HXmCkTwQ>5-5}Uf{#AS zr7EB;@P)v3;Q{K5`B{FCL>MR*23vBITphu#k^C?2WS2cZS$p9>Fn+W1oFiHtQJ;46W!*uxKh|1A;_NxIxFvH0Vy0{uoP>p^0YQxics^*a?>g>BFs};B8s?&BIq2_JlXja=Kb$rW2 zy6nj+vs7391eM?BR!6kJ-%W;n@YO;=Q4AJ zPe&HV<*MVhxz#ak<5gbEIF<8-q1yDgva^Qk){|C$N$bcf2A#=|BPXYf32rrE;dt-3 z23O2AF-uKsbbH4)jElKyNPBX=I(gd!HKQ$CO>fCU21gz)11CSHoZJa2cV)V^kk4p- zQzoh@3v;}a8Yadj)MWR#d&li}jpbLH5l?jBv!lq(;blsenu5$GAv5=9DPOnKc-m>4 z%Kofrr_t&!vZyt(7^{r2^iT53On?6AI-PoN#!V z+W+&1%P2i9mzM($0*gi%X`dC0y`2|CR}A4tD8e?9vSE(sb<7 z(b)V<$sML^qEn3-I;Gp^?8DPaeKK`bWK)}FD;=3R^==@IBTvDiueE9Vnv<24^F;P| zEkChWW2G1Wn@nEQCaG!Lva#D)*aNr9elEivNI6n|qw$wA)9vo`oUPNx=Q~=}God$Y z|M&qHW0@I$GW(R%{+V^pbUX1JoL=wrc6G}6pjh&YBja?Lj@8elOo=aTGB2O;Zwlkz zWX8W-^x?$A+jKO$E_plBNgtmx$1A6PWAT#CuOpN6c5(d1lH+K0Ftcq&iz9qx=E*w2 z<;6d}9VFgp=_PIY7%K6`jZ=Djb?PkG%z+^PVSdZ@OK-D(ReyA;1JAkC+v$D>S<5^> z9LI?(c>4>s|IG&PHMrN{7Y%;f;M^DO_#ZWRiNO^H2MoU4;A;)O)!-h3pEdYpgL7Z9 z^F7Ak0)tOCxYpo+!A>2L#=YI(>ka<4!FL+`putZW{G!2sHQ3!}mp{ee6AV7ZV6VYT z4PIsN8iUsx+-UG61}6=^+~Cg{e3il18hoR{w-~&~;JXa&G58UKdkuct;O7iJWbj`M z<~lnqsvLulG5Dhf&olURgNqIRxWRP>Uu1BT!4ZQu8Qfv;l?Gp9@QnuFV(@JS?=|>g zgL@5r*5CsMJMH|Tp4#pBp`O}u_(#>#XE@3f4km-8oWkG)MR=__L-1EsF2~U`z17cM zX9ts|skpp`$uR*x2c+2FI?S&!pq@(et!t6vrg*BO#u2y5mq?b&sSe%&5cgU+6qkxs zMw+4}YPn;!Voqd)6>sOMyM&m-7waOMc_W#fR`=Rqa$Q7@^l>#qd7B({=A;C*LcZ#I z?zQ1yFs6Rwu5;dnaKx$}cGrayRGE7OQbF~kd(2GKD{fP$Ik}zP_~H zoO<-v+uR`kYWxG-6c7ovg_5ckS935ar*=4Anow(T%TbD8WD`f8preiTO~{9RU0h*K z*=^F{O8IbeDMr077OU3>u{lkreK-~=_h87m7gd^&5sMbVty=FjN zrRx1Q^|+EV;*ltO>8ie|RnD5LDwi%!P8h1YUA!&BVeP=Udc%Fu`1({t`%QHFF$ZNj4iK_b50*w=DiMvT&1y@VmP5OvglUfFqBF1u!6ROzV zBxehFErS~ppX(9{NZDB%lpY)oCCsaOk=g5pR! zt=|ZxuV+wxs1%n8@K&u`4%38#B3z!!x$T=h*oAg;1ByR}mVHhrgw2iTZo{g&+O1ht zJ2jTKb3ZQ>Pg|~WUn(c!)Gjy7Yhio^%GS-B+;Vox7gp+4`V&p*=Ht>H4&MB{5Q(m=bVG&9! zWA8DP^ZygHCN}vwyJ~9h%s&1(aKn+sqcWPGZ~I#x89m%NZ)hDmdibcBe(3p6Bmp+o Z`86mTzx_~&b{7xWSUW!a_fIQ<{{+O-iFE(~ diff --git a/tools/bin/windows/lempar.c b/tools/bin/windows/lempar.c deleted file mode 100644 index 5e2024fff..000000000 --- a/tools/bin/windows/lempar.c +++ /dev/null @@ -1,981 +0,0 @@ -/* -** 2000-05-29 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** Driver template for the LEMON parser generator. -** -** The "lemon" program processes an LALR(1) input grammar file, then uses -** this template to construct a parser. The "lemon" program inserts text -** at each "%%" line. Also, any "P-a-r-s-e" identifier prefix (without the -** interstitial "-" characters) contained in this template is changed into -** the value of the %name directive from the grammar. Otherwise, the content -** of this template is copied straight through into the generate parser -** source file. -** -** The following is the concatenation of all %include directives from the -** input grammar file: -*/ -#include -/************ Begin %include sections from the grammar ************************/ -%% -/**************** End of %include directives **********************************/ -/* These constants specify the various numeric values for terminal symbols -** in a format understandable to "makeheaders". This section is blank unless -** "lemon" is run with the "-m" command-line option. -***************** Begin makeheaders token definitions *************************/ -%% -/**************** End makeheaders token definitions ***************************/ - -/* The next sections is a series of control #defines. -** various aspects of the generated parser. -** YYCODETYPE is the data type used to store the integer codes -** that represent terminal and non-terminal symbols. -** "unsigned char" is used if there are fewer than -** 256 symbols. Larger types otherwise. -** YYNOCODE is a number of type YYCODETYPE that is not used for -** any terminal or nonterminal symbol. -** YYFALLBACK If defined, this indicates that one or more tokens -** (also known as: "terminal symbols") have fall-back -** values which should be used if the original symbol -** would not parse. This permits keywords to sometimes -** be used as identifiers, for example. -** YYACTIONTYPE is the data type used for "action codes" - numbers -** that indicate what to do in response to the next -** token. -** ParseTOKENTYPE is the data type used for minor type for terminal -** symbols. Background: A "minor type" is a semantic -** value associated with a terminal or non-terminal -** symbols. For example, for an "ID" terminal symbol, -** the minor type might be the name of the identifier. -** Each non-terminal can have a different minor type. -** Terminal symbols all have the same minor type, though. -** This macros defines the minor type for terminal -** symbols. -** YYMINORTYPE is the data type used for all minor types. -** This is typically a union of many types, one of -** which is ParseTOKENTYPE. The entry in the union -** for terminal symbols is called "yy0". -** YYSTACKDEPTH is the maximum depth of the parser's stack. If -** zero the stack is dynamically sized using realloc() -** ParseARG_SDECL A static variable declaration for the %extra_argument -** ParseARG_PDECL A parameter declaration for the %extra_argument -** ParseARG_STORE Code to store %extra_argument into yypParser -** ParseARG_FETCH Code to extract %extra_argument from yypParser -** YYERRORSYMBOL is the code number of the error symbol. If not -** defined, then do no error processing. -** YYNSTATE the combined number of states. -** YYNRULE the number of rules in the grammar -** YY_MAX_SHIFT Maximum value for shift actions -** YY_MIN_SHIFTREDUCE Minimum value for shift-reduce actions -** YY_MAX_SHIFTREDUCE Maximum value for shift-reduce actions -** YY_MIN_REDUCE Minimum value for reduce actions -** YY_MAX_REDUCE Maximum value for reduce actions -** YY_ERROR_ACTION The yy_action[] code for syntax error -** YY_ACCEPT_ACTION The yy_action[] code for accept -** YY_NO_ACTION The yy_action[] code for no-op -*/ -#ifndef INTERFACE -# define INTERFACE 1 -#endif -/************* Begin control #defines *****************************************/ -%% -/************* End control #defines *******************************************/ - -/* Define the yytestcase() macro to be a no-op if is not already defined -** otherwise. -** -** Applications can choose to define yytestcase() in the %include section -** to a macro that can assist in verifying code coverage. For production -** code the yytestcase() macro should be turned off. But it is useful -** for testing. -*/ -#ifndef yytestcase -# define yytestcase(X) -#endif - - -/* Next are the tables used to determine what action to take based on the -** current state and lookahead token. These tables are used to implement -** functions that take a state number and lookahead value and return an -** action integer. -** -** Suppose the action integer is N. Then the action is determined as -** follows -** -** 0 <= N <= YY_MAX_SHIFT Shift N. That is, push the lookahead -** token onto the stack and goto state N. -** -** N between YY_MIN_SHIFTREDUCE Shift to an arbitrary state then -** and YY_MAX_SHIFTREDUCE reduce by rule N-YY_MIN_SHIFTREDUCE. -** -** N between YY_MIN_REDUCE Reduce by rule N-YY_MIN_REDUCE -** and YY_MAX_REDUCE -** -** N == YY_ERROR_ACTION A syntax error has occurred. -** -** N == YY_ACCEPT_ACTION The parser accepts its input. -** -** N == YY_NO_ACTION No such action. Denotes unused -** slots in the yy_action[] table. -** -** The action table is constructed as a single large table named yy_action[]. -** Given state S and lookahead X, the action is computed as either: -** -** (A) N = yy_action[ yy_shift_ofst[S] + X ] -** (B) N = yy_default[S] -** -** The (A) formula is preferred. The B formula is used instead if: -** (1) The yy_shift_ofst[S]+X value is out of range, or -** (2) yy_lookahead[yy_shift_ofst[S]+X] is not equal to X, or -** (3) yy_shift_ofst[S] equal YY_SHIFT_USE_DFLT. -** (Implementation note: YY_SHIFT_USE_DFLT is chosen so that -** YY_SHIFT_USE_DFLT+X will be out of range for all possible lookaheads X. -** Hence only tests (1) and (2) need to be evaluated.) -** -** The formulas above are for computing the action when the lookahead is -** a terminal symbol. If the lookahead is a non-terminal (as occurs after -** a reduce action) then the yy_reduce_ofst[] array is used in place of -** the yy_shift_ofst[] array and YY_REDUCE_USE_DFLT is used in place of -** YY_SHIFT_USE_DFLT. -** -** The following are the tables generated in this section: -** -** yy_action[] A single table containing all actions. -** yy_lookahead[] A table containing the lookahead for each entry in -** yy_action. Used to detect hash collisions. -** yy_shift_ofst[] For each state, the offset into yy_action for -** shifting terminals. -** yy_reduce_ofst[] For each state, the offset into yy_action for -** shifting non-terminals after a reduce. -** yy_default[] Default action for each state. -** -*********** Begin parsing tables **********************************************/ -%% -/********** End of lemon-generated parsing tables *****************************/ - -/* The next table maps tokens (terminal symbols) into fallback tokens. -** If a construct like the following: -** -** %fallback ID X Y Z. -** -** appears in the grammar, then ID becomes a fallback token for X, Y, -** and Z. Whenever one of the tokens X, Y, or Z is input to the parser -** but it does not parse, the type of the token is changed to ID and -** the parse is retried before an error is thrown. -** -** This feature can be used, for example, to cause some keywords in a language -** to revert to identifiers if they keyword does not apply in the context where -** it appears. -*/ -#ifdef YYFALLBACK -static const YYCODETYPE yyFallback[] = { -%% -}; -#endif /* YYFALLBACK */ - -/* The following structure represents a single element of the -** parser's stack. Information stored includes: -** -** + The state number for the parser at this level of the stack. -** -** + The value of the token stored at this level of the stack. -** (In other words, the "major" token.) -** -** + The semantic value stored at this level of the stack. This is -** the information used by the action routines in the grammar. -** It is sometimes called the "minor" token. -** -** After the "shift" half of a SHIFTREDUCE action, the stateno field -** actually contains the reduce action for the second half of the -** SHIFTREDUCE. -*/ -struct yyStackEntry { - YYACTIONTYPE stateno; /* The state-number, or reduce action in SHIFTREDUCE */ - YYCODETYPE major; /* The major token value. This is the code - ** number for the token at this stack level */ - YYMINORTYPE minor; /* The user-supplied minor token value. This - ** is the value of the token */ -}; -typedef struct yyStackEntry yyStackEntry; - -/* The state of the parser is completely contained in an instance of -** the following structure */ -struct yyParser { - yyStackEntry *yytos; /* Pointer to top element of the stack */ -#ifdef YYTRACKMAXSTACKDEPTH - int yyhwm; /* High-water mark of the stack */ -#endif -#ifndef YYNOERRORRECOVERY - int yyerrcnt; /* Shifts left before out of the error */ -#endif - ParseARG_SDECL /* A place to hold %extra_argument */ -#if YYSTACKDEPTH<=0 - int yystksz; /* Current side of the stack */ - yyStackEntry *yystack; /* The parser's stack */ - yyStackEntry yystk0; /* First stack entry */ -#else - yyStackEntry yystack[YYSTACKDEPTH]; /* The parser's stack */ - yyStackEntry *yystackEnd; /* Last entry in the stack */ -#endif -}; -typedef struct yyParser yyParser; - -#ifndef NDEBUG -#include -static FILE *yyTraceFILE = 0; -static char *yyTracePrompt = 0; -#endif /* NDEBUG */ - -#ifndef NDEBUG -/* -** Turn parser tracing on by giving a stream to which to write the trace -** and a prompt to preface each trace message. Tracing is turned off -** by making either argument NULL -** -** Inputs: -**

    -**
  • A FILE* to which trace output should be written. -** If NULL, then tracing is turned off. -**
  • A prefix string written at the beginning of every -** line of trace output. If NULL, then tracing is -** turned off. -**
-** -** Outputs: -** None. -*/ -void ParseTrace(FILE *TraceFILE, char *zTracePrompt){ - yyTraceFILE = TraceFILE; - yyTracePrompt = zTracePrompt; - if( yyTraceFILE==0 ) yyTracePrompt = 0; - else if( yyTracePrompt==0 ) yyTraceFILE = 0; -} -#endif /* NDEBUG */ - -#ifndef NDEBUG -/* For tracing shifts, the names of all terminals and nonterminals -** are required. The following table supplies these names */ -static const char *const yyTokenName[] = { -%% -}; -#endif /* NDEBUG */ - -#ifndef NDEBUG -/* For tracing reduce actions, the names of all rules are required. -*/ -static const char *const yyRuleName[] = { -%% -}; -#endif /* NDEBUG */ - - -#if YYSTACKDEPTH<=0 -/* -** Try to increase the size of the parser stack. Return the number -** of errors. Return 0 on success. -*/ -static int yyGrowStack(yyParser *p){ - int newSize; - int idx; - yyStackEntry *pNew; - - newSize = p->yystksz*2 + 100; - idx = p->yytos ? (int)(p->yytos - p->yystack) : 0; - if( p->yystack==&p->yystk0 ){ - pNew = malloc(newSize*sizeof(pNew[0])); - if( pNew ) pNew[0] = p->yystk0; - }else{ - pNew = realloc(p->yystack, newSize*sizeof(pNew[0])); - } - if( pNew ){ - p->yystack = pNew; - p->yytos = &p->yystack[idx]; -#ifndef NDEBUG - if( yyTraceFILE ){ - fprintf(yyTraceFILE,"%sStack grows from %d to %d entries.\n", - yyTracePrompt, p->yystksz, newSize); - } -#endif - p->yystksz = newSize; - } - return pNew==0; -} -#endif - -/* Datatype of the argument to the memory allocated passed as the -** second argument to ParseAlloc() below. This can be changed by -** putting an appropriate #define in the %include section of the input -** grammar. -*/ -#ifndef YYMALLOCARGTYPE -# define YYMALLOCARGTYPE size_t -#endif - -/* Initialize a new parser that has already been allocated. -*/ -void ParseInit(void *yypParser){ - yyParser *pParser = (yyParser*)yypParser; -#ifdef YYTRACKMAXSTACKDEPTH - pParser->yyhwm = 0; -#endif -#if YYSTACKDEPTH<=0 - pParser->yytos = NULL; - pParser->yystack = NULL; - pParser->yystksz = 0; - if( yyGrowStack(pParser) ){ - pParser->yystack = &pParser->yystk0; - pParser->yystksz = 1; - } -#endif -#ifndef YYNOERRORRECOVERY - pParser->yyerrcnt = -1; -#endif - pParser->yytos = pParser->yystack; - pParser->yystack[0].stateno = 0; - pParser->yystack[0].major = 0; -#if YYSTACKDEPTH>0 - pParser->yystackEnd = &pParser->yystack[YYSTACKDEPTH-1]; -#endif -} - -#ifndef Parse_ENGINEALWAYSONSTACK -/* -** This function allocates a new parser. -** The only argument is a pointer to a function which works like -** malloc. -** -** Inputs: -** A pointer to the function used to allocate memory. -** -** Outputs: -** A pointer to a parser. This pointer is used in subsequent calls -** to Parse and ParseFree. -*/ -void *ParseAlloc(void *(*mallocProc)(YYMALLOCARGTYPE)){ - yyParser *pParser; - pParser = (yyParser*)(*mallocProc)( (YYMALLOCARGTYPE)sizeof(yyParser) ); - if( pParser ) ParseInit(pParser); - return pParser; -} -#endif /* Parse_ENGINEALWAYSONSTACK */ - - -/* The following function deletes the "minor type" or semantic value -** associated with a symbol. The symbol can be either a terminal -** or nonterminal. "yymajor" is the symbol code, and "yypminor" is -** a pointer to the value to be deleted. The code used to do the -** deletions is derived from the %destructor and/or %token_destructor -** directives of the input grammar. -*/ -static void yy_destructor( - yyParser *yypParser, /* The parser */ - YYCODETYPE yymajor, /* Type code for object to destroy */ - YYMINORTYPE *yypminor /* The object to be destroyed */ -){ - ParseARG_FETCH; - switch( yymajor ){ - /* Here is inserted the actions which take place when a - ** terminal or non-terminal is destroyed. This can happen - ** when the symbol is popped from the stack during a - ** reduce or during error processing or when a parser is - ** being destroyed before it is finished parsing. - ** - ** Note: during a reduce, the only symbols destroyed are those - ** which appear on the RHS of the rule, but which are *not* used - ** inside the C code. - */ -/********* Begin destructor definitions ***************************************/ -%% -/********* End destructor definitions *****************************************/ - default: break; /* If no destructor action specified: do nothing */ - } -} - -/* -** Pop the parser's stack once. -** -** If there is a destructor routine associated with the token which -** is popped from the stack, then call it. -*/ -static void yy_pop_parser_stack(yyParser *pParser){ - yyStackEntry *yytos; - assert( pParser->yytos!=0 ); - assert( pParser->yytos > pParser->yystack ); - yytos = pParser->yytos--; -#ifndef NDEBUG - if( yyTraceFILE ){ - fprintf(yyTraceFILE,"%sPopping %s\n", - yyTracePrompt, - yyTokenName[yytos->major]); - } -#endif - yy_destructor(pParser, yytos->major, &yytos->minor); -} - -/* -** Clear all secondary memory allocations from the parser -*/ -void ParseFinalize(void *p){ - yyParser *pParser = (yyParser*)p; - while( pParser->yytos>pParser->yystack ) yy_pop_parser_stack(pParser); -#if YYSTACKDEPTH<=0 - if( pParser->yystack!=&pParser->yystk0 ) free(pParser->yystack); -#endif -} - -#ifndef Parse_ENGINEALWAYSONSTACK -/* -** Deallocate and destroy a parser. Destructors are called for -** all stack elements before shutting the parser down. -** -** If the YYPARSEFREENEVERNULL macro exists (for example because it -** is defined in a %include section of the input grammar) then it is -** assumed that the input pointer is never NULL. -*/ -void ParseFree( - void *p, /* The parser to be deleted */ - void (*freeProc)(void*) /* Function used to reclaim memory */ -){ -#ifndef YYPARSEFREENEVERNULL - if( p==0 ) return; -#endif - ParseFinalize(p); - (*freeProc)(p); -} -#endif /* Parse_ENGINEALWAYSONSTACK */ - -/* -** Return the peak depth of the stack for a parser. -*/ -#ifdef YYTRACKMAXSTACKDEPTH -int ParseStackPeak(void *p){ - yyParser *pParser = (yyParser*)p; - return pParser->yyhwm; -} -#endif - -/* -** Find the appropriate action for a parser given the terminal -** look-ahead token iLookAhead. -*/ -static unsigned int yy_find_shift_action( - yyParser *pParser, /* The parser */ - YYCODETYPE iLookAhead /* The look-ahead token */ -){ - int i; - int stateno = pParser->yytos->stateno; - - if( stateno>=YY_MIN_REDUCE ) return stateno; - assert( stateno <= YY_SHIFT_COUNT ); - do{ - i = yy_shift_ofst[stateno]; - assert( iLookAhead!=YYNOCODE ); - i += iLookAhead; - if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){ -#ifdef YYFALLBACK - YYCODETYPE iFallback; /* Fallback token */ - if( iLookAhead %s\n", - yyTracePrompt, yyTokenName[iLookAhead], yyTokenName[iFallback]); - } -#endif - assert( yyFallback[iFallback]==0 ); /* Fallback loop must terminate */ - iLookAhead = iFallback; - continue; - } -#endif -#ifdef YYWILDCARD - { - int j = i - iLookAhead + YYWILDCARD; - if( -#if YY_SHIFT_MIN+YYWILDCARD<0 - j>=0 && -#endif -#if YY_SHIFT_MAX+YYWILDCARD>=YY_ACTTAB_COUNT - j0 - ){ -#ifndef NDEBUG - if( yyTraceFILE ){ - fprintf(yyTraceFILE, "%sWILDCARD %s => %s\n", - yyTracePrompt, yyTokenName[iLookAhead], - yyTokenName[YYWILDCARD]); - } -#endif /* NDEBUG */ - return yy_action[j]; - } - } -#endif /* YYWILDCARD */ - return yy_default[stateno]; - }else{ - return yy_action[i]; - } - }while(1); -} - -/* -** Find the appropriate action for a parser given the non-terminal -** look-ahead token iLookAhead. -*/ -static int yy_find_reduce_action( - int stateno, /* Current state number */ - YYCODETYPE iLookAhead /* The look-ahead token */ -){ - int i; -#ifdef YYERRORSYMBOL - if( stateno>YY_REDUCE_COUNT ){ - return yy_default[stateno]; - } -#else - assert( stateno<=YY_REDUCE_COUNT ); -#endif - i = yy_reduce_ofst[stateno]; - assert( i!=YY_REDUCE_USE_DFLT ); - assert( iLookAhead!=YYNOCODE ); - i += iLookAhead; -#ifdef YYERRORSYMBOL - if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){ - return yy_default[stateno]; - } -#else - assert( i>=0 && iyytos>yypParser->yystack ) yy_pop_parser_stack(yypParser); - /* Here code is inserted which will execute if the parser - ** stack every overflows */ -/******** Begin %stack_overflow code ******************************************/ -%% -/******** End %stack_overflow code ********************************************/ - ParseARG_STORE; /* Suppress warning about unused %extra_argument var */ -} - -/* -** Print tracing information for a SHIFT action -*/ -#ifndef NDEBUG -static void yyTraceShift(yyParser *yypParser, int yyNewState){ - if( yyTraceFILE ){ - if( yyNewStateyytos->major], - yyNewState); - }else{ - fprintf(yyTraceFILE,"%sShift '%s'\n", - yyTracePrompt,yyTokenName[yypParser->yytos->major]); - } - } -} -#else -# define yyTraceShift(X,Y) -#endif - -/* -** Perform a shift action. -*/ -static void yy_shift( - yyParser *yypParser, /* The parser to be shifted */ - int yyNewState, /* The new state to shift in */ - int yyMajor, /* The major token to shift in */ - ParseTOKENTYPE yyMinor /* The minor token to shift in */ -){ - yyStackEntry *yytos; - yypParser->yytos++; -#ifdef YYTRACKMAXSTACKDEPTH - if( (int)(yypParser->yytos - yypParser->yystack)>yypParser->yyhwm ){ - yypParser->yyhwm++; - assert( yypParser->yyhwm == (int)(yypParser->yytos - yypParser->yystack) ); - } -#endif -#if YYSTACKDEPTH>0 - if( yypParser->yytos>yypParser->yystackEnd ){ - yypParser->yytos--; - yyStackOverflow(yypParser); - return; - } -#else - if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz] ){ - if( yyGrowStack(yypParser) ){ - yypParser->yytos--; - yyStackOverflow(yypParser); - return; - } - } -#endif - if( yyNewState > YY_MAX_SHIFT ){ - yyNewState += YY_MIN_REDUCE - YY_MIN_SHIFTREDUCE; - } - yytos = yypParser->yytos; - yytos->stateno = (YYACTIONTYPE)yyNewState; - yytos->major = (YYCODETYPE)yyMajor; - yytos->minor.yy0 = yyMinor; - yyTraceShift(yypParser, yyNewState); -} - -/* The following table contains information about every rule that -** is used during the reduce. -*/ -static const struct { - YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */ - signed char nrhs; /* Negative of the number of RHS symbols in the rule */ -} yyRuleInfo[] = { -%% -}; - -static void yy_accept(yyParser*); /* Forward Declaration */ - -/* -** Perform a reduce action and the shift that must immediately -** follow the reduce. -** -** The yyLookahead and yyLookaheadToken parameters provide reduce actions -** access to the lookahead token (if any). The yyLookahead will be YYNOCODE -** if the lookahead token has already been consumed. As this procedure is -** only called from one place, optimizing compilers will in-line it, which -** means that the extra parameters have no performance impact. -*/ -static void yy_reduce( - yyParser *yypParser, /* The parser */ - unsigned int yyruleno, /* Number of the rule by which to reduce */ - int yyLookahead, /* Lookahead token, or YYNOCODE if none */ - ParseTOKENTYPE yyLookaheadToken /* Value of the lookahead token */ -){ - int yygoto; /* The next state */ - int yyact; /* The next action */ - yyStackEntry *yymsp; /* The top of the parser's stack */ - int yysize; /* Amount to pop the stack */ - ParseARG_FETCH; - yymsp = yypParser->yytos; -#ifndef NDEBUG - if( yyTraceFILE && yyruleno<(int)(sizeof(yyRuleName)/sizeof(yyRuleName[0])) ){ - yysize = yyRuleInfo[yyruleno].nrhs; - fprintf(yyTraceFILE, "%sReduce [%s], go to state %d.\n", yyTracePrompt, - yyRuleName[yyruleno], yymsp[yysize].stateno); - } -#endif /* NDEBUG */ - - /* Check that the stack is large enough to grow by a single entry - ** if the RHS of the rule is empty. This ensures that there is room - ** enough on the stack to push the LHS value */ - if( yyRuleInfo[yyruleno].nrhs==0 ){ -#ifdef YYTRACKMAXSTACKDEPTH - if( (int)(yypParser->yytos - yypParser->yystack)>yypParser->yyhwm ){ - yypParser->yyhwm++; - assert( yypParser->yyhwm == (int)(yypParser->yytos - yypParser->yystack)); - } -#endif -#if YYSTACKDEPTH>0 - if( yypParser->yytos>=yypParser->yystackEnd ){ - yyStackOverflow(yypParser); - return; - } -#else - if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz-1] ){ - if( yyGrowStack(yypParser) ){ - yyStackOverflow(yypParser); - return; - } - yymsp = yypParser->yytos; - } -#endif - } - - switch( yyruleno ){ - /* Beginning here are the reduction cases. A typical example - ** follows: - ** case 0: - ** #line - ** { ... } // User supplied code - ** #line - ** break; - */ -/********** Begin reduce actions **********************************************/ -%% -/********** End reduce actions ************************************************/ - }; - assert( yyrulenoYY_MAX_SHIFT && yyact<=YY_MAX_SHIFTREDUCE) ); - - /* It is not possible for a REDUCE to be followed by an error */ - assert( yyact!=YY_ERROR_ACTION ); - - if( yyact==YY_ACCEPT_ACTION ){ - yypParser->yytos += yysize; - yy_accept(yypParser); - }else{ - yymsp += yysize+1; - yypParser->yytos = yymsp; - yymsp->stateno = (YYACTIONTYPE)yyact; - yymsp->major = (YYCODETYPE)yygoto; - yyTraceShift(yypParser, yyact); - } -} - -/* -** The following code executes when the parse fails -*/ -#ifndef YYNOERRORRECOVERY -static void yy_parse_failed( - yyParser *yypParser /* The parser */ -){ - ParseARG_FETCH; -#ifndef NDEBUG - if( yyTraceFILE ){ - fprintf(yyTraceFILE,"%sFail!\n",yyTracePrompt); - } -#endif - while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser); - /* Here code is inserted which will be executed whenever the - ** parser fails */ -/************ Begin %parse_failure code ***************************************/ -%% -/************ End %parse_failure code *****************************************/ - ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */ -} -#endif /* YYNOERRORRECOVERY */ - -/* -** The following code executes when a syntax error first occurs. -*/ -static void yy_syntax_error( - yyParser *yypParser, /* The parser */ - int yymajor, /* The major type of the error token */ - ParseTOKENTYPE yyminor /* The minor type of the error token */ -){ - ParseARG_FETCH; -#define TOKEN yyminor -/************ Begin %syntax_error code ****************************************/ -%% -/************ End %syntax_error code ******************************************/ - ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */ -} - -/* -** The following is executed when the parser accepts -*/ -static void yy_accept( - yyParser *yypParser /* The parser */ -){ - ParseARG_FETCH; -#ifndef NDEBUG - if( yyTraceFILE ){ - fprintf(yyTraceFILE,"%sAccept!\n",yyTracePrompt); - } -#endif -#ifndef YYNOERRORRECOVERY - yypParser->yyerrcnt = -1; -#endif - assert( yypParser->yytos==yypParser->yystack ); - /* Here code is inserted which will be executed whenever the - ** parser accepts */ -/*********** Begin %parse_accept code *****************************************/ -%% -/*********** End %parse_accept code *******************************************/ - ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */ -} - -/* The main parser program. -** The first argument is a pointer to a structure obtained from -** "ParseAlloc" which describes the current state of the parser. -** The second argument is the major token number. The third is -** the minor token. The fourth optional argument is whatever the -** user wants (and specified in the grammar) and is available for -** use by the action routines. -** -** Inputs: -**
    -**
  • A pointer to the parser (an opaque structure.) -**
  • The major token number. -**
  • The minor token number. -**
  • An option argument of a grammar-specified type. -**
-** -** Outputs: -** None. -*/ -void Parse( - void *yyp, /* The parser */ - int yymajor, /* The major token code number */ - ParseTOKENTYPE yyminor /* The value for the token */ - ParseARG_PDECL /* Optional %extra_argument parameter */ -){ - YYMINORTYPE yyminorunion; - unsigned int yyact; /* The parser action. */ -#if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY) - int yyendofinput; /* True if we are at the end of input */ -#endif -#ifdef YYERRORSYMBOL - int yyerrorhit = 0; /* True if yymajor has invoked an error */ -#endif - yyParser *yypParser; /* The parser */ - - yypParser = (yyParser*)yyp; - assert( yypParser->yytos!=0 ); -#if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY) - yyendofinput = (yymajor==0); -#endif - ParseARG_STORE; - -#ifndef NDEBUG - if( yyTraceFILE ){ - fprintf(yyTraceFILE,"%sInput '%s'\n",yyTracePrompt,yyTokenName[yymajor]); - } -#endif - - do{ - yyact = yy_find_shift_action(yypParser,(YYCODETYPE)yymajor); - if( yyact <= YY_MAX_SHIFTREDUCE ){ - yy_shift(yypParser,yyact,yymajor,yyminor); -#ifndef YYNOERRORRECOVERY - yypParser->yyerrcnt--; -#endif - yymajor = YYNOCODE; - }else if( yyact <= YY_MAX_REDUCE ){ - yy_reduce(yypParser,yyact-YY_MIN_REDUCE,yymajor,yyminor); - }else{ - assert( yyact == YY_ERROR_ACTION ); - yyminorunion.yy0 = yyminor; -#ifdef YYERRORSYMBOL - int yymx; -#endif -#ifndef NDEBUG - if( yyTraceFILE ){ - fprintf(yyTraceFILE,"%sSyntax Error!\n",yyTracePrompt); - } -#endif -#ifdef YYERRORSYMBOL - /* A syntax error has occurred. - ** The response to an error depends upon whether or not the - ** grammar defines an error token "ERROR". - ** - ** This is what we do if the grammar does define ERROR: - ** - ** * Call the %syntax_error function. - ** - ** * Begin popping the stack until we enter a state where - ** it is legal to shift the error symbol, then shift - ** the error symbol. - ** - ** * Set the error count to three. - ** - ** * Begin accepting and shifting new tokens. No new error - ** processing will occur until three tokens have been - ** shifted successfully. - ** - */ - if( yypParser->yyerrcnt<0 ){ - yy_syntax_error(yypParser,yymajor,yyminor); - } - yymx = yypParser->yytos->major; - if( yymx==YYERRORSYMBOL || yyerrorhit ){ -#ifndef NDEBUG - if( yyTraceFILE ){ - fprintf(yyTraceFILE,"%sDiscard input token %s\n", - yyTracePrompt,yyTokenName[yymajor]); - } -#endif - yy_destructor(yypParser, (YYCODETYPE)yymajor, &yyminorunion); - yymajor = YYNOCODE; - }else{ - while( yypParser->yytos >= yypParser->yystack - && yymx != YYERRORSYMBOL - && (yyact = yy_find_reduce_action( - yypParser->yytos->stateno, - YYERRORSYMBOL)) >= YY_MIN_REDUCE - ){ - yy_pop_parser_stack(yypParser); - } - if( yypParser->yytos < yypParser->yystack || yymajor==0 ){ - yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); - yy_parse_failed(yypParser); -#ifndef YYNOERRORRECOVERY - yypParser->yyerrcnt = -1; -#endif - yymajor = YYNOCODE; - }else if( yymx!=YYERRORSYMBOL ){ - yy_shift(yypParser,yyact,YYERRORSYMBOL,yyminor); - } - } - yypParser->yyerrcnt = 3; - yyerrorhit = 1; -#elif defined(YYNOERRORRECOVERY) - /* If the YYNOERRORRECOVERY macro is defined, then do not attempt to - ** do any kind of error recovery. Instead, simply invoke the syntax - ** error routine and continue going as if nothing had happened. - ** - ** Applications can set this macro (for example inside %include) if - ** they intend to abandon the parse upon the first syntax error seen. - */ - yy_syntax_error(yypParser,yymajor, yyminor); - yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); - yymajor = YYNOCODE; - -#else /* YYERRORSYMBOL is not defined */ - /* This is what we do if the grammar does not define ERROR: - ** - ** * Report an error message, and throw away the input token. - ** - ** * If the input token is $, then fail the parse. - ** - ** As before, subsequent error messages are suppressed until - ** three input tokens have been successfully shifted. - */ - if( yypParser->yyerrcnt<=0 ){ - yy_syntax_error(yypParser,yymajor, yyminor); - } - yypParser->yyerrcnt = 3; - yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); - if( yyendofinput ){ - yy_parse_failed(yypParser); -#ifndef YYNOERRORRECOVERY - yypParser->yyerrcnt = -1; -#endif - } - yymajor = YYNOCODE; -#endif - } - }while( yymajor!=YYNOCODE && yypParser->yytos>yypParser->yystack ); -#ifndef NDEBUG - if( yyTraceFILE ){ - yyStackEntry *i; - char cDiv = '['; - fprintf(yyTraceFILE,"%sReturn. Stack=",yyTracePrompt); - for(i=&yypParser->yystack[1]; i<=yypParser->yytos; i++){ - fprintf(yyTraceFILE,"%c%s", cDiv, yyTokenName[i->major]); - cDiv = ' '; - } - fprintf(yyTraceFILE,"]\n"); - } -#endif - return; -} diff --git a/tools/lemon/lemon.c b/tools/lemon/lemon.c deleted file mode 100644 index acf2483ef..000000000 --- a/tools/lemon/lemon.c +++ /dev/null @@ -1,5466 +0,0 @@ -/* -** This file contains all sources (including headers) to the LEMON -** LALR(1) parser generator. The sources have been combined into a -** single file to make it easy to include LEMON in the source tree -** and Makefile of another program. -** -** The author of this program disclaims copyright. -*/ -#include -#include -#include -#include -#include -#include - -#define ISSPACE(X) isspace((unsigned char)(X)) -#define ISDIGIT(X) isdigit((unsigned char)(X)) -#define ISALNUM(X) isalnum((unsigned char)(X)) -#define ISALPHA(X) isalpha((unsigned char)(X)) -#define ISUPPER(X) isupper((unsigned char)(X)) -#define ISLOWER(X) islower((unsigned char)(X)) - - -#ifndef __WIN32__ -# if defined(_WIN32) || defined(WIN32) -# define __WIN32__ -# endif -#endif - -#ifdef __WIN32__ -#ifdef __cplusplus -extern "C" { -#endif -extern int access(const char *path, int mode); -#ifdef __cplusplus -} -#endif -#else -#include -#endif - -/* #define PRIVATE static */ -#define PRIVATE - -#ifdef TEST -#define MAXRHS 5 /* Set low to exercise exception code */ -#else -#define MAXRHS 1000 -#endif - -static int showPrecedenceConflict = 0; -static char *msort(char*,char**,int(*)(const char*,const char*)); - -/* -** Compilers are getting increasingly pedantic about type conversions -** as C evolves ever closer to Ada.... To work around the latest problems -** we have to define the following variant of strlen(). -*/ -#define lemonStrlen(X) ((int)strlen(X)) - -/* -** Compilers are starting to complain about the use of sprintf() and strcpy(), -** saying they are unsafe. So we define our own versions of those routines too. -** -** There are three routines here: lemon_sprintf(), lemon_vsprintf(), and -** lemon_addtext(). The first two are replacements for sprintf() and vsprintf(). -** The third is a helper routine for vsnprintf() that adds texts to the end of a -** buffer, making sure the buffer is always zero-terminated. -** -** The string formatter is a minimal subset of stdlib sprintf() supporting only -** a few simply conversions: -** -** %d -** %s -** %.*s -** -*/ -static void lemon_addtext( - char *zBuf, /* The buffer to which text is added */ - int *pnUsed, /* Slots of the buffer used so far */ - const char *zIn, /* Text to add */ - int nIn, /* Bytes of text to add. -1 to use strlen() */ - int iWidth /* Field width. Negative to left justify */ -){ - if( nIn<0 ) for(nIn=0; zIn[nIn]; nIn++){} - while( iWidth>nIn ){ zBuf[(*pnUsed)++] = ' '; iWidth--; } - if( nIn==0 ) return; - memcpy(&zBuf[*pnUsed], zIn, nIn); - *pnUsed += nIn; - while( (-iWidth)>nIn ){ zBuf[(*pnUsed)++] = ' '; iWidth++; } - zBuf[*pnUsed] = 0; -} -static int lemon_vsprintf(char *str, const char *zFormat, va_list ap){ - int i, j, k, c; - int nUsed = 0; - const char *z; - char zTemp[50]; - str[0] = 0; - for(i=j=0; (c = zFormat[i])!=0; i++){ - if( c=='%' ){ - int iWidth = 0; - lemon_addtext(str, &nUsed, &zFormat[j], i-j, 0); - c = zFormat[++i]; - if( ISDIGIT(c) || (c=='-' && ISDIGIT(zFormat[i+1])) ){ - if( c=='-' ) i++; - while( ISDIGIT(zFormat[i]) ) iWidth = iWidth*10 + zFormat[i++] - '0'; - if( c=='-' ) iWidth = -iWidth; - c = zFormat[i]; - } - if( c=='d' ){ - int v = va_arg(ap, int); - if( v<0 ){ - lemon_addtext(str, &nUsed, "-", 1, iWidth); - v = -v; - }else if( v==0 ){ - lemon_addtext(str, &nUsed, "0", 1, iWidth); - } - k = 0; - while( v>0 ){ - k++; - zTemp[sizeof(zTemp)-k] = (v%10) + '0'; - v /= 10; - } - lemon_addtext(str, &nUsed, &zTemp[sizeof(zTemp)-k], k, iWidth); - }else if( c=='s' ){ - z = va_arg(ap, const char*); - lemon_addtext(str, &nUsed, z, -1, iWidth); - }else if( c=='.' && memcmp(&zFormat[i], ".*s", 3)==0 ){ - i += 2; - k = va_arg(ap, int); - z = va_arg(ap, const char*); - lemon_addtext(str, &nUsed, z, k, iWidth); - }else if( c=='%' ){ - lemon_addtext(str, &nUsed, "%", 1, 0); - }else{ - fprintf(stderr, "illegal format\n"); - exit(1); - } - j = i+1; - } - } - lemon_addtext(str, &nUsed, &zFormat[j], i-j, 0); - return nUsed; -} -static int lemon_sprintf(char *str, const char *format, ...){ - va_list ap; - int rc; - va_start(ap, format); - rc = lemon_vsprintf(str, format, ap); - va_end(ap); - return rc; -} -static void lemon_strcpy(char *dest, const char *src){ - while( (*(dest++) = *(src++))!=0 ){} -} -static void lemon_strcat(char *dest, const char *src){ - while( *dest ) dest++; - lemon_strcpy(dest, src); -} - - -/* a few forward declarations... */ -struct rule; -struct lemon; -struct action; - -static struct action *Action_new(void); -static struct action *Action_sort(struct action *); - -/********** From the file "build.h" ************************************/ -void FindRulePrecedences(struct lemon*); -void FindFirstSets(struct lemon*); -void FindStates(struct lemon*); -void FindLinks(struct lemon*); -void FindFollowSets(struct lemon*); -void FindActions(struct lemon*); - -/********* From the file "configlist.h" *********************************/ -void Configlist_init(void); -struct config *Configlist_add(struct rule *, int); -struct config *Configlist_addbasis(struct rule *, int); -void Configlist_closure(struct lemon *); -void Configlist_sort(void); -void Configlist_sortbasis(void); -struct config *Configlist_return(void); -struct config *Configlist_basis(void); -void Configlist_eat(struct config *); -void Configlist_reset(void); - -/********* From the file "error.h" ***************************************/ -void ErrorMsg(const char *, int,const char *, ...); - -/****** From the file "option.h" ******************************************/ -enum option_type { OPT_FLAG=1, OPT_INT, OPT_DBL, OPT_STR, - OPT_FFLAG, OPT_FINT, OPT_FDBL, OPT_FSTR}; -struct s_options { - enum option_type type; - const char *label; - char *arg; - const char *message; -}; -int OptInit(char**,struct s_options*,FILE*); -int OptNArgs(void); -char *OptArg(int); -void OptErr(int); -void OptPrint(void); - -/******** From the file "parse.h" *****************************************/ -void Parse(struct lemon *lemp); - -/********* From the file "plink.h" ***************************************/ -struct plink *Plink_new(void); -void Plink_add(struct plink **, struct config *); -void Plink_copy(struct plink **, struct plink *); -void Plink_delete(struct plink *); - -/********** From the file "report.h" *************************************/ -void Reprint(struct lemon *); -void ReportOutput(struct lemon *); -void ReportTable(struct lemon *, int); -void ReportHeader(struct lemon *); -void CompressTables(struct lemon *); -void ResortStates(struct lemon *); - -/********** From the file "set.h" ****************************************/ -void SetSize(int); /* All sets will be of size N */ -char *SetNew(void); /* A new set for element 0..N */ -void SetFree(char*); /* Deallocate a set */ -int SetAdd(char*,int); /* Add element to a set */ -int SetUnion(char *,char *); /* A <- A U B, thru element N */ -#define SetFind(X,Y) (X[Y]) /* True if Y is in set X */ - -/********** From the file "struct.h" *************************************/ -/* -** Principal data structures for the LEMON parser generator. -*/ - -typedef enum {LEMON_FALSE=0, LEMON_TRUE} Boolean; - -/* Symbols (terminals and nonterminals) of the grammar are stored -** in the following: */ -enum symbol_type { - TERMINAL, - NONTERMINAL, - MULTITERMINAL -}; -enum e_assoc { - LEFT, - RIGHT, - NONE, - UNK -}; -struct symbol { - const char *name; /* Name of the symbol */ - int index; /* Index number for this symbol */ - enum symbol_type type; /* Symbols are all either TERMINALS or NTs */ - struct rule *rule; /* Linked list of rules of this (if an NT) */ - struct symbol *fallback; /* fallback token in case this token doesn't parse */ - int prec; /* Precedence if defined (-1 otherwise) */ - enum e_assoc assoc; /* Associativity if precedence is defined */ - char *firstset; /* First-set for all rules of this symbol */ - Boolean lambda; /* True if NT and can generate an empty string */ - int useCnt; /* Number of times used */ - char *destructor; /* Code which executes whenever this symbol is - ** popped from the stack during error processing */ - int destLineno; /* Line number for start of destructor. Set to - ** -1 for duplicate destructors. */ - char *datatype; /* The data type of information held by this - ** object. Only used if type==NONTERMINAL */ - int dtnum; /* The data type number. In the parser, the value - ** stack is a union. The .yy%d element of this - ** union is the correct data type for this object */ - /* The following fields are used by MULTITERMINALs only */ - int nsubsym; /* Number of constituent symbols in the MULTI */ - struct symbol **subsym; /* Array of constituent symbols */ -}; - -/* Each production rule in the grammar is stored in the following -** structure. */ -struct rule { - struct symbol *lhs; /* Left-hand side of the rule */ - const char *lhsalias; /* Alias for the LHS (NULL if none) */ - int lhsStart; /* True if left-hand side is the start symbol */ - int ruleline; /* Line number for the rule */ - int nrhs; /* Number of RHS symbols */ - struct symbol **rhs; /* The RHS symbols */ - const char **rhsalias; /* An alias for each RHS symbol (NULL if none) */ - int line; /* Line number at which code begins */ - const char *code; /* The code executed when this rule is reduced */ - const char *codePrefix; /* Setup code before code[] above */ - const char *codeSuffix; /* Breakdown code after code[] above */ - int noCode; /* True if this rule has no associated C code */ - int codeEmitted; /* True if the code has been emitted already */ - struct symbol *precsym; /* Precedence symbol for this rule */ - int index; /* An index number for this rule */ - int iRule; /* Rule number as used in the generated tables */ - Boolean canReduce; /* True if this rule is ever reduced */ - Boolean doesReduce; /* Reduce actions occur after optimization */ - struct rule *nextlhs; /* Next rule with the same LHS */ - struct rule *next; /* Next rule in the global list */ -}; - -/* A configuration is a production rule of the grammar together with -** a mark (dot) showing how much of that rule has been processed so far. -** Configurations also contain a follow-set which is a list of terminal -** symbols which are allowed to immediately follow the end of the rule. -** Every configuration is recorded as an instance of the following: */ -enum cfgstatus { - COMPLETE, - INCOMPLETE -}; -struct config { - struct rule *rp; /* The rule upon which the configuration is based */ - int dot; /* The parse point */ - char *fws; /* Follow-set for this configuration only */ - struct plink *fplp; /* Follow-set forward propagation links */ - struct plink *bplp; /* Follow-set backwards propagation links */ - struct state *stp; /* Pointer to state which contains this */ - enum cfgstatus status; /* used during followset and shift computations */ - struct config *next; /* Next configuration in the state */ - struct config *bp; /* The next basis configuration */ -}; - -enum e_action { - SHIFT, - ACCEPT, - REDUCE, - ERROR, - SSCONFLICT, /* A shift/shift conflict */ - SRCONFLICT, /* Was a reduce, but part of a conflict */ - RRCONFLICT, /* Was a reduce, but part of a conflict */ - SH_RESOLVED, /* Was a shift. Precedence resolved conflict */ - RD_RESOLVED, /* Was reduce. Precedence resolved conflict */ - NOT_USED, /* Deleted by compression */ - SHIFTREDUCE /* Shift first, then reduce */ -}; - -/* Every shift or reduce operation is stored as one of the following */ -struct action { - struct symbol *sp; /* The look-ahead symbol */ - enum e_action type; - union { - struct state *stp; /* The new state, if a shift */ - struct rule *rp; /* The rule, if a reduce */ - } x; - struct symbol *spOpt; /* SHIFTREDUCE optimization to this symbol */ - struct action *next; /* Next action for this state */ - struct action *collide; /* Next action with the same hash */ -}; - -/* Each state of the generated parser's finite state machine -** is encoded as an instance of the following structure. */ -struct state { - struct config *bp; /* The basis configurations for this state */ - struct config *cfp; /* All configurations in this set */ - int statenum; /* Sequential number for this state */ - struct action *ap; /* List of actions for this state */ - int nTknAct, nNtAct; /* Number of actions on terminals and nonterminals */ - int iTknOfst, iNtOfst; /* yy_action[] offset for terminals and nonterms */ - int iDfltReduce; /* Default action is to REDUCE by this rule */ - struct rule *pDfltReduce;/* The default REDUCE rule. */ - int autoReduce; /* True if this is an auto-reduce state */ -}; -#define NO_OFFSET (-2147483647) - -/* A followset propagation link indicates that the contents of one -** configuration followset should be propagated to another whenever -** the first changes. */ -struct plink { - struct config *cfp; /* The configuration to which linked */ - struct plink *next; /* The next propagate link */ -}; - -/* The state vector for the entire parser generator is recorded as -** follows. (LEMON uses no global variables and makes little use of -** static variables. Fields in the following structure can be thought -** of as begin global variables in the program.) */ -struct lemon { - struct state **sorted; /* Table of states sorted by state number */ - struct rule *rule; /* List of all rules */ - struct rule *startRule; /* First rule */ - int nstate; /* Number of states */ - int nxstate; /* nstate with tail degenerate states removed */ - int nrule; /* Number of rules */ - int nsymbol; /* Number of terminal and nonterminal symbols */ - int nterminal; /* Number of terminal symbols */ - struct symbol **symbols; /* Sorted array of pointers to symbols */ - int errorcnt; /* Number of errors */ - struct symbol *errsym; /* The error symbol */ - struct symbol *wildcard; /* Token that matches anything */ - char *name; /* Name of the generated parser */ - char *arg; /* Declaration of the 3th argument to parser */ - char *tokentype; /* Type of terminal symbols in the parser stack */ - char *vartype; /* The default type of non-terminal symbols */ - char *start; /* Name of the start symbol for the grammar */ - char *stacksize; /* Size of the parser stack */ - char *include; /* Code to put at the start of the C file */ - char *error; /* Code to execute when an error is seen */ - char *overflow; /* Code to execute on a stack overflow */ - char *failure; /* Code to execute on parser failure */ - char *accept; /* Code to execute when the parser excepts */ - char *extracode; /* Code appended to the generated file */ - char *tokendest; /* Code to execute to destroy token data */ - char *vardest; /* Code for the default non-terminal destructor */ - char *filename; /* Name of the input file */ - char *outname; /* Name of the current output file */ - char *tokenprefix; /* A prefix added to token names in the .h file */ - int nconflict; /* Number of parsing conflicts */ - int nactiontab; /* Number of entries in the yy_action[] table */ - int tablesize; /* Total table size of all tables in bytes */ - int basisflag; /* Print only basis configurations */ - int has_fallback; /* True if any %fallback is seen in the grammar */ - int nolinenosflag; /* True if #line statements should not be printed */ - char *argv0; /* Name of the program */ -}; - -#define MemoryCheck(X) if((X)==0){ \ - extern void memory_error(); \ - memory_error(); \ -} - -/**************** From the file "table.h" *********************************/ -/* -** All code in this file has been automatically generated -** from a specification in the file -** "table.q" -** by the associative array code building program "aagen". -** Do not edit this file! Instead, edit the specification -** file, then rerun aagen. -*/ -/* -** Code for processing tables in the LEMON parser generator. -*/ -/* Routines for handling a strings */ - -const char *Strsafe(const char *); - -void Strsafe_init(void); -int Strsafe_insert(const char *); -const char *Strsafe_find(const char *); - -/* Routines for handling symbols of the grammar */ - -struct symbol *Symbol_new(const char *); -int Symbolcmpp(const void *, const void *); -void Symbol_init(void); -int Symbol_insert(struct symbol *, const char *); -struct symbol *Symbol_find(const char *); -struct symbol *Symbol_Nth(int); -int Symbol_count(void); -struct symbol **Symbol_arrayof(void); - -/* Routines to manage the state table */ - -int Configcmp(const char *, const char *); -struct state *State_new(void); -void State_init(void); -int State_insert(struct state *, struct config *); -struct state *State_find(struct config *); -struct state **State_arrayof(void); - -/* Routines used for efficiency in Configlist_add */ - -void Configtable_init(void); -int Configtable_insert(struct config *); -struct config *Configtable_find(struct config *); -void Configtable_clear(int(*)(struct config *)); - -/****************** From the file "action.c" *******************************/ -/* -** Routines processing parser actions in the LEMON parser generator. -*/ - -/* Allocate a new parser action */ -static struct action *Action_new(void){ - static struct action *freelist = 0; - struct action *newaction; - - if( freelist==0 ){ - int i; - int amt = 100; - freelist = (struct action *)calloc(amt, sizeof(struct action)); - if( freelist==0 ){ - fprintf(stderr,"Unable to allocate memory for a new parser action."); - exit(1); - } - for(i=0; inext; - return newaction; -} - -/* Compare two actions for sorting purposes. Return negative, zero, or -** positive if the first action is less than, equal to, or greater than -** the first -*/ -static int actioncmp( - struct action *ap1, - struct action *ap2 -){ - int rc; - rc = ap1->sp->index - ap2->sp->index; - if( rc==0 ){ - rc = (int)ap1->type - (int)ap2->type; - } - if( rc==0 && (ap1->type==REDUCE || ap1->type==SHIFTREDUCE) ){ - rc = ap1->x.rp->index - ap2->x.rp->index; - } - if( rc==0 ){ - rc = (int) (ap2 - ap1); - } - return rc; -} - -/* Sort parser actions */ -static struct action *Action_sort( - struct action *ap -){ - ap = (struct action *)msort((char *)ap,(char **)&ap->next, - (int(*)(const char*,const char*))actioncmp); - return ap; -} - -void Action_add( - struct action **app, - enum e_action type, - struct symbol *sp, - char *arg -){ - struct action *newaction; - newaction = Action_new(); - newaction->next = *app; - *app = newaction; - newaction->type = type; - newaction->sp = sp; - newaction->spOpt = 0; - if( type==SHIFT ){ - newaction->x.stp = (struct state *)arg; - }else{ - newaction->x.rp = (struct rule *)arg; - } -} -/********************** New code to implement the "acttab" module ***********/ -/* -** This module implements routines use to construct the yy_action[] table. -*/ - -/* -** The state of the yy_action table under construction is an instance of -** the following structure. -** -** The yy_action table maps the pair (state_number, lookahead) into an -** action_number. The table is an array of integers pairs. The state_number -** determines an initial offset into the yy_action array. The lookahead -** value is then added to this initial offset to get an index X into the -** yy_action array. If the aAction[X].lookahead equals the value of the -** of the lookahead input, then the value of the action_number output is -** aAction[X].action. If the lookaheads do not match then the -** default action for the state_number is returned. -** -** All actions associated with a single state_number are first entered -** into aLookahead[] using multiple calls to acttab_action(). Then the -** actions for that single state_number are placed into the aAction[] -** array with a single call to acttab_insert(). The acttab_insert() call -** also resets the aLookahead[] array in preparation for the next -** state number. -*/ -struct lookahead_action { - int lookahead; /* Value of the lookahead token */ - int action; /* Action to take on the given lookahead */ -}; -typedef struct acttab acttab; -struct acttab { - int nAction; /* Number of used slots in aAction[] */ - int nActionAlloc; /* Slots allocated for aAction[] */ - struct lookahead_action - *aAction, /* The yy_action[] table under construction */ - *aLookahead; /* A single new transaction set */ - int mnLookahead; /* Minimum aLookahead[].lookahead */ - int mnAction; /* Action associated with mnLookahead */ - int mxLookahead; /* Maximum aLookahead[].lookahead */ - int nLookahead; /* Used slots in aLookahead[] */ - int nLookaheadAlloc; /* Slots allocated in aLookahead[] */ -}; - -/* Return the number of entries in the yy_action table */ -#define acttab_size(X) ((X)->nAction) - -/* The value for the N-th entry in yy_action */ -#define acttab_yyaction(X,N) ((X)->aAction[N].action) - -/* The value for the N-th entry in yy_lookahead */ -#define acttab_yylookahead(X,N) ((X)->aAction[N].lookahead) - -/* Free all memory associated with the given acttab */ -void acttab_free(acttab *p){ - free( p->aAction ); - free( p->aLookahead ); - free( p ); -} - -/* Allocate a new acttab structure */ -acttab *acttab_alloc(void){ - acttab *p = (acttab *) calloc( 1, sizeof(*p) ); - if( p==0 ){ - fprintf(stderr,"Unable to allocate memory for a new acttab."); - exit(1); - } - memset(p, 0, sizeof(*p)); - return p; -} - -/* Add a new action to the current transaction set. -** -** This routine is called once for each lookahead for a particular -** state. -*/ -void acttab_action(acttab *p, int lookahead, int action){ - if( p->nLookahead>=p->nLookaheadAlloc ){ - p->nLookaheadAlloc += 25; - p->aLookahead = (struct lookahead_action *) realloc( p->aLookahead, - sizeof(p->aLookahead[0])*p->nLookaheadAlloc ); - if( p->aLookahead==0 ){ - fprintf(stderr,"malloc failed\n"); - exit(1); - } - } - if( p->nLookahead==0 ){ - p->mxLookahead = lookahead; - p->mnLookahead = lookahead; - p->mnAction = action; - }else{ - if( p->mxLookaheadmxLookahead = lookahead; - if( p->mnLookahead>lookahead ){ - p->mnLookahead = lookahead; - p->mnAction = action; - } - } - p->aLookahead[p->nLookahead].lookahead = lookahead; - p->aLookahead[p->nLookahead].action = action; - p->nLookahead++; -} - -/* -** Add the transaction set built up with prior calls to acttab_action() -** into the current action table. Then reset the transaction set back -** to an empty set in preparation for a new round of acttab_action() calls. -** -** Return the offset into the action table of the new transaction. -*/ -int acttab_insert(acttab *p){ - int i, j, k, n; - assert( p->nLookahead>0 ); - - /* Make sure we have enough space to hold the expanded action table - ** in the worst case. The worst case occurs if the transaction set - ** must be appended to the current action table - */ - n = p->mxLookahead + 1; - if( p->nAction + n >= p->nActionAlloc ){ - int oldAlloc = p->nActionAlloc; - p->nActionAlloc = p->nAction + n + p->nActionAlloc + 20; - p->aAction = (struct lookahead_action *) realloc( p->aAction, - sizeof(p->aAction[0])*p->nActionAlloc); - if( p->aAction==0 ){ - fprintf(stderr,"malloc failed\n"); - exit(1); - } - for(i=oldAlloc; inActionAlloc; i++){ - p->aAction[i].lookahead = -1; - p->aAction[i].action = -1; - } - } - - /* Scan the existing action table looking for an offset that is a - ** duplicate of the current transaction set. Fall out of the loop - ** if and when the duplicate is found. - ** - ** i is the index in p->aAction[] where p->mnLookahead is inserted. - */ - for(i=p->nAction-1; i>=0; i--){ - if( p->aAction[i].lookahead==p->mnLookahead ){ - /* All lookaheads and actions in the aLookahead[] transaction - ** must match against the candidate aAction[i] entry. */ - if( p->aAction[i].action!=p->mnAction ) continue; - for(j=0; jnLookahead; j++){ - k = p->aLookahead[j].lookahead - p->mnLookahead + i; - if( k<0 || k>=p->nAction ) break; - if( p->aLookahead[j].lookahead!=p->aAction[k].lookahead ) break; - if( p->aLookahead[j].action!=p->aAction[k].action ) break; - } - if( jnLookahead ) continue; - - /* No possible lookahead value that is not in the aLookahead[] - ** transaction is allowed to match aAction[i] */ - n = 0; - for(j=0; jnAction; j++){ - if( p->aAction[j].lookahead<0 ) continue; - if( p->aAction[j].lookahead==j+p->mnLookahead-i ) n++; - } - if( n==p->nLookahead ){ - break; /* An exact match is found at offset i */ - } - } - } - - /* If no existing offsets exactly match the current transaction, find an - ** an empty offset in the aAction[] table in which we can add the - ** aLookahead[] transaction. - */ - if( i<0 ){ - /* Look for holes in the aAction[] table that fit the current - ** aLookahead[] transaction. Leave i set to the offset of the hole. - ** If no holes are found, i is left at p->nAction, which means the - ** transaction will be appended. */ - for(i=0; inActionAlloc - p->mxLookahead; i++){ - if( p->aAction[i].lookahead<0 ){ - for(j=0; jnLookahead; j++){ - k = p->aLookahead[j].lookahead - p->mnLookahead + i; - if( k<0 ) break; - if( p->aAction[k].lookahead>=0 ) break; - } - if( jnLookahead ) continue; - for(j=0; jnAction; j++){ - if( p->aAction[j].lookahead==j+p->mnLookahead-i ) break; - } - if( j==p->nAction ){ - break; /* Fits in empty slots */ - } - } - } - } - /* Insert transaction set at index i. */ - for(j=0; jnLookahead; j++){ - k = p->aLookahead[j].lookahead - p->mnLookahead + i; - p->aAction[k] = p->aLookahead[j]; - if( k>=p->nAction ) p->nAction = k+1; - } - p->nLookahead = 0; - - /* Return the offset that is added to the lookahead in order to get the - ** index into yy_action of the action */ - return i - p->mnLookahead; -} - -/********************** From the file "build.c" *****************************/ -/* -** Routines to construction the finite state machine for the LEMON -** parser generator. -*/ - -/* Find a precedence symbol of every rule in the grammar. -** -** Those rules which have a precedence symbol coded in the input -** grammar using the "[symbol]" construct will already have the -** rp->precsym field filled. Other rules take as their precedence -** symbol the first RHS symbol with a defined precedence. If there -** are not RHS symbols with a defined precedence, the precedence -** symbol field is left blank. -*/ -void FindRulePrecedences(struct lemon *xp) -{ - struct rule *rp; - for(rp=xp->rule; rp; rp=rp->next){ - if( rp->precsym==0 ){ - int i, j; - for(i=0; inrhs && rp->precsym==0; i++){ - struct symbol *sp = rp->rhs[i]; - if( sp->type==MULTITERMINAL ){ - for(j=0; jnsubsym; j++){ - if( sp->subsym[j]->prec>=0 ){ - rp->precsym = sp->subsym[j]; - break; - } - } - }else if( sp->prec>=0 ){ - rp->precsym = rp->rhs[i]; - } - } - } - } - return; -} - -/* Find all nonterminals which will generate the empty string. -** Then go back and compute the first sets of every nonterminal. -** The first set is the set of all terminal symbols which can begin -** a string generated by that nonterminal. -*/ -void FindFirstSets(struct lemon *lemp) -{ - int i, j; - struct rule *rp; - int progress; - - for(i=0; insymbol; i++){ - lemp->symbols[i]->lambda = LEMON_FALSE; - } - for(i=lemp->nterminal; insymbol; i++){ - lemp->symbols[i]->firstset = SetNew(); - } - - /* First compute all lambdas */ - do{ - progress = 0; - for(rp=lemp->rule; rp; rp=rp->next){ - if( rp->lhs->lambda ) continue; - for(i=0; inrhs; i++){ - struct symbol *sp = rp->rhs[i]; - assert( sp->type==NONTERMINAL || sp->lambda==LEMON_FALSE ); - if( sp->lambda==LEMON_FALSE ) break; - } - if( i==rp->nrhs ){ - rp->lhs->lambda = LEMON_TRUE; - progress = 1; - } - } - }while( progress ); - - /* Now compute all first sets */ - do{ - struct symbol *s1, *s2; - progress = 0; - for(rp=lemp->rule; rp; rp=rp->next){ - s1 = rp->lhs; - for(i=0; inrhs; i++){ - s2 = rp->rhs[i]; - if( s2->type==TERMINAL ){ - progress += SetAdd(s1->firstset,s2->index); - break; - }else if( s2->type==MULTITERMINAL ){ - for(j=0; jnsubsym; j++){ - progress += SetAdd(s1->firstset,s2->subsym[j]->index); - } - break; - }else if( s1==s2 ){ - if( s1->lambda==LEMON_FALSE ) break; - }else{ - progress += SetUnion(s1->firstset,s2->firstset); - if( s2->lambda==LEMON_FALSE ) break; - } - } - } - }while( progress ); - return; -} - -/* Compute all LR(0) states for the grammar. Links -** are added to between some states so that the LR(1) follow sets -** can be computed later. -*/ -PRIVATE struct state *getstate(struct lemon *); /* forward reference */ -void FindStates(struct lemon *lemp) -{ - struct symbol *sp; - struct rule *rp; - - Configlist_init(); - - /* Find the start symbol */ - if( lemp->start ){ - sp = Symbol_find(lemp->start); - if( sp==0 ){ - ErrorMsg(lemp->filename,0, -"The specified start symbol \"%s\" is not \ -in a nonterminal of the grammar. \"%s\" will be used as the start \ -symbol instead.",lemp->start,lemp->startRule->lhs->name); - lemp->errorcnt++; - sp = lemp->startRule->lhs; - } - }else{ - sp = lemp->startRule->lhs; - } - - /* Make sure the start symbol doesn't occur on the right-hand side of - ** any rule. Report an error if it does. (YACC would generate a new - ** start symbol in this case.) */ - for(rp=lemp->rule; rp; rp=rp->next){ - int i; - for(i=0; inrhs; i++){ - if( rp->rhs[i]==sp ){ /* FIX ME: Deal with multiterminals */ - ErrorMsg(lemp->filename,0, -"The start symbol \"%s\" occurs on the \ -right-hand side of a rule. This will result in a parser which \ -does not work properly.",sp->name); - lemp->errorcnt++; - } - } - } - - /* The basis configuration set for the first state - ** is all rules which have the start symbol as their - ** left-hand side */ - for(rp=sp->rule; rp; rp=rp->nextlhs){ - struct config *newcfp; - rp->lhsStart = 1; - newcfp = Configlist_addbasis(rp,0); - SetAdd(newcfp->fws,0); - } - - /* Compute the first state. All other states will be - ** computed automatically during the computation of the first one. - ** The returned pointer to the first state is not used. */ - (void)getstate(lemp); - return; -} - -/* Return a pointer to a state which is described by the configuration -** list which has been built from calls to Configlist_add. -*/ -PRIVATE void buildshifts(struct lemon *, struct state *); /* Forwd ref */ -PRIVATE struct state *getstate(struct lemon *lemp) -{ - struct config *cfp, *bp; - struct state *stp; - - /* Extract the sorted basis of the new state. The basis was constructed - ** by prior calls to "Configlist_addbasis()". */ - Configlist_sortbasis(); - bp = Configlist_basis(); - - /* Get a state with the same basis */ - stp = State_find(bp); - if( stp ){ - /* A state with the same basis already exists! Copy all the follow-set - ** propagation links from the state under construction into the - ** preexisting state, then return a pointer to the preexisting state */ - struct config *x, *y; - for(x=bp, y=stp->bp; x && y; x=x->bp, y=y->bp){ - Plink_copy(&y->bplp,x->bplp); - Plink_delete(x->fplp); - x->fplp = x->bplp = 0; - } - cfp = Configlist_return(); - Configlist_eat(cfp); - }else{ - /* This really is a new state. Construct all the details */ - Configlist_closure(lemp); /* Compute the configuration closure */ - Configlist_sort(); /* Sort the configuration closure */ - cfp = Configlist_return(); /* Get a pointer to the config list */ - stp = State_new(); /* A new state structure */ - MemoryCheck(stp); - stp->bp = bp; /* Remember the configuration basis */ - stp->cfp = cfp; /* Remember the configuration closure */ - stp->statenum = lemp->nstate++; /* Every state gets a sequence number */ - stp->ap = 0; /* No actions, yet. */ - State_insert(stp,stp->bp); /* Add to the state table */ - buildshifts(lemp,stp); /* Recursively compute successor states */ - } - return stp; -} - -/* -** Return true if two symbols are the same. -*/ -int same_symbol(struct symbol *a, struct symbol *b) -{ - int i; - if( a==b ) return 1; - if( a->type!=MULTITERMINAL ) return 0; - if( b->type!=MULTITERMINAL ) return 0; - if( a->nsubsym!=b->nsubsym ) return 0; - for(i=0; insubsym; i++){ - if( a->subsym[i]!=b->subsym[i] ) return 0; - } - return 1; -} - -/* Construct all successor states to the given state. A "successor" -** state is any state which can be reached by a shift action. -*/ -PRIVATE void buildshifts(struct lemon *lemp, struct state *stp) -{ - struct config *cfp; /* For looping thru the config closure of "stp" */ - struct config *bcfp; /* For the inner loop on config closure of "stp" */ - struct config *newcfg; /* */ - struct symbol *sp; /* Symbol following the dot in configuration "cfp" */ - struct symbol *bsp; /* Symbol following the dot in configuration "bcfp" */ - struct state *newstp; /* A pointer to a successor state */ - - /* Each configuration becomes complete after it contributes to a successor - ** state. Initially, all configurations are incomplete */ - for(cfp=stp->cfp; cfp; cfp=cfp->next) cfp->status = INCOMPLETE; - - /* Loop through all configurations of the state "stp" */ - for(cfp=stp->cfp; cfp; cfp=cfp->next){ - if( cfp->status==COMPLETE ) continue; /* Already used by inner loop */ - if( cfp->dot>=cfp->rp->nrhs ) continue; /* Can't shift this config */ - Configlist_reset(); /* Reset the new config set */ - sp = cfp->rp->rhs[cfp->dot]; /* Symbol after the dot */ - - /* For every configuration in the state "stp" which has the symbol "sp" - ** following its dot, add the same configuration to the basis set under - ** construction but with the dot shifted one symbol to the right. */ - for(bcfp=cfp; bcfp; bcfp=bcfp->next){ - if( bcfp->status==COMPLETE ) continue; /* Already used */ - if( bcfp->dot>=bcfp->rp->nrhs ) continue; /* Can't shift this one */ - bsp = bcfp->rp->rhs[bcfp->dot]; /* Get symbol after dot */ - if( !same_symbol(bsp,sp) ) continue; /* Must be same as for "cfp" */ - bcfp->status = COMPLETE; /* Mark this config as used */ - newcfg = Configlist_addbasis(bcfp->rp,bcfp->dot+1); - Plink_add(&newcfg->bplp,bcfp); - } - - /* Get a pointer to the state described by the basis configuration set - ** constructed in the preceding loop */ - newstp = getstate(lemp); - - /* The state "newstp" is reached from the state "stp" by a shift action - ** on the symbol "sp" */ - if( sp->type==MULTITERMINAL ){ - int i; - for(i=0; insubsym; i++){ - Action_add(&stp->ap,SHIFT,sp->subsym[i],(char*)newstp); - } - }else{ - Action_add(&stp->ap,SHIFT,sp,(char *)newstp); - } - } -} - -/* -** Construct the propagation links -*/ -void FindLinks(struct lemon *lemp) -{ - int i; - struct config *cfp, *other; - struct state *stp; - struct plink *plp; - - /* Housekeeping detail: - ** Add to every propagate link a pointer back to the state to - ** which the link is attached. */ - for(i=0; instate; i++){ - stp = lemp->sorted[i]; - for(cfp=stp->cfp; cfp; cfp=cfp->next){ - cfp->stp = stp; - } - } - - /* Convert all backlinks into forward links. Only the forward - ** links are used in the follow-set computation. */ - for(i=0; instate; i++){ - stp = lemp->sorted[i]; - for(cfp=stp->cfp; cfp; cfp=cfp->next){ - for(plp=cfp->bplp; plp; plp=plp->next){ - other = plp->cfp; - Plink_add(&other->fplp,cfp); - } - } - } -} - -/* Compute all followsets. -** -** A followset is the set of all symbols which can come immediately -** after a configuration. -*/ -void FindFollowSets(struct lemon *lemp) -{ - int i; - struct config *cfp; - struct plink *plp; - int progress; - int change; - - for(i=0; instate; i++){ - for(cfp=lemp->sorted[i]->cfp; cfp; cfp=cfp->next){ - cfp->status = INCOMPLETE; - } - } - - do{ - progress = 0; - for(i=0; instate; i++){ - for(cfp=lemp->sorted[i]->cfp; cfp; cfp=cfp->next){ - if( cfp->status==COMPLETE ) continue; - for(plp=cfp->fplp; plp; plp=plp->next){ - change = SetUnion(plp->cfp->fws,cfp->fws); - if( change ){ - plp->cfp->status = INCOMPLETE; - progress = 1; - } - } - cfp->status = COMPLETE; - } - } - }while( progress ); -} - -static int resolve_conflict(struct action *,struct action *); - -/* Compute the reduce actions, and resolve conflicts. -*/ -void FindActions(struct lemon *lemp) -{ - int i,j; - struct config *cfp; - struct state *stp; - struct symbol *sp; - struct rule *rp; - - /* Add all of the reduce actions - ** A reduce action is added for each element of the followset of - ** a configuration which has its dot at the extreme right. - */ - for(i=0; instate; i++){ /* Loop over all states */ - stp = lemp->sorted[i]; - for(cfp=stp->cfp; cfp; cfp=cfp->next){ /* Loop over all configurations */ - if( cfp->rp->nrhs==cfp->dot ){ /* Is dot at extreme right? */ - for(j=0; jnterminal; j++){ - if( SetFind(cfp->fws,j) ){ - /* Add a reduce action to the state "stp" which will reduce by the - ** rule "cfp->rp" if the lookahead symbol is "lemp->symbols[j]" */ - Action_add(&stp->ap,REDUCE,lemp->symbols[j],(char *)cfp->rp); - } - } - } - } - } - - /* Add the accepting token */ - if( lemp->start ){ - sp = Symbol_find(lemp->start); - if( sp==0 ) sp = lemp->startRule->lhs; - }else{ - sp = lemp->startRule->lhs; - } - /* Add to the first state (which is always the starting state of the - ** finite state machine) an action to ACCEPT if the lookahead is the - ** start nonterminal. */ - Action_add(&lemp->sorted[0]->ap,ACCEPT,sp,0); - - /* Resolve conflicts */ - for(i=0; instate; i++){ - struct action *ap, *nap; - stp = lemp->sorted[i]; - /* assert( stp->ap ); */ - stp->ap = Action_sort(stp->ap); - for(ap=stp->ap; ap && ap->next; ap=ap->next){ - for(nap=ap->next; nap && nap->sp==ap->sp; nap=nap->next){ - /* The two actions "ap" and "nap" have the same lookahead. - ** Figure out which one should be used */ - lemp->nconflict += resolve_conflict(ap,nap); - } - } - } - - /* Report an error for each rule that can never be reduced. */ - for(rp=lemp->rule; rp; rp=rp->next) rp->canReduce = LEMON_FALSE; - for(i=0; instate; i++){ - struct action *ap; - for(ap=lemp->sorted[i]->ap; ap; ap=ap->next){ - if( ap->type==REDUCE ) ap->x.rp->canReduce = LEMON_TRUE; - } - } - for(rp=lemp->rule; rp; rp=rp->next){ - if( rp->canReduce ) continue; - ErrorMsg(lemp->filename,rp->ruleline,"This rule can not be reduced.\n"); - lemp->errorcnt++; - } -} - -/* Resolve a conflict between the two given actions. If the -** conflict can't be resolved, return non-zero. -** -** NO LONGER TRUE: -** To resolve a conflict, first look to see if either action -** is on an error rule. In that case, take the action which -** is not associated with the error rule. If neither or both -** actions are associated with an error rule, then try to -** use precedence to resolve the conflict. -** -** If either action is a SHIFT, then it must be apx. This -** function won't work if apx->type==REDUCE and apy->type==SHIFT. -*/ -static int resolve_conflict( - struct action *apx, - struct action *apy -){ - struct symbol *spx, *spy; - int errcnt = 0; - assert( apx->sp==apy->sp ); /* Otherwise there would be no conflict */ - if( apx->type==SHIFT && apy->type==SHIFT ){ - apy->type = SSCONFLICT; - errcnt++; - } - if( apx->type==SHIFT && apy->type==REDUCE ){ - spx = apx->sp; - spy = apy->x.rp->precsym; - if( spy==0 || spx->prec<0 || spy->prec<0 ){ - /* Not enough precedence information. */ - apy->type = SRCONFLICT; - errcnt++; - }else if( spx->prec>spy->prec ){ /* higher precedence wins */ - apy->type = RD_RESOLVED; - }else if( spx->precprec ){ - apx->type = SH_RESOLVED; - }else if( spx->prec==spy->prec && spx->assoc==RIGHT ){ /* Use operator */ - apy->type = RD_RESOLVED; /* associativity */ - }else if( spx->prec==spy->prec && spx->assoc==LEFT ){ /* to break tie */ - apx->type = SH_RESOLVED; - }else{ - assert( spx->prec==spy->prec && spx->assoc==NONE ); - apx->type = ERROR; - } - }else if( apx->type==REDUCE && apy->type==REDUCE ){ - spx = apx->x.rp->precsym; - spy = apy->x.rp->precsym; - if( spx==0 || spy==0 || spx->prec<0 || - spy->prec<0 || spx->prec==spy->prec ){ - apy->type = RRCONFLICT; - errcnt++; - }else if( spx->prec>spy->prec ){ - apy->type = RD_RESOLVED; - }else if( spx->precprec ){ - apx->type = RD_RESOLVED; - } - }else{ - assert( - apx->type==SH_RESOLVED || - apx->type==RD_RESOLVED || - apx->type==SSCONFLICT || - apx->type==SRCONFLICT || - apx->type==RRCONFLICT || - apy->type==SH_RESOLVED || - apy->type==RD_RESOLVED || - apy->type==SSCONFLICT || - apy->type==SRCONFLICT || - apy->type==RRCONFLICT - ); - /* The REDUCE/SHIFT case cannot happen because SHIFTs come before - ** REDUCEs on the list. If we reach this point it must be because - ** the parser conflict had already been resolved. */ - } - return errcnt; -} -/********************* From the file "configlist.c" *************************/ -/* -** Routines to processing a configuration list and building a state -** in the LEMON parser generator. -*/ - -static struct config *freelist = 0; /* List of free configurations */ -static struct config *current = 0; /* Top of list of configurations */ -static struct config **currentend = 0; /* Last on list of configs */ -static struct config *basis = 0; /* Top of list of basis configs */ -static struct config **basisend = 0; /* End of list of basis configs */ - -/* Return a pointer to a new configuration */ -PRIVATE struct config *newconfig(void){ - struct config *newcfg; - if( freelist==0 ){ - int i; - int amt = 3; - freelist = (struct config *)calloc( amt, sizeof(struct config) ); - if( freelist==0 ){ - fprintf(stderr,"Unable to allocate memory for a new configuration."); - exit(1); - } - for(i=0; inext; - return newcfg; -} - -/* The configuration "old" is no longer used */ -PRIVATE void deleteconfig(struct config *old) -{ - old->next = freelist; - freelist = old; -} - -/* Initialized the configuration list builder */ -void Configlist_init(void){ - current = 0; - currentend = ¤t; - basis = 0; - basisend = &basis; - Configtable_init(); - return; -} - -/* Initialized the configuration list builder */ -void Configlist_reset(void){ - current = 0; - currentend = ¤t; - basis = 0; - basisend = &basis; - Configtable_clear(0); - return; -} - -/* Add another configuration to the configuration list */ -struct config *Configlist_add( - struct rule *rp, /* The rule */ - int dot /* Index into the RHS of the rule where the dot goes */ -){ - struct config *cfp, model; - - assert( currentend!=0 ); - model.rp = rp; - model.dot = dot; - cfp = Configtable_find(&model); - if( cfp==0 ){ - cfp = newconfig(); - cfp->rp = rp; - cfp->dot = dot; - cfp->fws = SetNew(); - cfp->stp = 0; - cfp->fplp = cfp->bplp = 0; - cfp->next = 0; - cfp->bp = 0; - *currentend = cfp; - currentend = &cfp->next; - Configtable_insert(cfp); - } - return cfp; -} - -/* Add a basis configuration to the configuration list */ -struct config *Configlist_addbasis(struct rule *rp, int dot) -{ - struct config *cfp, model; - - assert( basisend!=0 ); - assert( currentend!=0 ); - model.rp = rp; - model.dot = dot; - cfp = Configtable_find(&model); - if( cfp==0 ){ - cfp = newconfig(); - cfp->rp = rp; - cfp->dot = dot; - cfp->fws = SetNew(); - cfp->stp = 0; - cfp->fplp = cfp->bplp = 0; - cfp->next = 0; - cfp->bp = 0; - *currentend = cfp; - currentend = &cfp->next; - *basisend = cfp; - basisend = &cfp->bp; - Configtable_insert(cfp); - } - return cfp; -} - -/* Compute the closure of the configuration list */ -void Configlist_closure(struct lemon *lemp) -{ - struct config *cfp, *newcfp; - struct rule *rp, *newrp; - struct symbol *sp, *xsp; - int i, dot; - - assert( currentend!=0 ); - for(cfp=current; cfp; cfp=cfp->next){ - rp = cfp->rp; - dot = cfp->dot; - if( dot>=rp->nrhs ) continue; - sp = rp->rhs[dot]; - if( sp->type==NONTERMINAL ){ - if( sp->rule==0 && sp!=lemp->errsym ){ - ErrorMsg(lemp->filename,rp->line,"Nonterminal \"%s\" has no rules.", - sp->name); - lemp->errorcnt++; - } - for(newrp=sp->rule; newrp; newrp=newrp->nextlhs){ - newcfp = Configlist_add(newrp,0); - for(i=dot+1; inrhs; i++){ - xsp = rp->rhs[i]; - if( xsp->type==TERMINAL ){ - SetAdd(newcfp->fws,xsp->index); - break; - }else if( xsp->type==MULTITERMINAL ){ - int k; - for(k=0; knsubsym; k++){ - SetAdd(newcfp->fws, xsp->subsym[k]->index); - } - break; - }else{ - SetUnion(newcfp->fws,xsp->firstset); - if( xsp->lambda==LEMON_FALSE ) break; - } - } - if( i==rp->nrhs ) Plink_add(&cfp->fplp,newcfp); - } - } - } - return; -} - -/* Sort the configuration list */ -void Configlist_sort(void){ - current = (struct config*)msort((char*)current,(char**)&(current->next), - Configcmp); - currentend = 0; - return; -} - -/* Sort the basis configuration list */ -void Configlist_sortbasis(void){ - basis = (struct config*)msort((char*)current,(char**)&(current->bp), - Configcmp); - basisend = 0; - return; -} - -/* Return a pointer to the head of the configuration list and -** reset the list */ -struct config *Configlist_return(void){ - struct config *old; - old = current; - current = 0; - currentend = 0; - return old; -} - -/* Return a pointer to the head of the configuration list and -** reset the list */ -struct config *Configlist_basis(void){ - struct config *old; - old = basis; - basis = 0; - basisend = 0; - return old; -} - -/* Free all elements of the given configuration list */ -void Configlist_eat(struct config *cfp) -{ - struct config *nextcfp; - for(; cfp; cfp=nextcfp){ - nextcfp = cfp->next; - assert( cfp->fplp==0 ); - assert( cfp->bplp==0 ); - if( cfp->fws ) SetFree(cfp->fws); - deleteconfig(cfp); - } - return; -} -/***************** From the file "error.c" *********************************/ -/* -** Code for printing error message. -*/ - -void ErrorMsg(const char *filename, int lineno, const char *format, ...){ - va_list ap; - fprintf(stderr, "%s:%d: ", filename, lineno); - va_start(ap, format); - vfprintf(stderr,format,ap); - va_end(ap); - fprintf(stderr, "\n"); -} -/**************** From the file "main.c" ************************************/ -/* -** Main program file for the LEMON parser generator. -*/ - -/* Report an out-of-memory condition and abort. This function -** is used mostly by the "MemoryCheck" macro in struct.h -*/ -void memory_error(void){ - fprintf(stderr,"Out of memory. Aborting...\n"); - exit(1); -} - -static int nDefine = 0; /* Number of -D options on the command line */ -static char **azDefine = 0; /* Name of the -D macros */ - -/* This routine is called with the argument to each -D command-line option. -** Add the macro defined to the azDefine array. -*/ -static void handle_D_option(char *z){ - char **paz; - nDefine++; - azDefine = (char **) realloc(azDefine, sizeof(azDefine[0])*nDefine); - if( azDefine==0 ){ - fprintf(stderr,"out of memory\n"); - exit(1); - } - paz = &azDefine[nDefine-1]; - *paz = (char *) malloc( lemonStrlen(z)+1 ); - if( *paz==0 ){ - fprintf(stderr,"out of memory\n"); - exit(1); - } - lemon_strcpy(*paz, z); - for(z=*paz; *z && *z!='='; z++){} - *z = 0; -} - -static char *user_templatename = NULL; -static void handle_T_option(char *z){ - user_templatename = (char *) malloc( lemonStrlen(z)+1 ); - if( user_templatename==0 ){ - memory_error(); - } - lemon_strcpy(user_templatename, z); -} - -/* Merge together to lists of rules ordered by rule.iRule */ -static struct rule *Rule_merge(struct rule *pA, struct rule *pB){ - struct rule *pFirst = 0; - struct rule **ppPrev = &pFirst; - while( pA && pB ){ - if( pA->iRuleiRule ){ - *ppPrev = pA; - ppPrev = &pA->next; - pA = pA->next; - }else{ - *ppPrev = pB; - ppPrev = &pB->next; - pB = pB->next; - } - } - if( pA ){ - *ppPrev = pA; - }else{ - *ppPrev = pB; - } - return pFirst; -} - -/* -** Sort a list of rules in order of increasing iRule value -*/ -static struct rule *Rule_sort(struct rule *rp){ - int i; - struct rule *pNext; - struct rule *x[32]; - memset(x, 0, sizeof(x)); - while( rp ){ - pNext = rp->next; - rp->next = 0; - for(i=0; iuseCnt = 0; - - /* Parse the input file */ - Parse(&lem); - if( lem.errorcnt ) exit(lem.errorcnt); - if( lem.nrule==0 ){ - fprintf(stderr,"Empty grammar.\n"); - exit(1); - } - - /* Count and index the symbols of the grammar */ - Symbol_new("{default}"); - lem.nsymbol = Symbol_count(); - lem.symbols = Symbol_arrayof(); - for(i=0; iindex = i; - qsort(lem.symbols,lem.nsymbol,sizeof(struct symbol*), Symbolcmpp); - for(i=0; iindex = i; - while( lem.symbols[i-1]->type==MULTITERMINAL ){ i--; } - assert( strcmp(lem.symbols[i-1]->name,"{default}")==0 ); - lem.nsymbol = i - 1; - for(i=1; ISUPPER(lem.symbols[i]->name[0]); i++); - lem.nterminal = i; - - /* Assign sequential rule numbers. Start with 0. Put rules that have no - ** reduce action C-code associated with them last, so that the switch() - ** statement that selects reduction actions will have a smaller jump table. - */ - for(i=0, rp=lem.rule; rp; rp=rp->next){ - rp->iRule = rp->code ? i++ : -1; - } - for(rp=lem.rule; rp; rp=rp->next){ - if( rp->iRule<0 ) rp->iRule = i++; - } - lem.startRule = lem.rule; - lem.rule = Rule_sort(lem.rule); - - /* Generate a reprint of the grammar, if requested on the command line */ - if( rpflag ){ - Reprint(&lem); - }else{ - /* Initialize the size for all follow and first sets */ - SetSize(lem.nterminal+1); - - /* Find the precedence for every production rule (that has one) */ - FindRulePrecedences(&lem); - - /* Compute the lambda-nonterminals and the first-sets for every - ** nonterminal */ - FindFirstSets(&lem); - - /* Compute all LR(0) states. Also record follow-set propagation - ** links so that the follow-set can be computed later */ - lem.nstate = 0; - FindStates(&lem); - lem.sorted = State_arrayof(); - - /* Tie up loose ends on the propagation links */ - FindLinks(&lem); - - /* Compute the follow set of every reducible configuration */ - FindFollowSets(&lem); - - /* Compute the action tables */ - FindActions(&lem); - - /* Compress the action tables */ - if( compress==0 ) CompressTables(&lem); - - /* Reorder and renumber the states so that states with fewer choices - ** occur at the end. This is an optimization that helps make the - ** generated parser tables smaller. */ - if( noResort==0 ) ResortStates(&lem); - - /* Generate a report of the parser generated. (the "y.output" file) */ - if( !quiet ) ReportOutput(&lem); - - /* Generate the source code for the parser */ - ReportTable(&lem, mhflag); - - /* Produce a header file for use by the scanner. (This step is - ** omitted if the "-m" option is used because makeheaders will - ** generate the file for us.) */ - if( !mhflag ) ReportHeader(&lem); - } - if( statistics ){ - printf("Parser statistics:\n"); - stats_line("terminal symbols", lem.nterminal); - stats_line("non-terminal symbols", lem.nsymbol - lem.nterminal); - stats_line("total symbols", lem.nsymbol); - stats_line("rules", lem.nrule); - stats_line("states", lem.nxstate); - stats_line("conflicts", lem.nconflict); - stats_line("action table entries", lem.nactiontab); - stats_line("total table size (bytes)", lem.tablesize); - } - if( lem.nconflict > 0 ){ - fprintf(stderr,"%d parsing conflicts.\n",lem.nconflict); - } - - /* return 0 on success, 1 on failure. */ - exitcode = ((lem.errorcnt > 0) || (lem.nconflict > 0)) ? 1 : 0; - exit(exitcode); - return (exitcode); -} -/******************** From the file "msort.c" *******************************/ -/* -** A generic merge-sort program. -** -** USAGE: -** Let "ptr" be a pointer to some structure which is at the head of -** a null-terminated list. Then to sort the list call: -** -** ptr = msort(ptr,&(ptr->next),cmpfnc); -** -** In the above, "cmpfnc" is a pointer to a function which compares -** two instances of the structure and returns an integer, as in -** strcmp. The second argument is a pointer to the pointer to the -** second element of the linked list. This address is used to compute -** the offset to the "next" field within the structure. The offset to -** the "next" field must be constant for all structures in the list. -** -** The function returns a new pointer which is the head of the list -** after sorting. -** -** ALGORITHM: -** Merge-sort. -*/ - -/* -** Return a pointer to the next structure in the linked list. -*/ -#define NEXT(A) (*(char**)(((char*)A)+offset)) - -/* -** Inputs: -** a: A sorted, null-terminated linked list. (May be null). -** b: A sorted, null-terminated linked list. (May be null). -** cmp: A pointer to the comparison function. -** offset: Offset in the structure to the "next" field. -** -** Return Value: -** A pointer to the head of a sorted list containing the elements -** of both a and b. -** -** Side effects: -** The "next" pointers for elements in the lists a and b are -** changed. -*/ -static char *merge( - char *a, - char *b, - int (*cmp)(const char*,const char*), - int offset -){ - char *ptr, *head; - - if( a==0 ){ - head = b; - }else if( b==0 ){ - head = a; - }else{ - if( (*cmp)(a,b)<=0 ){ - ptr = a; - a = NEXT(a); - }else{ - ptr = b; - b = NEXT(b); - } - head = ptr; - while( a && b ){ - if( (*cmp)(a,b)<=0 ){ - NEXT(ptr) = a; - ptr = a; - a = NEXT(a); - }else{ - NEXT(ptr) = b; - ptr = b; - b = NEXT(b); - } - } - if( a ) NEXT(ptr) = a; - else NEXT(ptr) = b; - } - return head; -} - -/* -** Inputs: -** list: Pointer to a singly-linked list of structures. -** next: Pointer to pointer to the second element of the list. -** cmp: A comparison function. -** -** Return Value: -** A pointer to the head of a sorted list containing the elements -** originally in list. -** -** Side effects: -** The "next" pointers for elements in list are changed. -*/ -#define LISTSIZE 30 -static char *msort( - char *list, - char **next, - int (*cmp)(const char*,const char*) -){ - unsigned long offset; - char *ep; - char *set[LISTSIZE]; - int i; - offset = (unsigned long)((char*)next - (char*)list); - for(i=0; istate = WAITING_FOR_DECL_KEYWORD; - }else if( ISLOWER(x[0]) ){ - psp->lhs = Symbol_new(x); - psp->nrhs = 0; - psp->lhsalias = 0; - psp->state = WAITING_FOR_ARROW; - }else if( x[0]=='{' ){ - if( psp->prevrule==0 ){ - ErrorMsg(psp->filename,psp->tokenlineno, -"There is no prior rule upon which to attach the code \ -fragment which begins on this line."); - psp->errorcnt++; - }else if( psp->prevrule->code!=0 ){ - ErrorMsg(psp->filename,psp->tokenlineno, -"Code fragment beginning on this line is not the first \ -to follow the previous rule."); - psp->errorcnt++; - }else{ - psp->prevrule->line = psp->tokenlineno; - psp->prevrule->code = &x[1]; - psp->prevrule->noCode = 0; - } - }else if( x[0]=='[' ){ - psp->state = PRECEDENCE_MARK_1; - }else{ - ErrorMsg(psp->filename,psp->tokenlineno, - "Token \"%s\" should be either \"%%\" or a nonterminal name.", - x); - psp->errorcnt++; - } - break; - case PRECEDENCE_MARK_1: - if( !ISUPPER(x[0]) ){ - ErrorMsg(psp->filename,psp->tokenlineno, - "The precedence symbol must be a terminal."); - psp->errorcnt++; - }else if( psp->prevrule==0 ){ - ErrorMsg(psp->filename,psp->tokenlineno, - "There is no prior rule to assign precedence \"[%s]\".",x); - psp->errorcnt++; - }else if( psp->prevrule->precsym!=0 ){ - ErrorMsg(psp->filename,psp->tokenlineno, -"Precedence mark on this line is not the first \ -to follow the previous rule."); - psp->errorcnt++; - }else{ - psp->prevrule->precsym = Symbol_new(x); - } - psp->state = PRECEDENCE_MARK_2; - break; - case PRECEDENCE_MARK_2: - if( x[0]!=']' ){ - ErrorMsg(psp->filename,psp->tokenlineno, - "Missing \"]\" on precedence mark."); - psp->errorcnt++; - } - psp->state = WAITING_FOR_DECL_OR_RULE; - break; - case WAITING_FOR_ARROW: - if( x[0]==':' && x[1]==':' && x[2]=='=' ){ - psp->state = IN_RHS; - }else if( x[0]=='(' ){ - psp->state = LHS_ALIAS_1; - }else{ - ErrorMsg(psp->filename,psp->tokenlineno, - "Expected to see a \":\" following the LHS symbol \"%s\".", - psp->lhs->name); - psp->errorcnt++; - psp->state = RESYNC_AFTER_RULE_ERROR; - } - break; - case LHS_ALIAS_1: - if( ISALPHA(x[0]) ){ - psp->lhsalias = x; - psp->state = LHS_ALIAS_2; - }else{ - ErrorMsg(psp->filename,psp->tokenlineno, - "\"%s\" is not a valid alias for the LHS \"%s\"\n", - x,psp->lhs->name); - psp->errorcnt++; - psp->state = RESYNC_AFTER_RULE_ERROR; - } - break; - case LHS_ALIAS_2: - if( x[0]==')' ){ - psp->state = LHS_ALIAS_3; - }else{ - ErrorMsg(psp->filename,psp->tokenlineno, - "Missing \")\" following LHS alias name \"%s\".",psp->lhsalias); - psp->errorcnt++; - psp->state = RESYNC_AFTER_RULE_ERROR; - } - break; - case LHS_ALIAS_3: - if( x[0]==':' && x[1]==':' && x[2]=='=' ){ - psp->state = IN_RHS; - }else{ - ErrorMsg(psp->filename,psp->tokenlineno, - "Missing \"->\" following: \"%s(%s)\".", - psp->lhs->name,psp->lhsalias); - psp->errorcnt++; - psp->state = RESYNC_AFTER_RULE_ERROR; - } - break; - case IN_RHS: - if( x[0]=='.' ){ - struct rule *rp; - rp = (struct rule *)calloc( sizeof(struct rule) + - sizeof(struct symbol*)*psp->nrhs + sizeof(char*)*psp->nrhs, 1); - if( rp==0 ){ - ErrorMsg(psp->filename,psp->tokenlineno, - "Can't allocate enough memory for this rule."); - psp->errorcnt++; - psp->prevrule = 0; - }else{ - int i; - rp->ruleline = psp->tokenlineno; - rp->rhs = (struct symbol**)&rp[1]; - rp->rhsalias = (const char**)&(rp->rhs[psp->nrhs]); - for(i=0; inrhs; i++){ - rp->rhs[i] = psp->rhs[i]; - rp->rhsalias[i] = psp->alias[i]; - } - rp->lhs = psp->lhs; - rp->lhsalias = psp->lhsalias; - rp->nrhs = psp->nrhs; - rp->code = 0; - rp->noCode = 1; - rp->precsym = 0; - rp->index = psp->gp->nrule++; - rp->nextlhs = rp->lhs->rule; - rp->lhs->rule = rp; - rp->next = 0; - if( psp->firstrule==0 ){ - psp->firstrule = psp->lastrule = rp; - }else{ - psp->lastrule->next = rp; - psp->lastrule = rp; - } - psp->prevrule = rp; - } - psp->state = WAITING_FOR_DECL_OR_RULE; - }else if( ISALPHA(x[0]) ){ - if( psp->nrhs>=MAXRHS ){ - ErrorMsg(psp->filename,psp->tokenlineno, - "Too many symbols on RHS of rule beginning at \"%s\".", - x); - psp->errorcnt++; - psp->state = RESYNC_AFTER_RULE_ERROR; - }else{ - psp->rhs[psp->nrhs] = Symbol_new(x); - psp->alias[psp->nrhs] = 0; - psp->nrhs++; - } - }else if( (x[0]=='|' || x[0]=='/') && psp->nrhs>0 ){ - struct symbol *msp = psp->rhs[psp->nrhs-1]; - if( msp->type!=MULTITERMINAL ){ - struct symbol *origsp = msp; - msp = (struct symbol *) calloc(1,sizeof(*msp)); - memset(msp, 0, sizeof(*msp)); - msp->type = MULTITERMINAL; - msp->nsubsym = 1; - msp->subsym = (struct symbol **) calloc(1,sizeof(struct symbol*)); - msp->subsym[0] = origsp; - msp->name = origsp->name; - psp->rhs[psp->nrhs-1] = msp; - } - msp->nsubsym++; - msp->subsym = (struct symbol **) realloc(msp->subsym, - sizeof(struct symbol*)*msp->nsubsym); - msp->subsym[msp->nsubsym-1] = Symbol_new(&x[1]); - if( ISLOWER(x[1]) || ISLOWER(msp->subsym[0]->name[0]) ){ - ErrorMsg(psp->filename,psp->tokenlineno, - "Cannot form a compound containing a non-terminal"); - psp->errorcnt++; - } - }else if( x[0]=='(' && psp->nrhs>0 ){ - psp->state = RHS_ALIAS_1; - }else{ - ErrorMsg(psp->filename,psp->tokenlineno, - "Illegal character on RHS of rule: \"%s\".",x); - psp->errorcnt++; - psp->state = RESYNC_AFTER_RULE_ERROR; - } - break; - case RHS_ALIAS_1: - if( ISALPHA(x[0]) ){ - psp->alias[psp->nrhs-1] = x; - psp->state = RHS_ALIAS_2; - }else{ - ErrorMsg(psp->filename,psp->tokenlineno, - "\"%s\" is not a valid alias for the RHS symbol \"%s\"\n", - x,psp->rhs[psp->nrhs-1]->name); - psp->errorcnt++; - psp->state = RESYNC_AFTER_RULE_ERROR; - } - break; - case RHS_ALIAS_2: - if( x[0]==')' ){ - psp->state = IN_RHS; - }else{ - ErrorMsg(psp->filename,psp->tokenlineno, - "Missing \")\" following LHS alias name \"%s\".",psp->lhsalias); - psp->errorcnt++; - psp->state = RESYNC_AFTER_RULE_ERROR; - } - break; - case WAITING_FOR_DECL_KEYWORD: - if( ISALPHA(x[0]) ){ - psp->declkeyword = x; - psp->declargslot = 0; - psp->decllinenoslot = 0; - psp->insertLineMacro = 1; - psp->state = WAITING_FOR_DECL_ARG; - if( strcmp(x,"name")==0 ){ - psp->declargslot = &(psp->gp->name); - psp->insertLineMacro = 0; - }else if( strcmp(x,"include")==0 ){ - psp->declargslot = &(psp->gp->include); - }else if( strcmp(x,"code")==0 ){ - psp->declargslot = &(psp->gp->extracode); - }else if( strcmp(x,"token_destructor")==0 ){ - psp->declargslot = &psp->gp->tokendest; - }else if( strcmp(x,"default_destructor")==0 ){ - psp->declargslot = &psp->gp->vardest; - }else if( strcmp(x,"token_prefix")==0 ){ - psp->declargslot = &psp->gp->tokenprefix; - psp->insertLineMacro = 0; - }else if( strcmp(x,"syntax_error")==0 ){ - psp->declargslot = &(psp->gp->error); - }else if( strcmp(x,"parse_accept")==0 ){ - psp->declargslot = &(psp->gp->accept); - }else if( strcmp(x,"parse_failure")==0 ){ - psp->declargslot = &(psp->gp->failure); - }else if( strcmp(x,"stack_overflow")==0 ){ - psp->declargslot = &(psp->gp->overflow); - }else if( strcmp(x,"extra_argument")==0 ){ - psp->declargslot = &(psp->gp->arg); - psp->insertLineMacro = 0; - }else if( strcmp(x,"token_type")==0 ){ - psp->declargslot = &(psp->gp->tokentype); - psp->insertLineMacro = 0; - }else if( strcmp(x,"default_type")==0 ){ - psp->declargslot = &(psp->gp->vartype); - psp->insertLineMacro = 0; - }else if( strcmp(x,"stack_size")==0 ){ - psp->declargslot = &(psp->gp->stacksize); - psp->insertLineMacro = 0; - }else if( strcmp(x,"start_symbol")==0 ){ - psp->declargslot = &(psp->gp->start); - psp->insertLineMacro = 0; - }else if( strcmp(x,"left")==0 ){ - psp->preccounter++; - psp->declassoc = LEFT; - psp->state = WAITING_FOR_PRECEDENCE_SYMBOL; - }else if( strcmp(x,"right")==0 ){ - psp->preccounter++; - psp->declassoc = RIGHT; - psp->state = WAITING_FOR_PRECEDENCE_SYMBOL; - }else if( strcmp(x,"nonassoc")==0 ){ - psp->preccounter++; - psp->declassoc = NONE; - psp->state = WAITING_FOR_PRECEDENCE_SYMBOL; - }else if( strcmp(x,"destructor")==0 ){ - psp->state = WAITING_FOR_DESTRUCTOR_SYMBOL; - }else if( strcmp(x,"type")==0 ){ - psp->state = WAITING_FOR_DATATYPE_SYMBOL; - }else if( strcmp(x,"fallback")==0 ){ - psp->fallback = 0; - psp->state = WAITING_FOR_FALLBACK_ID; - }else if( strcmp(x,"token")==0 ){ - psp->state = WAITING_FOR_TOKEN_NAME; - }else if( strcmp(x,"wildcard")==0 ){ - psp->state = WAITING_FOR_WILDCARD_ID; - }else if( strcmp(x,"token_class")==0 ){ - psp->state = WAITING_FOR_CLASS_ID; - }else{ - ErrorMsg(psp->filename,psp->tokenlineno, - "Unknown declaration keyword: \"%%%s\".",x); - psp->errorcnt++; - psp->state = RESYNC_AFTER_DECL_ERROR; - } - }else{ - ErrorMsg(psp->filename,psp->tokenlineno, - "Illegal declaration keyword: \"%s\".",x); - psp->errorcnt++; - psp->state = RESYNC_AFTER_DECL_ERROR; - } - break; - case WAITING_FOR_DESTRUCTOR_SYMBOL: - if( !ISALPHA(x[0]) ){ - ErrorMsg(psp->filename,psp->tokenlineno, - "Symbol name missing after %%destructor keyword"); - psp->errorcnt++; - psp->state = RESYNC_AFTER_DECL_ERROR; - }else{ - struct symbol *sp = Symbol_new(x); - psp->declargslot = &sp->destructor; - psp->decllinenoslot = &sp->destLineno; - psp->insertLineMacro = 1; - psp->state = WAITING_FOR_DECL_ARG; - } - break; - case WAITING_FOR_DATATYPE_SYMBOL: - if( !ISALPHA(x[0]) ){ - ErrorMsg(psp->filename,psp->tokenlineno, - "Symbol name missing after %%type keyword"); - psp->errorcnt++; - psp->state = RESYNC_AFTER_DECL_ERROR; - }else{ - struct symbol *sp = Symbol_find(x); - if((sp) && (sp->datatype)){ - ErrorMsg(psp->filename,psp->tokenlineno, - "Symbol %%type \"%s\" already defined", x); - psp->errorcnt++; - psp->state = RESYNC_AFTER_DECL_ERROR; - }else{ - if (!sp){ - sp = Symbol_new(x); - } - psp->declargslot = &sp->datatype; - psp->insertLineMacro = 0; - psp->state = WAITING_FOR_DECL_ARG; - } - } - break; - case WAITING_FOR_PRECEDENCE_SYMBOL: - if( x[0]=='.' ){ - psp->state = WAITING_FOR_DECL_OR_RULE; - }else if( ISUPPER(x[0]) ){ - struct symbol *sp; - sp = Symbol_new(x); - if( sp->prec>=0 ){ - ErrorMsg(psp->filename,psp->tokenlineno, - "Symbol \"%s\" has already be given a precedence.",x); - psp->errorcnt++; - }else{ - sp->prec = psp->preccounter; - sp->assoc = psp->declassoc; - } - }else{ - ErrorMsg(psp->filename,psp->tokenlineno, - "Can't assign a precedence to \"%s\".",x); - psp->errorcnt++; - } - break; - case WAITING_FOR_DECL_ARG: - if( x[0]=='{' || x[0]=='\"' || ISALNUM(x[0]) ){ - const char *zOld, *zNew; - char *zBuf, *z; - int nOld, n, nLine = 0, nNew, nBack; - int addLineMacro; - char zLine[50]; - zNew = x; - if( zNew[0]=='"' || zNew[0]=='{' ) zNew++; - nNew = lemonStrlen(zNew); - if( *psp->declargslot ){ - zOld = *psp->declargslot; - }else{ - zOld = ""; - } - nOld = lemonStrlen(zOld); - n = nOld + nNew + 20; - addLineMacro = !psp->gp->nolinenosflag && psp->insertLineMacro && - (psp->decllinenoslot==0 || psp->decllinenoslot[0]!=0); - if( addLineMacro ){ - for(z=psp->filename, nBack=0; *z; z++){ - if( *z=='\\' ) nBack++; - } - lemon_sprintf(zLine, "#line %d ", psp->tokenlineno); - nLine = lemonStrlen(zLine); - n += nLine + lemonStrlen(psp->filename) + nBack; - } - *psp->declargslot = (char *) realloc(*psp->declargslot, n); - zBuf = *psp->declargslot + nOld; - if( addLineMacro ){ - if( nOld && zBuf[-1]!='\n' ){ - *(zBuf++) = '\n'; - } - memcpy(zBuf, zLine, nLine); - zBuf += nLine; - *(zBuf++) = '"'; - for(z=psp->filename; *z; z++){ - if( *z=='\\' ){ - *(zBuf++) = '\\'; - } - *(zBuf++) = *z; - } - *(zBuf++) = '"'; - *(zBuf++) = '\n'; - } - if( psp->decllinenoslot && psp->decllinenoslot[0]==0 ){ - psp->decllinenoslot[0] = psp->tokenlineno; - } - memcpy(zBuf, zNew, nNew); - zBuf += nNew; - *zBuf = 0; - psp->state = WAITING_FOR_DECL_OR_RULE; - }else{ - ErrorMsg(psp->filename,psp->tokenlineno, - "Illegal argument to %%%s: %s",psp->declkeyword,x); - psp->errorcnt++; - psp->state = RESYNC_AFTER_DECL_ERROR; - } - break; - case WAITING_FOR_FALLBACK_ID: - if( x[0]=='.' ){ - psp->state = WAITING_FOR_DECL_OR_RULE; - }else if( !ISUPPER(x[0]) ){ - ErrorMsg(psp->filename, psp->tokenlineno, - "%%fallback argument \"%s\" should be a token", x); - psp->errorcnt++; - }else{ - struct symbol *sp = Symbol_new(x); - if( psp->fallback==0 ){ - psp->fallback = sp; - }else if( sp->fallback ){ - ErrorMsg(psp->filename, psp->tokenlineno, - "More than one fallback assigned to token %s", x); - psp->errorcnt++; - }else{ - sp->fallback = psp->fallback; - psp->gp->has_fallback = 1; - } - } - break; - case WAITING_FOR_TOKEN_NAME: - /* Tokens do not have to be declared before use. But they can be - ** in order to control their assigned integer number. The number for - ** each token is assigned when it is first seen. So by including - ** - ** %token ONE TWO THREE - ** - ** early in the grammar file, that assigns small consecutive values - ** to each of the tokens ONE TWO and THREE. - */ - if( x[0]=='.' ){ - psp->state = WAITING_FOR_DECL_OR_RULE; - }else if( !ISUPPER(x[0]) ){ - ErrorMsg(psp->filename, psp->tokenlineno, - "%%token argument \"%s\" should be a token", x); - psp->errorcnt++; - }else{ - (void)Symbol_new(x); - } - break; - case WAITING_FOR_WILDCARD_ID: - if( x[0]=='.' ){ - psp->state = WAITING_FOR_DECL_OR_RULE; - }else if( !ISUPPER(x[0]) ){ - ErrorMsg(psp->filename, psp->tokenlineno, - "%%wildcard argument \"%s\" should be a token", x); - psp->errorcnt++; - }else{ - struct symbol *sp = Symbol_new(x); - if( psp->gp->wildcard==0 ){ - psp->gp->wildcard = sp; - }else{ - ErrorMsg(psp->filename, psp->tokenlineno, - "Extra wildcard to token: %s", x); - psp->errorcnt++; - } - } - break; - case WAITING_FOR_CLASS_ID: - if( !ISLOWER(x[0]) ){ - ErrorMsg(psp->filename, psp->tokenlineno, - "%%token_class must be followed by an identifier: ", x); - psp->errorcnt++; - psp->state = RESYNC_AFTER_DECL_ERROR; - }else if( Symbol_find(x) ){ - ErrorMsg(psp->filename, psp->tokenlineno, - "Symbol \"%s\" already used", x); - psp->errorcnt++; - psp->state = RESYNC_AFTER_DECL_ERROR; - }else{ - psp->tkclass = Symbol_new(x); - psp->tkclass->type = MULTITERMINAL; - psp->state = WAITING_FOR_CLASS_TOKEN; - } - break; - case WAITING_FOR_CLASS_TOKEN: - if( x[0]=='.' ){ - psp->state = WAITING_FOR_DECL_OR_RULE; - }else if( ISUPPER(x[0]) || ((x[0]=='|' || x[0]=='/') && ISUPPER(x[1])) ){ - struct symbol *msp = psp->tkclass; - msp->nsubsym++; - msp->subsym = (struct symbol **) realloc(msp->subsym, - sizeof(struct symbol*)*msp->nsubsym); - if( !ISUPPER(x[0]) ) x++; - msp->subsym[msp->nsubsym-1] = Symbol_new(x); - }else{ - ErrorMsg(psp->filename, psp->tokenlineno, - "%%token_class argument \"%s\" should be a token", x); - psp->errorcnt++; - psp->state = RESYNC_AFTER_DECL_ERROR; - } - break; - case RESYNC_AFTER_RULE_ERROR: -/* if( x[0]=='.' ) psp->state = WAITING_FOR_DECL_OR_RULE; -** break; */ - case RESYNC_AFTER_DECL_ERROR: - if( x[0]=='.' ) psp->state = WAITING_FOR_DECL_OR_RULE; - if( x[0]=='%' ) psp->state = WAITING_FOR_DECL_KEYWORD; - break; - } -} - -/* Run the preprocessor over the input file text. The global variables -** azDefine[0] through azDefine[nDefine-1] contains the names of all defined -** macros. This routine looks for "%ifdef" and "%ifndef" and "%endif" and -** comments them out. Text in between is also commented out as appropriate. -*/ -static void preprocess_input(char *z){ - int i, j, k, n; - int exclude = 0; - int start = 0; - int lineno = 1; - int start_lineno = 1; - for(i=0; z[i]; i++){ - if( z[i]=='\n' ) lineno++; - if( z[i]!='%' || (i>0 && z[i-1]!='\n') ) continue; - if( strncmp(&z[i],"%endif",6)==0 && ISSPACE(z[i+6]) ){ - if( exclude ){ - exclude--; - if( exclude==0 ){ - for(j=start; jfilename; - ps.errorcnt = 0; - ps.state = INITIALIZE; - - /* Begin by reading the input file */ - fp = fopen(ps.filename,"rb"); - if( fp==0 ){ - ErrorMsg(ps.filename,0,"Can't open this file for reading."); - gp->errorcnt++; - return; - } - fseek(fp,0,2); - filesize = ftell(fp); - rewind(fp); - filebuf = (char *)malloc( filesize+1 ); - if( filesize>100000000 || filebuf==0 ){ - ErrorMsg(ps.filename,0,"Input file too large."); - gp->errorcnt++; - fclose(fp); - return; - } - if( fread(filebuf,1,filesize,fp)!=filesize ){ - ErrorMsg(ps.filename,0,"Can't read in all %d bytes of this file.", - filesize); - free(filebuf); - gp->errorcnt++; - fclose(fp); - return; - } - fclose(fp); - filebuf[filesize] = 0; - - /* Make an initial pass through the file to handle %ifdef and %ifndef */ - preprocess_input(filebuf); - - /* Now scan the text of the input file */ - lineno = 1; - for(cp=filebuf; (c= *cp)!=0; ){ - if( c=='\n' ) lineno++; /* Keep track of the line number */ - if( ISSPACE(c) ){ cp++; continue; } /* Skip all white space */ - if( c=='/' && cp[1]=='/' ){ /* Skip C++ style comments */ - cp+=2; - while( (c= *cp)!=0 && c!='\n' ) cp++; - continue; - } - if( c=='/' && cp[1]=='*' ){ /* Skip C style comments */ - cp+=2; - while( (c= *cp)!=0 && (c!='/' || cp[-1]!='*') ){ - if( c=='\n' ) lineno++; - cp++; - } - if( c ) cp++; - continue; - } - ps.tokenstart = cp; /* Mark the beginning of the token */ - ps.tokenlineno = lineno; /* Linenumber on which token begins */ - if( c=='\"' ){ /* String literals */ - cp++; - while( (c= *cp)!=0 && c!='\"' ){ - if( c=='\n' ) lineno++; - cp++; - } - if( c==0 ){ - ErrorMsg(ps.filename,startline, -"String starting on this line is not terminated before the end of the file."); - ps.errorcnt++; - nextcp = cp; - }else{ - nextcp = cp+1; - } - }else if( c=='{' ){ /* A block of C code */ - int level; - cp++; - for(level=1; (c= *cp)!=0 && (level>1 || c!='}'); cp++){ - if( c=='\n' ) lineno++; - else if( c=='{' ) level++; - else if( c=='}' ) level--; - else if( c=='/' && cp[1]=='*' ){ /* Skip comments */ - int prevc; - cp = &cp[2]; - prevc = 0; - while( (c= *cp)!=0 && (c!='/' || prevc!='*') ){ - if( c=='\n' ) lineno++; - prevc = c; - cp++; - } - }else if( c=='/' && cp[1]=='/' ){ /* Skip C++ style comments too */ - cp = &cp[2]; - while( (c= *cp)!=0 && c!='\n' ) cp++; - if( c ) lineno++; - }else if( c=='\'' || c=='\"' ){ /* String a character literals */ - int startchar, prevc; - startchar = c; - prevc = 0; - for(cp++; (c= *cp)!=0 && (c!=startchar || prevc=='\\'); cp++){ - if( c=='\n' ) lineno++; - if( prevc=='\\' ) prevc = 0; - else prevc = c; - } - } - } - if( c==0 ){ - ErrorMsg(ps.filename,ps.tokenlineno, -"C code starting on this line is not terminated before the end of the file."); - ps.errorcnt++; - nextcp = cp; - }else{ - nextcp = cp+1; - } - }else if( ISALNUM(c) ){ /* Identifiers */ - while( (c= *cp)!=0 && (ISALNUM(c) || c=='_') ) cp++; - nextcp = cp; - }else if( c==':' && cp[1]==':' && cp[2]=='=' ){ /* The operator "::=" */ - cp += 3; - nextcp = cp; - }else if( (c=='/' || c=='|') && ISALPHA(cp[1]) ){ - cp += 2; - while( (c = *cp)!=0 && (ISALNUM(c) || c=='_') ) cp++; - nextcp = cp; - }else{ /* All other (one character) operators */ - cp++; - nextcp = cp; - } - c = *cp; - *cp = 0; /* Null terminate the token */ - parseonetoken(&ps); /* Parse the token */ - *cp = (char)c; /* Restore the buffer */ - cp = nextcp; - } - free(filebuf); /* Release the buffer after parsing */ - gp->rule = ps.firstrule; - gp->errorcnt = ps.errorcnt; -} -/*************************** From the file "plink.c" *********************/ -/* -** Routines processing configuration follow-set propagation links -** in the LEMON parser generator. -*/ -static struct plink *plink_freelist = 0; - -/* Allocate a new plink */ -struct plink *Plink_new(void){ - struct plink *newlink; - - if( plink_freelist==0 ){ - int i; - int amt = 100; - plink_freelist = (struct plink *)calloc( amt, sizeof(struct plink) ); - if( plink_freelist==0 ){ - fprintf(stderr, - "Unable to allocate memory for a new follow-set propagation link.\n"); - exit(1); - } - for(i=0; inext; - return newlink; -} - -/* Add a plink to a plink list */ -void Plink_add(struct plink **plpp, struct config *cfp) -{ - struct plink *newlink; - newlink = Plink_new(); - newlink->next = *plpp; - *plpp = newlink; - newlink->cfp = cfp; -} - -/* Transfer every plink on the list "from" to the list "to" */ -void Plink_copy(struct plink **to, struct plink *from) -{ - struct plink *nextpl; - while( from ){ - nextpl = from->next; - from->next = *to; - *to = from; - from = nextpl; - } -} - -/* Delete every plink on the list */ -void Plink_delete(struct plink *plp) -{ - struct plink *nextpl; - - while( plp ){ - nextpl = plp->next; - plp->next = plink_freelist; - plink_freelist = plp; - plp = nextpl; - } -} -/*********************** From the file "report.c" **************************/ -/* -** Procedures for generating reports and tables in the LEMON parser generator. -*/ - -/* Generate a filename with the given suffix. Space to hold the -** name comes from malloc() and must be freed by the calling -** function. -*/ -PRIVATE char *file_makename(struct lemon *lemp, const char *suffix) -{ - char *name; - char *cp; - - name = (char*)malloc( lemonStrlen(lemp->filename) + lemonStrlen(suffix) + 5 ); - if( name==0 ){ - fprintf(stderr,"Can't allocate space for a filename.\n"); - exit(1); - } - lemon_strcpy(name,lemp->filename); - cp = strrchr(name,'.'); - if( cp ) *cp = 0; - lemon_strcat(name,suffix); - return name; -} - -/* Open a file with a name based on the name of the input file, -** but with a different (specified) suffix, and return a pointer -** to the stream */ -PRIVATE FILE *file_open( - struct lemon *lemp, - const char *suffix, - const char *mode -){ - FILE *fp; - - if( lemp->outname ) free(lemp->outname); - lemp->outname = file_makename(lemp, suffix); - fp = fopen(lemp->outname,mode); - if( fp==0 && *mode=='w' ){ - fprintf(stderr,"Can't open file \"%s\".\n",lemp->outname); - lemp->errorcnt++; - return 0; - } - return fp; -} - -/* Duplicate the input file without comments and without actions -** on rules */ -void Reprint(struct lemon *lemp) -{ - struct rule *rp; - struct symbol *sp; - int i, j, maxlen, len, ncolumns, skip; - printf("// Reprint of input file \"%s\".\n// Symbols:\n",lemp->filename); - maxlen = 10; - for(i=0; insymbol; i++){ - sp = lemp->symbols[i]; - len = lemonStrlen(sp->name); - if( len>maxlen ) maxlen = len; - } - ncolumns = 76/(maxlen+5); - if( ncolumns<1 ) ncolumns = 1; - skip = (lemp->nsymbol + ncolumns - 1)/ncolumns; - for(i=0; insymbol; j+=skip){ - sp = lemp->symbols[j]; - assert( sp->index==j ); - printf(" %3d %-*.*s",j,maxlen,maxlen,sp->name); - } - printf("\n"); - } - for(rp=lemp->rule; rp; rp=rp->next){ - printf("%s",rp->lhs->name); - /* if( rp->lhsalias ) printf("(%s)",rp->lhsalias); */ - printf(" ::="); - for(i=0; inrhs; i++){ - sp = rp->rhs[i]; - if( sp->type==MULTITERMINAL ){ - printf(" %s", sp->subsym[0]->name); - for(j=1; jnsubsym; j++){ - printf("|%s", sp->subsym[j]->name); - } - }else{ - printf(" %s", sp->name); - } - /* if( rp->rhsalias[i] ) printf("(%s)",rp->rhsalias[i]); */ - } - printf("."); - if( rp->precsym ) printf(" [%s]",rp->precsym->name); - /* if( rp->code ) printf("\n %s",rp->code); */ - printf("\n"); - } -} - -/* Print a single rule. -*/ -void RulePrint(FILE *fp, struct rule *rp, int iCursor){ - struct symbol *sp; - int i, j; - fprintf(fp,"%s ::=",rp->lhs->name); - for(i=0; i<=rp->nrhs; i++){ - if( i==iCursor ) fprintf(fp," *"); - if( i==rp->nrhs ) break; - sp = rp->rhs[i]; - if( sp->type==MULTITERMINAL ){ - fprintf(fp," %s", sp->subsym[0]->name); - for(j=1; jnsubsym; j++){ - fprintf(fp,"|%s",sp->subsym[j]->name); - } - }else{ - fprintf(fp," %s", sp->name); - } - } -} - -/* Print the rule for a configuration. -*/ -void ConfigPrint(FILE *fp, struct config *cfp){ - RulePrint(fp, cfp->rp, cfp->dot); -} - -/* #define TEST */ -#if 0 -/* Print a set */ -PRIVATE void SetPrint(out,set,lemp) -FILE *out; -char *set; -struct lemon *lemp; -{ - int i; - char *spacer; - spacer = ""; - fprintf(out,"%12s[",""); - for(i=0; interminal; i++){ - if( SetFind(set,i) ){ - fprintf(out,"%s%s",spacer,lemp->symbols[i]->name); - spacer = " "; - } - } - fprintf(out,"]\n"); -} - -/* Print a plink chain */ -PRIVATE void PlinkPrint(out,plp,tag) -FILE *out; -struct plink *plp; -char *tag; -{ - while( plp ){ - fprintf(out,"%12s%s (state %2d) ","",tag,plp->cfp->stp->statenum); - ConfigPrint(out,plp->cfp); - fprintf(out,"\n"); - plp = plp->next; - } -} -#endif - -/* Print an action to the given file descriptor. Return FALSE if -** nothing was actually printed. -*/ -int PrintAction( - struct action *ap, /* The action to print */ - FILE *fp, /* Print the action here */ - int indent /* Indent by this amount */ -){ - int result = 1; - switch( ap->type ){ - case SHIFT: { - struct state *stp = ap->x.stp; - fprintf(fp,"%*s shift %-7d",indent,ap->sp->name,stp->statenum); - break; - } - case REDUCE: { - struct rule *rp = ap->x.rp; - fprintf(fp,"%*s reduce %-7d",indent,ap->sp->name,rp->iRule); - RulePrint(fp, rp, -1); - break; - } - case SHIFTREDUCE: { - struct rule *rp = ap->x.rp; - fprintf(fp,"%*s shift-reduce %-7d",indent,ap->sp->name,rp->iRule); - RulePrint(fp, rp, -1); - break; - } - case ACCEPT: - fprintf(fp,"%*s accept",indent,ap->sp->name); - break; - case ERROR: - fprintf(fp,"%*s error",indent,ap->sp->name); - break; - case SRCONFLICT: - case RRCONFLICT: - fprintf(fp,"%*s reduce %-7d ** Parsing conflict **", - indent,ap->sp->name,ap->x.rp->iRule); - break; - case SSCONFLICT: - fprintf(fp,"%*s shift %-7d ** Parsing conflict **", - indent,ap->sp->name,ap->x.stp->statenum); - break; - case SH_RESOLVED: - if( showPrecedenceConflict ){ - fprintf(fp,"%*s shift %-7d -- dropped by precedence", - indent,ap->sp->name,ap->x.stp->statenum); - }else{ - result = 0; - } - break; - case RD_RESOLVED: - if( showPrecedenceConflict ){ - fprintf(fp,"%*s reduce %-7d -- dropped by precedence", - indent,ap->sp->name,ap->x.rp->iRule); - }else{ - result = 0; - } - break; - case NOT_USED: - result = 0; - break; - } - if( result && ap->spOpt ){ - fprintf(fp," /* because %s==%s */", ap->sp->name, ap->spOpt->name); - } - return result; -} - -/* Generate the "*.out" log file */ -void ReportOutput(struct lemon *lemp) -{ - int i; - struct state *stp; - struct config *cfp; - struct action *ap; - FILE *fp; - - fp = file_open(lemp,".out","wb"); - if( fp==0 ) return; - for(i=0; inxstate; i++){ - stp = lemp->sorted[i]; - fprintf(fp,"State %d:\n",stp->statenum); - if( lemp->basisflag ) cfp=stp->bp; - else cfp=stp->cfp; - while( cfp ){ - char buf[20]; - if( cfp->dot==cfp->rp->nrhs ){ - lemon_sprintf(buf,"(%d)",cfp->rp->iRule); - fprintf(fp," %5s ",buf); - }else{ - fprintf(fp," "); - } - ConfigPrint(fp,cfp); - fprintf(fp,"\n"); -#if 0 - SetPrint(fp,cfp->fws,lemp); - PlinkPrint(fp,cfp->fplp,"To "); - PlinkPrint(fp,cfp->bplp,"From"); -#endif - if( lemp->basisflag ) cfp=cfp->bp; - else cfp=cfp->next; - } - fprintf(fp,"\n"); - for(ap=stp->ap; ap; ap=ap->next){ - if( PrintAction(ap,fp,30) ) fprintf(fp,"\n"); - } - fprintf(fp,"\n"); - } - fprintf(fp, "----------------------------------------------------\n"); - fprintf(fp, "Symbols:\n"); - for(i=0; insymbol; i++){ - int j; - struct symbol *sp; - - sp = lemp->symbols[i]; - fprintf(fp, " %3d: %s", i, sp->name); - if( sp->type==NONTERMINAL ){ - fprintf(fp, ":"); - if( sp->lambda ){ - fprintf(fp, " "); - } - for(j=0; jnterminal; j++){ - if( sp->firstset && SetFind(sp->firstset, j) ){ - fprintf(fp, " %s", lemp->symbols[j]->name); - } - } - } - fprintf(fp, "\n"); - } - fclose(fp); - return; -} - -/* Search for the file "name" which is in the same directory as -** the executable */ -PRIVATE char *pathsearch(char *argv0, char *name, int modemask) -{ - const char *pathlist; - char *pathbufptr; - char *pathbuf; - char *path,*cp; - char c; - -#ifdef __WIN32__ - cp = strrchr(argv0,'\\'); -#else - cp = strrchr(argv0,'/'); -#endif - if( cp ){ - c = *cp; - *cp = 0; - path = (char *)malloc( lemonStrlen(argv0) + lemonStrlen(name) + 2 ); - if( path ) lemon_sprintf(path,"%s/%s",argv0,name); - *cp = c; - }else{ - pathlist = getenv("PATH"); - if( pathlist==0 ) pathlist = ".:/bin:/usr/bin"; - pathbuf = (char *) malloc( lemonStrlen(pathlist) + 1 ); - path = (char *)malloc( lemonStrlen(pathlist)+lemonStrlen(name)+2 ); - if( (pathbuf != 0) && (path!=0) ){ - pathbufptr = pathbuf; - lemon_strcpy(pathbuf, pathlist); - while( *pathbuf ){ - cp = strchr(pathbuf,':'); - if( cp==0 ) cp = &pathbuf[lemonStrlen(pathbuf)]; - c = *cp; - *cp = 0; - lemon_sprintf(path,"%s/%s",pathbuf,name); - *cp = c; - if( c==0 ) pathbuf[0] = 0; - else pathbuf = &cp[1]; - if( access(path,modemask)==0 ) break; - } - free(pathbufptr); - } - } - return path; -} - -/* Given an action, compute the integer value for that action -** which is to be put in the action table of the generated machine. -** Return negative if no action should be generated. -*/ -PRIVATE int compute_action(struct lemon *lemp, struct action *ap) -{ - int act; - switch( ap->type ){ - case SHIFT: act = ap->x.stp->statenum; break; - case SHIFTREDUCE: { - act = ap->x.rp->iRule + lemp->nstate; - /* Since a SHIFT is inherient after a prior REDUCE, convert any - ** SHIFTREDUCE action with a nonterminal on the LHS into a simple - ** REDUCE action: */ - if( ap->sp->index>=lemp->nterminal ) act += lemp->nrule; - break; - } - case REDUCE: act = ap->x.rp->iRule + lemp->nstate+lemp->nrule; break; - case ERROR: act = lemp->nstate + lemp->nrule*2; break; - case ACCEPT: act = lemp->nstate + lemp->nrule*2 + 1; break; - default: act = -1; break; - } - return act; -} - -#define LINESIZE 1000 -/* The next cluster of routines are for reading the template file -** and writing the results to the generated parser */ -/* The first function transfers data from "in" to "out" until -** a line is seen which begins with "%%". The line number is -** tracked. -** -** if name!=0, then any word that begin with "Parse" is changed to -** begin with *name instead. -*/ -PRIVATE void tplt_xfer(char *name, FILE *in, FILE *out, int *lineno) -{ - int i, iStart; - char line[LINESIZE]; - while( fgets(line,LINESIZE,in) && (line[0]!='%' || line[1]!='%') ){ - (*lineno)++; - iStart = 0; - if( name ){ - for(i=0; line[i]; i++){ - if( line[i]=='P' && strncmp(&line[i],"Parse",5)==0 - && (i==0 || !ISALPHA(line[i-1])) - ){ - if( i>iStart ) fprintf(out,"%.*s",i-iStart,&line[iStart]); - fprintf(out,"%s",name); - i += 4; - iStart = i+1; - } - } - } - fprintf(out,"%s",&line[iStart]); - } -} - -/* The next function finds the template file and opens it, returning -** a pointer to the opened file. */ -PRIVATE FILE *tplt_open(struct lemon *lemp) -{ - static char templatename[] = "lempar.c"; - char buf[1000]; - FILE *in; - char *tpltname; - char *cp; - - /* first, see if user specified a template filename on the command line. */ - if (user_templatename != 0) { - if( access(user_templatename,004)==-1 ){ - fprintf(stderr,"Can't find the parser driver template file \"%s\".\n", - user_templatename); - lemp->errorcnt++; - return 0; - } - in = fopen(user_templatename,"rb"); - if( in==0 ){ - fprintf(stderr,"Can't open the template file \"%s\".\n", - user_templatename); - lemp->errorcnt++; - return 0; - } - return in; - } - - cp = strrchr(lemp->filename,'.'); - if( cp ){ - lemon_sprintf(buf,"%.*s.lt",(int)(cp-lemp->filename),lemp->filename); - }else{ - lemon_sprintf(buf,"%s.lt",lemp->filename); - } - if( access(buf,004)==0 ){ - tpltname = buf; - }else if( access(templatename,004)==0 ){ - tpltname = templatename; - }else{ - tpltname = pathsearch(lemp->argv0,templatename,0); - } - if( tpltname==0 ){ - fprintf(stderr,"Can't find the parser driver template file \"%s\".\n", - templatename); - lemp->errorcnt++; - return 0; - } - in = fopen(tpltname,"rb"); - if( in==0 ){ - fprintf(stderr,"Can't open the template file \"%s\".\n",templatename); - lemp->errorcnt++; - return 0; - } - return in; -} - -/* Print a #line directive line to the output file. */ -PRIVATE void tplt_linedir(FILE *out, int lineno, char *filename) -{ - fprintf(out,"#line %d \"",lineno); - while( *filename ){ - if( *filename == '\\' ) putc('\\',out); - putc(*filename,out); - filename++; - } - fprintf(out,"\"\n"); -} - -/* Print a string to the file and keep the linenumber up to date */ -PRIVATE void tplt_print(FILE *out, struct lemon *lemp, char *str, int *lineno) -{ - if( str==0 ) return; - while( *str ){ - putc(*str,out); - if( *str=='\n' ) (*lineno)++; - str++; - } - if( str[-1]!='\n' ){ - putc('\n',out); - (*lineno)++; - } - if (!lemp->nolinenosflag) { - (*lineno)++; tplt_linedir(out,*lineno,lemp->outname); - } - return; -} - -/* -** The following routine emits code for the destructor for the -** symbol sp -*/ -void emit_destructor_code( - FILE *out, - struct symbol *sp, - struct lemon *lemp, - int *lineno -){ - char *cp = 0; - - if( sp->type==TERMINAL ){ - cp = lemp->tokendest; - if( cp==0 ) return; - fprintf(out,"{\n"); (*lineno)++; - }else if( sp->destructor ){ - cp = sp->destructor; - fprintf(out,"{\n"); (*lineno)++; - if( !lemp->nolinenosflag ){ - (*lineno)++; - tplt_linedir(out,sp->destLineno,lemp->filename); - } - }else if( lemp->vardest ){ - cp = lemp->vardest; - if( cp==0 ) return; - fprintf(out,"{\n"); (*lineno)++; - }else{ - assert( 0 ); /* Cannot happen */ - } - for(; *cp; cp++){ - if( *cp=='$' && cp[1]=='$' ){ - fprintf(out,"(yypminor->yy%d)",sp->dtnum); - cp++; - continue; - } - if( *cp=='\n' ) (*lineno)++; - fputc(*cp,out); - } - fprintf(out,"\n"); (*lineno)++; - if (!lemp->nolinenosflag) { - (*lineno)++; tplt_linedir(out,*lineno,lemp->outname); - } - fprintf(out,"}\n"); (*lineno)++; - return; -} - -/* -** Return TRUE (non-zero) if the given symbol has a destructor. -*/ -int has_destructor(struct symbol *sp, struct lemon *lemp) -{ - int ret; - if( sp->type==TERMINAL ){ - ret = lemp->tokendest!=0; - }else{ - ret = lemp->vardest!=0 || sp->destructor!=0; - } - return ret; -} - -/* -** Append text to a dynamically allocated string. If zText is 0 then -** reset the string to be empty again. Always return the complete text -** of the string (which is overwritten with each call). -** -** n bytes of zText are stored. If n==0 then all of zText up to the first -** \000 terminator is stored. zText can contain up to two instances of -** %d. The values of p1 and p2 are written into the first and second -** %d. -** -** If n==-1, then the previous character is overwritten. -*/ -PRIVATE char *append_str(const char *zText, int n, int p1, int p2){ - static char empty[1] = { 0 }; - static char *z = 0; - static int alloced = 0; - static int used = 0; - int c; - char zInt[40]; - if( zText==0 ){ - if( used==0 && z!=0 ) z[0] = 0; - used = 0; - return z; - } - if( n<=0 ){ - if( n<0 ){ - used += n; - assert( used>=0 ); - } - n = lemonStrlen(zText); - } - if( (int) (n+sizeof(zInt)*2+used) >= alloced ){ - alloced = n + sizeof(zInt)*2 + used + 200; - z = (char *) realloc(z, alloced); - } - if( z==0 ) return empty; - while( n-- > 0 ){ - c = *(zText++); - if( c=='%' && n>0 && zText[0]=='d' ){ - lemon_sprintf(zInt, "%d", p1); - p1 = p2; - lemon_strcpy(&z[used], zInt); - used += lemonStrlen(&z[used]); - zText++; - n--; - }else{ - z[used++] = (char)c; - } - } - z[used] = 0; - return z; -} - -/* -** Write and transform the rp->code string so that symbols are expanded. -** Populate the rp->codePrefix and rp->codeSuffix strings, as appropriate. -** -** Return 1 if the expanded code requires that "yylhsminor" local variable -** to be defined. -*/ -PRIVATE int translate_code(struct lemon *lemp, struct rule *rp){ - char *cp, *xp; - int i; - int rc = 0; /* True if yylhsminor is used */ - int dontUseRhs0 = 0; /* If true, use of left-most RHS label is illegal */ - const char *zSkip = 0; /* The zOvwrt comment within rp->code, or NULL */ - char lhsused = 0; /* True if the LHS element has been used */ - char lhsdirect; /* True if LHS writes directly into stack */ - char used[MAXRHS]; /* True for each RHS element which is used */ - char zLhs[50]; /* Convert the LHS symbol into this string */ - char zOvwrt[900]; /* Comment that to allow LHS to overwrite RHS */ - - for(i=0; inrhs; i++) used[i] = 0; - lhsused = 0; - - if( rp->code==0 ){ - static char newlinestr[2] = { '\n', '\0' }; - rp->code = newlinestr; - rp->line = rp->ruleline; - rp->noCode = 1; - }else{ - rp->noCode = 0; - } - - - if( rp->nrhs==0 ){ - /* If there are no RHS symbols, then writing directly to the LHS is ok */ - lhsdirect = 1; - }else if( rp->rhsalias[0]==0 ){ - /* The left-most RHS symbol has no value. LHS direct is ok. But - ** we have to call the distructor on the RHS symbol first. */ - lhsdirect = 1; - if( has_destructor(rp->rhs[0],lemp) ){ - append_str(0,0,0,0); - append_str(" yy_destructor(yypParser,%d,&yymsp[%d].minor);\n", 0, - rp->rhs[0]->index,1-rp->nrhs); - rp->codePrefix = Strsafe(append_str(0,0,0,0)); - rp->noCode = 0; - } - }else if( rp->lhsalias==0 ){ - /* There is no LHS value symbol. */ - lhsdirect = 1; - }else if( strcmp(rp->lhsalias,rp->rhsalias[0])==0 ){ - /* The LHS symbol and the left-most RHS symbol are the same, so - ** direct writing is allowed */ - lhsdirect = 1; - lhsused = 1; - used[0] = 1; - if( rp->lhs->dtnum!=rp->rhs[0]->dtnum ){ - ErrorMsg(lemp->filename,rp->ruleline, - "%s(%s) and %s(%s) share the same label but have " - "different datatypes.", - rp->lhs->name, rp->lhsalias, rp->rhs[0]->name, rp->rhsalias[0]); - lemp->errorcnt++; - } - }else{ - lemon_sprintf(zOvwrt, "/*%s-overwrites-%s*/", - rp->lhsalias, rp->rhsalias[0]); - zSkip = strstr(rp->code, zOvwrt); - if( zSkip!=0 ){ - /* The code contains a special comment that indicates that it is safe - ** for the LHS label to overwrite left-most RHS label. */ - lhsdirect = 1; - }else{ - lhsdirect = 0; - } - } - if( lhsdirect ){ - sprintf(zLhs, "yymsp[%d].minor.yy%d",1-rp->nrhs,rp->lhs->dtnum); - }else{ - rc = 1; - sprintf(zLhs, "yylhsminor.yy%d",rp->lhs->dtnum); - } - - append_str(0,0,0,0); - - /* This const cast is wrong but harmless, if we're careful. */ - for(cp=(char *)rp->code; *cp; cp++){ - if( cp==zSkip ){ - append_str(zOvwrt,0,0,0); - cp += lemonStrlen(zOvwrt)-1; - dontUseRhs0 = 1; - continue; - } - if( ISALPHA(*cp) && (cp==rp->code || (!ISALNUM(cp[-1]) && cp[-1]!='_')) ){ - char saved; - for(xp= &cp[1]; ISALNUM(*xp) || *xp=='_'; xp++); - saved = *xp; - *xp = 0; - if( rp->lhsalias && strcmp(cp,rp->lhsalias)==0 ){ - append_str(zLhs,0,0,0); - cp = xp; - lhsused = 1; - }else{ - for(i=0; inrhs; i++){ - if( rp->rhsalias[i] && strcmp(cp,rp->rhsalias[i])==0 ){ - if( i==0 && dontUseRhs0 ){ - ErrorMsg(lemp->filename,rp->ruleline, - "Label %s used after '%s'.", - rp->rhsalias[0], zOvwrt); - lemp->errorcnt++; - }else if( cp!=rp->code && cp[-1]=='@' ){ - /* If the argument is of the form @X then substituted - ** the token number of X, not the value of X */ - append_str("yymsp[%d].major",-1,i-rp->nrhs+1,0); - }else{ - struct symbol *sp = rp->rhs[i]; - int dtnum; - if( sp->type==MULTITERMINAL ){ - dtnum = sp->subsym[0]->dtnum; - }else{ - dtnum = sp->dtnum; - } - append_str("yymsp[%d].minor.yy%d",0,i-rp->nrhs+1, dtnum); - } - cp = xp; - used[i] = 1; - break; - } - } - } - *xp = saved; - } - append_str(cp, 1, 0, 0); - } /* End loop */ - - /* Main code generation completed */ - cp = append_str(0,0,0,0); - if( cp && cp[0] ) rp->code = Strsafe(cp); - append_str(0,0,0,0); - - /* Check to make sure the LHS has been used */ - if( rp->lhsalias && !lhsused ){ - ErrorMsg(lemp->filename,rp->ruleline, - "Label \"%s\" for \"%s(%s)\" is never used.", - rp->lhsalias,rp->lhs->name,rp->lhsalias); - lemp->errorcnt++; - } - - /* Generate destructor code for RHS minor values which are not referenced. - ** Generate error messages for unused labels and duplicate labels. - */ - for(i=0; inrhs; i++){ - if( rp->rhsalias[i] ){ - if( i>0 ){ - int j; - if( rp->lhsalias && strcmp(rp->lhsalias,rp->rhsalias[i])==0 ){ - ErrorMsg(lemp->filename,rp->ruleline, - "%s(%s) has the same label as the LHS but is not the left-most " - "symbol on the RHS.", - rp->rhs[i]->name, rp->rhsalias); - lemp->errorcnt++; - } - for(j=0; jrhsalias[j] && strcmp(rp->rhsalias[j],rp->rhsalias[i])==0 ){ - ErrorMsg(lemp->filename,rp->ruleline, - "Label %s used for multiple symbols on the RHS of a rule.", - rp->rhsalias[i]); - lemp->errorcnt++; - break; - } - } - } - if( !used[i] ){ - ErrorMsg(lemp->filename,rp->ruleline, - "Label %s for \"%s(%s)\" is never used.", - rp->rhsalias[i],rp->rhs[i]->name,rp->rhsalias[i]); - lemp->errorcnt++; - } - }else if( i>0 && has_destructor(rp->rhs[i],lemp) ){ - append_str(" yy_destructor(yypParser,%d,&yymsp[%d].minor);\n", 0, - rp->rhs[i]->index,i-rp->nrhs+1); - } - } - - /* If unable to write LHS values directly into the stack, write the - ** saved LHS value now. */ - if( lhsdirect==0 ){ - append_str(" yymsp[%d].minor.yy%d = ", 0, 1-rp->nrhs, rp->lhs->dtnum); - append_str(zLhs, 0, 0, 0); - append_str(";\n", 0, 0, 0); - } - - /* Suffix code generation complete */ - cp = append_str(0,0,0,0); - if( cp && cp[0] ){ - rp->codeSuffix = Strsafe(cp); - rp->noCode = 0; - } - - return rc; -} - -/* -** Generate code which executes when the rule "rp" is reduced. Write -** the code to "out". Make sure lineno stays up-to-date. -*/ -PRIVATE void emit_code( - FILE *out, - struct rule *rp, - struct lemon *lemp, - int *lineno -){ - const char *cp; - - /* Setup code prior to the #line directive */ - if( rp->codePrefix && rp->codePrefix[0] ){ - fprintf(out, "{%s", rp->codePrefix); - for(cp=rp->codePrefix; *cp; cp++){ if( *cp=='\n' ) (*lineno)++; } - } - - /* Generate code to do the reduce action */ - if( rp->code ){ - if( !lemp->nolinenosflag ){ - (*lineno)++; - tplt_linedir(out,rp->line,lemp->filename); - } - fprintf(out,"{%s",rp->code); - for(cp=rp->code; *cp; cp++){ if( *cp=='\n' ) (*lineno)++; } - fprintf(out,"}\n"); (*lineno)++; - if( !lemp->nolinenosflag ){ - (*lineno)++; - tplt_linedir(out,*lineno,lemp->outname); - } - } - - /* Generate breakdown code that occurs after the #line directive */ - if( rp->codeSuffix && rp->codeSuffix[0] ){ - fprintf(out, "%s", rp->codeSuffix); - for(cp=rp->codeSuffix; *cp; cp++){ if( *cp=='\n' ) (*lineno)++; } - } - - if( rp->codePrefix ){ - fprintf(out, "}\n"); (*lineno)++; - } - - return; -} - -/* -** Print the definition of the union used for the parser's data stack. -** This union contains fields for every possible data type for tokens -** and nonterminals. In the process of computing and printing this -** union, also set the ".dtnum" field of every terminal and nonterminal -** symbol. -*/ -void print_stack_union( - FILE *out, /* The output stream */ - struct lemon *lemp, /* The main info structure for this parser */ - int *plineno, /* Pointer to the line number */ - int mhflag /* True if generating makeheaders output */ -){ - int lineno = *plineno; /* The line number of the output */ - char **types; /* A hash table of datatypes */ - int arraysize; /* Size of the "types" array */ - int maxdtlength; /* Maximum length of any ".datatype" field. */ - char *stddt; /* Standardized name for a datatype */ - int i,j; /* Loop counters */ - unsigned hash; /* For hashing the name of a type */ - const char *name; /* Name of the parser */ - - /* Allocate and initialize types[] and allocate stddt[] */ - arraysize = lemp->nsymbol * 2; - types = (char**)calloc( arraysize, sizeof(char*) ); - if( types==0 ){ - fprintf(stderr,"Out of memory.\n"); - exit(1); - } - for(i=0; ivartype ){ - maxdtlength = lemonStrlen(lemp->vartype); - } - for(i=0; insymbol; i++){ - int len; - struct symbol *sp = lemp->symbols[i]; - if( sp->datatype==0 ) continue; - len = lemonStrlen(sp->datatype); - if( len>maxdtlength ) maxdtlength = len; - } - stddt = (char*)malloc( maxdtlength*2 + 1 ); - if( stddt==0 ){ - fprintf(stderr,"Out of memory.\n"); - exit(1); - } - - /* Build a hash table of datatypes. The ".dtnum" field of each symbol - ** is filled in with the hash index plus 1. A ".dtnum" value of 0 is - ** used for terminal symbols. If there is no %default_type defined then - ** 0 is also used as the .dtnum value for nonterminals which do not specify - ** a datatype using the %type directive. - */ - for(i=0; insymbol; i++){ - struct symbol *sp = lemp->symbols[i]; - char *cp; - if( sp==lemp->errsym ){ - sp->dtnum = arraysize+1; - continue; - } - if( sp->type!=NONTERMINAL || (sp->datatype==0 && lemp->vartype==0) ){ - sp->dtnum = 0; - continue; - } - cp = sp->datatype; - if( cp==0 ) cp = lemp->vartype; - j = 0; - while( ISSPACE(*cp) ) cp++; - while( *cp ) stddt[j++] = *cp++; - while( j>0 && ISSPACE(stddt[j-1]) ) j--; - stddt[j] = 0; - if( lemp->tokentype && strcmp(stddt, lemp->tokentype)==0 ){ - sp->dtnum = 0; - continue; - } - hash = 0; - for(j=0; stddt[j]; j++){ - hash = hash*53 + stddt[j]; - } - hash = (hash & 0x7fffffff)%arraysize; - while( types[hash] ){ - if( strcmp(types[hash],stddt)==0 ){ - sp->dtnum = hash + 1; - break; - } - hash++; - if( hash>=(unsigned)arraysize ) hash = 0; - } - if( types[hash]==0 ){ - sp->dtnum = hash + 1; - types[hash] = (char*)malloc( lemonStrlen(stddt)+1 ); - if( types[hash]==0 ){ - fprintf(stderr,"Out of memory.\n"); - exit(1); - } - lemon_strcpy(types[hash],stddt); - } - } - - /* Print out the definition of YYTOKENTYPE and YYMINORTYPE */ - name = lemp->name ? lemp->name : "Parse"; - lineno = *plineno; - if( mhflag ){ fprintf(out,"#if INTERFACE\n"); lineno++; } - fprintf(out,"#define %sTOKENTYPE %s\n",name, - lemp->tokentype?lemp->tokentype:"void*"); lineno++; - if( mhflag ){ fprintf(out,"#endif\n"); lineno++; } - fprintf(out,"typedef union {\n"); lineno++; - fprintf(out," int yyinit;\n"); lineno++; - fprintf(out," %sTOKENTYPE yy0;\n",name); lineno++; - for(i=0; ierrsym->useCnt ){ - fprintf(out," int yy%d;\n",lemp->errsym->dtnum); lineno++; - } - free(stddt); - free(types); - fprintf(out,"} YYMINORTYPE;\n"); lineno++; - *plineno = lineno; -} - -/* -** Return the name of a C datatype able to represent values between -** lwr and upr, inclusive. If pnByte!=NULL then also write the sizeof -** for that type (1, 2, or 4) into *pnByte. -*/ -static const char *minimum_size_type(int lwr, int upr, int *pnByte){ - const char *zType = "int"; - int nByte = 4; - if( lwr>=0 ){ - if( upr<=255 ){ - zType = "unsigned char"; - nByte = 1; - }else if( upr<65535 ){ - zType = "unsigned short int"; - nByte = 2; - }else{ - zType = "unsigned int"; - nByte = 4; - } - }else if( lwr>=-127 && upr<=127 ){ - zType = "signed char"; - nByte = 1; - }else if( lwr>=-32767 && upr<32767 ){ - zType = "short"; - nByte = 2; - } - if( pnByte ) *pnByte = nByte; - return zType; -} - -/* -** Each state contains a set of token transaction and a set of -** nonterminal transactions. Each of these sets makes an instance -** of the following structure. An array of these structures is used -** to order the creation of entries in the yy_action[] table. -*/ -struct axset { - struct state *stp; /* A pointer to a state */ - int isTkn; /* True to use tokens. False for non-terminals */ - int nAction; /* Number of actions */ - int iOrder; /* Original order of action sets */ -}; - -/* -** Compare to axset structures for sorting purposes -*/ -static int axset_compare(const void *a, const void *b){ - struct axset *p1 = (struct axset*)a; - struct axset *p2 = (struct axset*)b; - int c; - c = p2->nAction - p1->nAction; - if( c==0 ){ - c = p1->iOrder - p2->iOrder; - } - assert( c!=0 || p1==p2 ); - return c; -} - -/* -** Write text on "out" that describes the rule "rp". -*/ -static void writeRuleText(FILE *out, struct rule *rp){ - int j; - fprintf(out,"%s ::=", rp->lhs->name); - for(j=0; jnrhs; j++){ - struct symbol *sp = rp->rhs[j]; - if( sp->type!=MULTITERMINAL ){ - fprintf(out," %s", sp->name); - }else{ - int k; - fprintf(out," %s", sp->subsym[0]->name); - for(k=1; knsubsym; k++){ - fprintf(out,"|%s",sp->subsym[k]->name); - } - } - } -} - - -/* Generate C source code for the parser */ -void ReportTable( - struct lemon *lemp, - int mhflag /* Output in makeheaders format if true */ -){ - FILE *out, *in; - char line[LINESIZE]; - int lineno; - struct state *stp; - struct action *ap; - struct rule *rp; - struct acttab *pActtab; - int i, j, n, sz; - int szActionType; /* sizeof(YYACTIONTYPE) */ - int szCodeType; /* sizeof(YYCODETYPE) */ - const char *name; - int mnTknOfst, mxTknOfst; - int mnNtOfst, mxNtOfst; - struct axset *ax; - - in = tplt_open(lemp); - if( in==0 ) return; - out = file_open(lemp,".c","wb"); - if( out==0 ){ - fclose(in); - return; - } - lineno = 1; - tplt_xfer(lemp->name,in,out,&lineno); - - /* Generate the include code, if any */ - tplt_print(out,lemp,lemp->include,&lineno); - if( mhflag ){ - char *incName = file_makename(lemp, ".h"); - fprintf(out,"#include \"%s\"\n", incName); lineno++; - free(incName); - } - tplt_xfer(lemp->name,in,out,&lineno); - - /* Generate #defines for all tokens */ - if( mhflag ){ - const char *prefix; - fprintf(out,"#if INTERFACE\n"); lineno++; - if( lemp->tokenprefix ) prefix = lemp->tokenprefix; - else prefix = ""; - for(i=1; interminal; i++){ - fprintf(out,"#define %s%-30s %2d\n",prefix,lemp->symbols[i]->name,i); - lineno++; - } - fprintf(out,"#endif\n"); lineno++; - } - tplt_xfer(lemp->name,in,out,&lineno); - - /* Generate the defines */ - fprintf(out,"#define YYCODETYPE %s\n", - minimum_size_type(0, lemp->nsymbol+1, &szCodeType)); lineno++; - fprintf(out,"#define YYNOCODE %d\n",lemp->nsymbol+1); lineno++; - fprintf(out,"#define YYACTIONTYPE %s\n", - minimum_size_type(0,lemp->nstate+lemp->nrule*2+5,&szActionType)); lineno++; - if( lemp->wildcard ){ - fprintf(out,"#define YYWILDCARD %d\n", - lemp->wildcard->index); lineno++; - } - print_stack_union(out,lemp,&lineno,mhflag); - fprintf(out, "#ifndef YYSTACKDEPTH\n"); lineno++; - if( lemp->stacksize ){ - fprintf(out,"#define YYSTACKDEPTH %s\n",lemp->stacksize); lineno++; - }else{ - fprintf(out,"#define YYSTACKDEPTH 100\n"); lineno++; - } - fprintf(out, "#endif\n"); lineno++; - if( mhflag ){ - fprintf(out,"#if INTERFACE\n"); lineno++; - } - name = lemp->name ? lemp->name : "Parse"; - if( lemp->arg && lemp->arg[0] ){ - i = lemonStrlen(lemp->arg); - while( i>=1 && ISSPACE(lemp->arg[i-1]) ) i--; - while( i>=1 && (ISALNUM(lemp->arg[i-1]) || lemp->arg[i-1]=='_') ) i--; - fprintf(out,"#define %sARG_SDECL %s;\n",name,lemp->arg); lineno++; - fprintf(out,"#define %sARG_PDECL ,%s\n",name,lemp->arg); lineno++; - fprintf(out,"#define %sARG_FETCH %s = yypParser->%s\n", - name,lemp->arg,&lemp->arg[i]); lineno++; - fprintf(out,"#define %sARG_STORE yypParser->%s = %s\n", - name,&lemp->arg[i],&lemp->arg[i]); lineno++; - }else{ - fprintf(out,"#define %sARG_SDECL\n",name); lineno++; - fprintf(out,"#define %sARG_PDECL\n",name); lineno++; - fprintf(out,"#define %sARG_FETCH\n",name); lineno++; - fprintf(out,"#define %sARG_STORE\n",name); lineno++; - } - if( mhflag ){ - fprintf(out,"#endif\n"); lineno++; - } - if( lemp->errsym->useCnt ){ - fprintf(out,"#define YYERRORSYMBOL %d\n",lemp->errsym->index); lineno++; - fprintf(out,"#define YYERRSYMDT yy%d\n",lemp->errsym->dtnum); lineno++; - } - if( lemp->has_fallback ){ - fprintf(out,"#define YYFALLBACK 1\n"); lineno++; - } - - /* Compute the action table, but do not output it yet. The action - ** table must be computed before generating the YYNSTATE macro because - ** we need to know how many states can be eliminated. - */ - ax = (struct axset *) calloc(lemp->nxstate*2, sizeof(ax[0])); - if( ax==0 ){ - fprintf(stderr,"malloc failed\n"); - exit(1); - } - for(i=0; inxstate; i++){ - stp = lemp->sorted[i]; - ax[i*2].stp = stp; - ax[i*2].isTkn = 1; - ax[i*2].nAction = stp->nTknAct; - ax[i*2+1].stp = stp; - ax[i*2+1].isTkn = 0; - ax[i*2+1].nAction = stp->nNtAct; - } - mxTknOfst = mnTknOfst = 0; - mxNtOfst = mnNtOfst = 0; - /* In an effort to minimize the action table size, use the heuristic - ** of placing the largest action sets first */ - for(i=0; inxstate*2; i++) ax[i].iOrder = i; - qsort(ax, lemp->nxstate*2, sizeof(ax[0]), axset_compare); - pActtab = acttab_alloc(); - for(i=0; inxstate*2 && ax[i].nAction>0; i++){ - stp = ax[i].stp; - if( ax[i].isTkn ){ - for(ap=stp->ap; ap; ap=ap->next){ - int action; - if( ap->sp->index>=lemp->nterminal ) continue; - action = compute_action(lemp, ap); - if( action<0 ) continue; - acttab_action(pActtab, ap->sp->index, action); - } - stp->iTknOfst = acttab_insert(pActtab); - if( stp->iTknOfstiTknOfst; - if( stp->iTknOfst>mxTknOfst ) mxTknOfst = stp->iTknOfst; - }else{ - for(ap=stp->ap; ap; ap=ap->next){ - int action; - if( ap->sp->indexnterminal ) continue; - if( ap->sp->index==lemp->nsymbol ) continue; - action = compute_action(lemp, ap); - if( action<0 ) continue; - acttab_action(pActtab, ap->sp->index, action); - } - stp->iNtOfst = acttab_insert(pActtab); - if( stp->iNtOfstiNtOfst; - if( stp->iNtOfst>mxNtOfst ) mxNtOfst = stp->iNtOfst; - } -#if 0 /* Uncomment for a trace of how the yy_action[] table fills out */ - { int jj, nn; - for(jj=nn=0; jjnAction; jj++){ - if( pActtab->aAction[jj].action<0 ) nn++; - } - printf("%4d: State %3d %s n: %2d size: %5d freespace: %d\n", - i, stp->statenum, ax[i].isTkn ? "Token" : "Var ", - ax[i].nAction, pActtab->nAction, nn); - } -#endif - } - free(ax); - - /* Mark rules that are actually used for reduce actions after all - ** optimizations have been applied - */ - for(rp=lemp->rule; rp; rp=rp->next) rp->doesReduce = LEMON_FALSE; - for(i=0; inxstate; i++){ - for(ap=lemp->sorted[i]->ap; ap; ap=ap->next){ - if( ap->type==REDUCE || ap->type==SHIFTREDUCE ){ - ap->x.rp->doesReduce = 1; - } - } - } - - /* Finish rendering the constants now that the action table has - ** been computed */ - fprintf(out,"#define YYNSTATE %d\n",lemp->nxstate); lineno++; - fprintf(out,"#define YYNRULE %d\n",lemp->nrule); lineno++; - fprintf(out,"#define YY_MAX_SHIFT %d\n",lemp->nxstate-1); lineno++; - fprintf(out,"#define YY_MIN_SHIFTREDUCE %d\n",lemp->nstate); lineno++; - i = lemp->nstate + lemp->nrule; - fprintf(out,"#define YY_MAX_SHIFTREDUCE %d\n", i-1); lineno++; - fprintf(out,"#define YY_MIN_REDUCE %d\n", i); lineno++; - i = lemp->nstate + lemp->nrule*2; - fprintf(out,"#define YY_MAX_REDUCE %d\n", i-1); lineno++; - fprintf(out,"#define YY_ERROR_ACTION %d\n", i); lineno++; - fprintf(out,"#define YY_ACCEPT_ACTION %d\n", i+1); lineno++; - fprintf(out,"#define YY_NO_ACTION %d\n", i+2); lineno++; - tplt_xfer(lemp->name,in,out,&lineno); - - /* Now output the action table and its associates: - ** - ** yy_action[] A single table containing all actions. - ** yy_lookahead[] A table containing the lookahead for each entry in - ** yy_action. Used to detect hash collisions. - ** yy_shift_ofst[] For each state, the offset into yy_action for - ** shifting terminals. - ** yy_reduce_ofst[] For each state, the offset into yy_action for - ** shifting non-terminals after a reduce. - ** yy_default[] Default action for each state. - */ - - /* Output the yy_action table */ - lemp->nactiontab = n = acttab_size(pActtab); - lemp->tablesize += n*szActionType; - fprintf(out,"#define YY_ACTTAB_COUNT (%d)\n", n); lineno++; - fprintf(out,"static const YYACTIONTYPE yy_action[] = {\n"); lineno++; - for(i=j=0; instate + lemp->nrule + 2; - if( j==0 ) fprintf(out," /* %5d */ ", i); - fprintf(out, " %4d,", action); - if( j==9 || i==n-1 ){ - fprintf(out, "\n"); lineno++; - j = 0; - }else{ - j++; - } - } - fprintf(out, "};\n"); lineno++; - - /* Output the yy_lookahead table */ - lemp->tablesize += n*szCodeType; - fprintf(out,"static const YYCODETYPE yy_lookahead[] = {\n"); lineno++; - for(i=j=0; insymbol; - if( j==0 ) fprintf(out," /* %5d */ ", i); - fprintf(out, " %4d,", la); - if( j==9 || i==n-1 ){ - fprintf(out, "\n"); lineno++; - j = 0; - }else{ - j++; - } - } - fprintf(out, "};\n"); lineno++; - - /* Output the yy_shift_ofst[] table */ - n = lemp->nxstate; - while( n>0 && lemp->sorted[n-1]->iTknOfst==NO_OFFSET ) n--; - fprintf(out, "#define YY_SHIFT_USE_DFLT (%d)\n", lemp->nactiontab); lineno++; - fprintf(out, "#define YY_SHIFT_COUNT (%d)\n", n-1); lineno++; - fprintf(out, "#define YY_SHIFT_MIN (%d)\n", mnTknOfst); lineno++; - fprintf(out, "#define YY_SHIFT_MAX (%d)\n", mxTknOfst); lineno++; - fprintf(out, "static const %s yy_shift_ofst[] = {\n", - minimum_size_type(mnTknOfst, lemp->nterminal+lemp->nactiontab, &sz)); - lineno++; - lemp->tablesize += n*sz; - for(i=j=0; isorted[i]; - ofst = stp->iTknOfst; - if( ofst==NO_OFFSET ) ofst = lemp->nactiontab; - if( j==0 ) fprintf(out," /* %5d */ ", i); - fprintf(out, " %4d,", ofst); - if( j==9 || i==n-1 ){ - fprintf(out, "\n"); lineno++; - j = 0; - }else{ - j++; - } - } - fprintf(out, "};\n"); lineno++; - - /* Output the yy_reduce_ofst[] table */ - fprintf(out, "#define YY_REDUCE_USE_DFLT (%d)\n", mnNtOfst-1); lineno++; - n = lemp->nxstate; - while( n>0 && lemp->sorted[n-1]->iNtOfst==NO_OFFSET ) n--; - fprintf(out, "#define YY_REDUCE_COUNT (%d)\n", n-1); lineno++; - fprintf(out, "#define YY_REDUCE_MIN (%d)\n", mnNtOfst); lineno++; - fprintf(out, "#define YY_REDUCE_MAX (%d)\n", mxNtOfst); lineno++; - fprintf(out, "static const %s yy_reduce_ofst[] = {\n", - minimum_size_type(mnNtOfst-1, mxNtOfst, &sz)); lineno++; - lemp->tablesize += n*sz; - for(i=j=0; isorted[i]; - ofst = stp->iNtOfst; - if( ofst==NO_OFFSET ) ofst = mnNtOfst - 1; - if( j==0 ) fprintf(out," /* %5d */ ", i); - fprintf(out, " %4d,", ofst); - if( j==9 || i==n-1 ){ - fprintf(out, "\n"); lineno++; - j = 0; - }else{ - j++; - } - } - fprintf(out, "};\n"); lineno++; - - /* Output the default action table */ - fprintf(out, "static const YYACTIONTYPE yy_default[] = {\n"); lineno++; - n = lemp->nxstate; - lemp->tablesize += n*szActionType; - for(i=j=0; isorted[i]; - if( j==0 ) fprintf(out," /* %5d */ ", i); - fprintf(out, " %4d,", stp->iDfltReduce+lemp->nstate+lemp->nrule); - if( j==9 || i==n-1 ){ - fprintf(out, "\n"); lineno++; - j = 0; - }else{ - j++; - } - } - fprintf(out, "};\n"); lineno++; - tplt_xfer(lemp->name,in,out,&lineno); - - /* Generate the table of fallback tokens. - */ - if( lemp->has_fallback ){ - int mx = lemp->nterminal - 1; - while( mx>0 && lemp->symbols[mx]->fallback==0 ){ mx--; } - lemp->tablesize += (mx+1)*szCodeType; - for(i=0; i<=mx; i++){ - struct symbol *p = lemp->symbols[i]; - if( p->fallback==0 ){ - fprintf(out, " 0, /* %10s => nothing */\n", p->name); - }else{ - fprintf(out, " %3d, /* %10s => %s */\n", p->fallback->index, - p->name, p->fallback->name); - } - lineno++; - } - } - tplt_xfer(lemp->name, in, out, &lineno); - - /* Generate a table containing the symbolic name of every symbol - */ - for(i=0; insymbol; i++){ - lemon_sprintf(line,"\"%s\",",lemp->symbols[i]->name); - fprintf(out," %-15s",line); - if( (i&3)==3 ){ fprintf(out,"\n"); lineno++; } - } - if( (i&3)!=0 ){ fprintf(out,"\n"); lineno++; } - tplt_xfer(lemp->name,in,out,&lineno); - - /* Generate a table containing a text string that describes every - ** rule in the rule set of the grammar. This information is used - ** when tracing REDUCE actions. - */ - for(i=0, rp=lemp->rule; rp; rp=rp->next, i++){ - assert( rp->iRule==i ); - fprintf(out," /* %3d */ \"", i); - writeRuleText(out, rp); - fprintf(out,"\",\n"); lineno++; - } - tplt_xfer(lemp->name,in,out,&lineno); - - /* Generate code which executes every time a symbol is popped from - ** the stack while processing errors or while destroying the parser. - ** (In other words, generate the %destructor actions) - */ - if( lemp->tokendest ){ - int once = 1; - for(i=0; insymbol; i++){ - struct symbol *sp = lemp->symbols[i]; - if( sp==0 || sp->type!=TERMINAL ) continue; - if( once ){ - fprintf(out, " /* TERMINAL Destructor */\n"); lineno++; - once = 0; - } - fprintf(out," case %d: /* %s */\n", sp->index, sp->name); lineno++; - } - for(i=0; insymbol && lemp->symbols[i]->type!=TERMINAL; i++); - if( insymbol ){ - emit_destructor_code(out,lemp->symbols[i],lemp,&lineno); - fprintf(out," break;\n"); lineno++; - } - } - if( lemp->vardest ){ - struct symbol *dflt_sp = 0; - int once = 1; - for(i=0; insymbol; i++){ - struct symbol *sp = lemp->symbols[i]; - if( sp==0 || sp->type==TERMINAL || - sp->index<=0 || sp->destructor!=0 ) continue; - if( once ){ - fprintf(out, " /* Default NON-TERMINAL Destructor */\n"); lineno++; - once = 0; - } - fprintf(out," case %d: /* %s */\n", sp->index, sp->name); lineno++; - dflt_sp = sp; - } - if( dflt_sp!=0 ){ - emit_destructor_code(out,dflt_sp,lemp,&lineno); - } - fprintf(out," break;\n"); lineno++; - } - for(i=0; insymbol; i++){ - struct symbol *sp = lemp->symbols[i]; - if( sp==0 || sp->type==TERMINAL || sp->destructor==0 ) continue; - if( sp->destLineno<0 ) continue; /* Already emitted */ - fprintf(out," case %d: /* %s */\n", sp->index, sp->name); lineno++; - - /* Combine duplicate destructors into a single case */ - for(j=i+1; jnsymbol; j++){ - struct symbol *sp2 = lemp->symbols[j]; - if( sp2 && sp2->type!=TERMINAL && sp2->destructor - && sp2->dtnum==sp->dtnum - && strcmp(sp->destructor,sp2->destructor)==0 ){ - fprintf(out," case %d: /* %s */\n", - sp2->index, sp2->name); lineno++; - sp2->destLineno = -1; /* Avoid emitting this destructor again */ - } - } - - emit_destructor_code(out,lemp->symbols[i],lemp,&lineno); - fprintf(out," break;\n"); lineno++; - } - tplt_xfer(lemp->name,in,out,&lineno); - - /* Generate code which executes whenever the parser stack overflows */ - tplt_print(out,lemp,lemp->overflow,&lineno); - tplt_xfer(lemp->name,in,out,&lineno); - - /* Generate the table of rule information - ** - ** Note: This code depends on the fact that rules are number - ** sequentually beginning with 0. - */ - for(rp=lemp->rule; rp; rp=rp->next){ - fprintf(out," { %d, %d },\n",rp->lhs->index,-rp->nrhs); lineno++; - } - tplt_xfer(lemp->name,in,out,&lineno); - - /* Generate code which execution during each REDUCE action */ - i = 0; - for(rp=lemp->rule; rp; rp=rp->next){ - i += translate_code(lemp, rp); - } - if( i ){ - fprintf(out," YYMINORTYPE yylhsminor;\n"); lineno++; - } - /* First output rules other than the default: rule */ - for(rp=lemp->rule; rp; rp=rp->next){ - struct rule *rp2; /* Other rules with the same action */ - if( rp->codeEmitted ) continue; - if( rp->noCode ){ - /* No C code actions, so this will be part of the "default:" rule */ - continue; - } - fprintf(out," case %d: /* ", rp->iRule); - writeRuleText(out, rp); - fprintf(out, " */\n"); lineno++; - for(rp2=rp->next; rp2; rp2=rp2->next){ - if( rp2->code==rp->code && rp2->codePrefix==rp->codePrefix - && rp2->codeSuffix==rp->codeSuffix ){ - fprintf(out," case %d: /* ", rp2->iRule); - writeRuleText(out, rp2); - fprintf(out," */ yytestcase(yyruleno==%d);\n", rp2->iRule); lineno++; - rp2->codeEmitted = 1; - } - } - emit_code(out,rp,lemp,&lineno); - fprintf(out," break;\n"); lineno++; - rp->codeEmitted = 1; - } - /* Finally, output the default: rule. We choose as the default: all - ** empty actions. */ - fprintf(out," default:\n"); lineno++; - for(rp=lemp->rule; rp; rp=rp->next){ - if( rp->codeEmitted ) continue; - assert( rp->noCode ); - fprintf(out," /* (%d) ", rp->iRule); - writeRuleText(out, rp); - if( rp->doesReduce ){ - fprintf(out, " */ yytestcase(yyruleno==%d);\n", rp->iRule); lineno++; - }else{ - fprintf(out, " (OPTIMIZED OUT) */ assert(yyruleno!=%d);\n", - rp->iRule); lineno++; - } - } - fprintf(out," break;\n"); lineno++; - tplt_xfer(lemp->name,in,out,&lineno); - - /* Generate code which executes if a parse fails */ - tplt_print(out,lemp,lemp->failure,&lineno); - tplt_xfer(lemp->name,in,out,&lineno); - - /* Generate code which executes when a syntax error occurs */ - tplt_print(out,lemp,lemp->error,&lineno); - tplt_xfer(lemp->name,in,out,&lineno); - - /* Generate code which executes when the parser accepts its input */ - tplt_print(out,lemp,lemp->accept,&lineno); - tplt_xfer(lemp->name,in,out,&lineno); - - /* Append any addition code the user desires */ - tplt_print(out,lemp,lemp->extracode,&lineno); - - fclose(in); - fclose(out); - return; -} - -/* Generate a header file for the parser */ -void ReportHeader(struct lemon *lemp) -{ - FILE *out, *in; - const char *prefix; - char line[LINESIZE]; - char pattern[LINESIZE]; - int i; - - if( lemp->tokenprefix ) prefix = lemp->tokenprefix; - else prefix = ""; - in = file_open(lemp,".h","rb"); - if( in ){ - int nextChar; - for(i=1; interminal && fgets(line,LINESIZE,in); i++){ - lemon_sprintf(pattern,"#define %s%-30s %3d\n", - prefix,lemp->symbols[i]->name,i); - if( strcmp(line,pattern) ) break; - } - nextChar = fgetc(in); - fclose(in); - if( i==lemp->nterminal && nextChar==EOF ){ - /* No change in the file. Don't rewrite it. */ - return; - } - } - out = file_open(lemp,".h","wb"); - if( out ){ - for(i=1; interminal; i++){ - fprintf(out,"#define %s%-30s %3d\n",prefix,lemp->symbols[i]->name,i); - } - fclose(out); - } - return; -} - -/* Reduce the size of the action tables, if possible, by making use -** of defaults. -** -** In this version, we take the most frequent REDUCE action and make -** it the default. Except, there is no default if the wildcard token -** is a possible look-ahead. -*/ -void CompressTables(struct lemon *lemp) -{ - struct state *stp; - struct action *ap, *ap2, *nextap; - struct rule *rp, *rp2, *rbest; - int nbest, n; - int i; - int usesWildcard; - - for(i=0; instate; i++){ - stp = lemp->sorted[i]; - nbest = 0; - rbest = 0; - usesWildcard = 0; - - for(ap=stp->ap; ap; ap=ap->next){ - if( ap->type==SHIFT && ap->sp==lemp->wildcard ){ - usesWildcard = 1; - } - if( ap->type!=REDUCE ) continue; - rp = ap->x.rp; - if( rp->lhsStart ) continue; - if( rp==rbest ) continue; - n = 1; - for(ap2=ap->next; ap2; ap2=ap2->next){ - if( ap2->type!=REDUCE ) continue; - rp2 = ap2->x.rp; - if( rp2==rbest ) continue; - if( rp2==rp ) n++; - } - if( n>nbest ){ - nbest = n; - rbest = rp; - } - } - - /* Do not make a default if the number of rules to default - ** is not at least 1 or if the wildcard token is a possible - ** lookahead. - */ - if( nbest<1 || usesWildcard ) continue; - - - /* Combine matching REDUCE actions into a single default */ - for(ap=stp->ap; ap; ap=ap->next){ - if( ap->type==REDUCE && ap->x.rp==rbest ) break; - } - assert( ap ); - ap->sp = Symbol_new("{default}"); - for(ap=ap->next; ap; ap=ap->next){ - if( ap->type==REDUCE && ap->x.rp==rbest ) ap->type = NOT_USED; - } - stp->ap = Action_sort(stp->ap); - - for(ap=stp->ap; ap; ap=ap->next){ - if( ap->type==SHIFT ) break; - if( ap->type==REDUCE && ap->x.rp!=rbest ) break; - } - if( ap==0 ){ - stp->autoReduce = 1; - stp->pDfltReduce = rbest; - } - } - - /* Make a second pass over all states and actions. Convert - ** every action that is a SHIFT to an autoReduce state into - ** a SHIFTREDUCE action. - */ - for(i=0; instate; i++){ - stp = lemp->sorted[i]; - for(ap=stp->ap; ap; ap=ap->next){ - struct state *pNextState; - if( ap->type!=SHIFT ) continue; - pNextState = ap->x.stp; - if( pNextState->autoReduce && pNextState->pDfltReduce!=0 ){ - ap->type = SHIFTREDUCE; - ap->x.rp = pNextState->pDfltReduce; - } - } - } - - /* If a SHIFTREDUCE action specifies a rule that has a single RHS term - ** (meaning that the SHIFTREDUCE will land back in the state where it - ** started) and if there is no C-code associated with the reduce action, - ** then we can go ahead and convert the action to be the same as the - ** action for the RHS of the rule. - */ - for(i=0; instate; i++){ - stp = lemp->sorted[i]; - for(ap=stp->ap; ap; ap=nextap){ - nextap = ap->next; - if( ap->type!=SHIFTREDUCE ) continue; - rp = ap->x.rp; - if( rp->noCode==0 ) continue; - if( rp->nrhs!=1 ) continue; -#if 1 - /* Only apply this optimization to non-terminals. It would be OK to - ** apply it to terminal symbols too, but that makes the parser tables - ** larger. */ - if( ap->sp->indexnterminal ) continue; -#endif - /* If we reach this point, it means the optimization can be applied */ - nextap = ap; - for(ap2=stp->ap; ap2 && (ap2==ap || ap2->sp!=rp->lhs); ap2=ap2->next){} - assert( ap2!=0 ); - ap->spOpt = ap2->sp; - ap->type = ap2->type; - ap->x = ap2->x; - } - } -} - - -/* -** Compare two states for sorting purposes. The smaller state is the -** one with the most non-terminal actions. If they have the same number -** of non-terminal actions, then the smaller is the one with the most -** token actions. -*/ -static int stateResortCompare(const void *a, const void *b){ - const struct state *pA = *(const struct state**)a; - const struct state *pB = *(const struct state**)b; - int n; - - n = pB->nNtAct - pA->nNtAct; - if( n==0 ){ - n = pB->nTknAct - pA->nTknAct; - if( n==0 ){ - n = pB->statenum - pA->statenum; - } - } - assert( n!=0 ); - return n; -} - - -/* -** Renumber and resort states so that states with fewer choices -** occur at the end. Except, keep state 0 as the first state. -*/ -void ResortStates(struct lemon *lemp) -{ - int i; - struct state *stp; - struct action *ap; - - for(i=0; instate; i++){ - stp = lemp->sorted[i]; - stp->nTknAct = stp->nNtAct = 0; - stp->iDfltReduce = lemp->nrule; /* Init dflt action to "syntax error" */ - stp->iTknOfst = NO_OFFSET; - stp->iNtOfst = NO_OFFSET; - for(ap=stp->ap; ap; ap=ap->next){ - int iAction = compute_action(lemp,ap); - if( iAction>=0 ){ - if( ap->sp->indexnterminal ){ - stp->nTknAct++; - }else if( ap->sp->indexnsymbol ){ - stp->nNtAct++; - }else{ - assert( stp->autoReduce==0 || stp->pDfltReduce==ap->x.rp ); - stp->iDfltReduce = iAction - lemp->nstate - lemp->nrule; - } - } - } - } - qsort(&lemp->sorted[1], lemp->nstate-1, sizeof(lemp->sorted[0]), - stateResortCompare); - for(i=0; instate; i++){ - lemp->sorted[i]->statenum = i; - } - lemp->nxstate = lemp->nstate; - while( lemp->nxstate>1 && lemp->sorted[lemp->nxstate-1]->autoReduce ){ - lemp->nxstate--; - } -} - - -/***************** From the file "set.c" ************************************/ -/* -** Set manipulation routines for the LEMON parser generator. -*/ - -static int size = 0; - -/* Set the set size */ -void SetSize(int n) -{ - size = n+1; -} - -/* Allocate a new set */ -char *SetNew(void){ - char *s; - s = (char*)calloc( size, 1); - if( s==0 ){ - extern void memory_error(); - memory_error(); - } - return s; -} - -/* Deallocate a set */ -void SetFree(char *s) -{ - free(s); -} - -/* Add a new element to the set. Return TRUE if the element was added -** and FALSE if it was already there. */ -int SetAdd(char *s, int e) -{ - int rv; - assert( e>=0 && esize = 1024; - x1a->count = 0; - x1a->tbl = (x1node*)calloc(1024, sizeof(x1node) + sizeof(x1node*)); - if( x1a->tbl==0 ){ - free(x1a); - x1a = 0; - }else{ - int i; - x1a->ht = (x1node**)&(x1a->tbl[1024]); - for(i=0; i<1024; i++) x1a->ht[i] = 0; - } - } -} -/* Insert a new record into the array. Return TRUE if successful. -** Prior data with the same key is NOT overwritten */ -int Strsafe_insert(const char *data) -{ - x1node *np; - unsigned h; - unsigned ph; - - if( x1a==0 ) return 0; - ph = strhash(data); - h = ph & (x1a->size-1); - np = x1a->ht[h]; - while( np ){ - if( strcmp(np->data,data)==0 ){ - /* An existing entry with the same key is found. */ - /* Fail because overwrite is not allows. */ - return 0; - } - np = np->next; - } - if( x1a->count>=x1a->size ){ - /* Need to make the hash table bigger */ - int i,arrSize; - struct s_x1 array; - array.size = arrSize = x1a->size*2; - array.count = x1a->count; - array.tbl = (x1node*)calloc(arrSize, sizeof(x1node) + sizeof(x1node*)); - if( array.tbl==0 ) return 0; /* Fail due to malloc failure */ - array.ht = (x1node**)&(array.tbl[arrSize]); - for(i=0; icount; i++){ - x1node *oldnp, *newnp; - oldnp = &(x1a->tbl[i]); - h = strhash(oldnp->data) & (arrSize-1); - newnp = &(array.tbl[i]); - if( array.ht[h] ) array.ht[h]->from = &(newnp->next); - newnp->next = array.ht[h]; - newnp->data = oldnp->data; - newnp->from = &(array.ht[h]); - array.ht[h] = newnp; - } - free(x1a->tbl); - *x1a = array; - } - /* Insert the new data */ - h = ph & (x1a->size-1); - np = &(x1a->tbl[x1a->count++]); - np->data = data; - if( x1a->ht[h] ) x1a->ht[h]->from = &(np->next); - np->next = x1a->ht[h]; - x1a->ht[h] = np; - np->from = &(x1a->ht[h]); - return 1; -} - -/* Return a pointer to data assigned to the given key. Return NULL -** if no such key. */ -const char *Strsafe_find(const char *key) -{ - unsigned h; - x1node *np; - - if( x1a==0 ) return 0; - h = strhash(key) & (x1a->size-1); - np = x1a->ht[h]; - while( np ){ - if( strcmp(np->data,key)==0 ) break; - np = np->next; - } - return np ? np->data : 0; -} - -/* Return a pointer to the (terminal or nonterminal) symbol "x". -** Create a new symbol if this is the first time "x" has been seen. -*/ -struct symbol *Symbol_new(const char *x) -{ - struct symbol *sp; - - sp = Symbol_find(x); - if( sp==0 ){ - sp = (struct symbol *)calloc(1, sizeof(struct symbol) ); - MemoryCheck(sp); - sp->name = Strsafe(x); - sp->type = ISUPPER(*x) ? TERMINAL : NONTERMINAL; - sp->rule = 0; - sp->fallback = 0; - sp->prec = -1; - sp->assoc = UNK; - sp->firstset = 0; - sp->lambda = LEMON_FALSE; - sp->destructor = 0; - sp->destLineno = 0; - sp->datatype = 0; - sp->useCnt = 0; - Symbol_insert(sp,sp->name); - } - sp->useCnt++; - return sp; -} - -/* Compare two symbols for sorting purposes. Return negative, -** zero, or positive if a is less then, equal to, or greater -** than b. -** -** Symbols that begin with upper case letters (terminals or tokens) -** must sort before symbols that begin with lower case letters -** (non-terminals). And MULTITERMINAL symbols (created using the -** %token_class directive) must sort at the very end. Other than -** that, the order does not matter. -** -** We find experimentally that leaving the symbols in their original -** order (the order they appeared in the grammar file) gives the -** smallest parser tables in SQLite. -*/ -int Symbolcmpp(const void *_a, const void *_b) -{ - const struct symbol *a = *(const struct symbol **) _a; - const struct symbol *b = *(const struct symbol **) _b; - int i1 = a->type==MULTITERMINAL ? 3 : a->name[0]>'Z' ? 2 : 1; - int i2 = b->type==MULTITERMINAL ? 3 : b->name[0]>'Z' ? 2 : 1; - return i1==i2 ? a->index - b->index : i1 - i2; -} - -/* There is one instance of the following structure for each -** associative array of type "x2". -*/ -struct s_x2 { - int size; /* The number of available slots. */ - /* Must be a power of 2 greater than or */ - /* equal to 1 */ - int count; /* Number of currently slots filled */ - struct s_x2node *tbl; /* The data stored here */ - struct s_x2node **ht; /* Hash table for lookups */ -}; - -/* There is one instance of this structure for every data element -** in an associative array of type "x2". -*/ -typedef struct s_x2node { - struct symbol *data; /* The data */ - const char *key; /* The key */ - struct s_x2node *next; /* Next entry with the same hash */ - struct s_x2node **from; /* Previous link */ -} x2node; - -/* There is only one instance of the array, which is the following */ -static struct s_x2 *x2a; - -/* Allocate a new associative array */ -void Symbol_init(void){ - if( x2a ) return; - x2a = (struct s_x2*)malloc( sizeof(struct s_x2) ); - if( x2a ){ - x2a->size = 128; - x2a->count = 0; - x2a->tbl = (x2node*)calloc(128, sizeof(x2node) + sizeof(x2node*)); - if( x2a->tbl==0 ){ - free(x2a); - x2a = 0; - }else{ - int i; - x2a->ht = (x2node**)&(x2a->tbl[128]); - for(i=0; i<128; i++) x2a->ht[i] = 0; - } - } -} -/* Insert a new record into the array. Return TRUE if successful. -** Prior data with the same key is NOT overwritten */ -int Symbol_insert(struct symbol *data, const char *key) -{ - x2node *np; - unsigned h; - unsigned ph; - - if( x2a==0 ) return 0; - ph = strhash(key); - h = ph & (x2a->size-1); - np = x2a->ht[h]; - while( np ){ - if( strcmp(np->key,key)==0 ){ - /* An existing entry with the same key is found. */ - /* Fail because overwrite is not allows. */ - return 0; - } - np = np->next; - } - if( x2a->count>=x2a->size ){ - /* Need to make the hash table bigger */ - int i,arrSize; - struct s_x2 array; - array.size = arrSize = x2a->size*2; - array.count = x2a->count; - array.tbl = (x2node*)calloc(arrSize, sizeof(x2node) + sizeof(x2node*)); - if( array.tbl==0 ) return 0; /* Fail due to malloc failure */ - array.ht = (x2node**)&(array.tbl[arrSize]); - for(i=0; icount; i++){ - x2node *oldnp, *newnp; - oldnp = &(x2a->tbl[i]); - h = strhash(oldnp->key) & (arrSize-1); - newnp = &(array.tbl[i]); - if( array.ht[h] ) array.ht[h]->from = &(newnp->next); - newnp->next = array.ht[h]; - newnp->key = oldnp->key; - newnp->data = oldnp->data; - newnp->from = &(array.ht[h]); - array.ht[h] = newnp; - } - free(x2a->tbl); - *x2a = array; - } - /* Insert the new data */ - h = ph & (x2a->size-1); - np = &(x2a->tbl[x2a->count++]); - np->key = key; - np->data = data; - if( x2a->ht[h] ) x2a->ht[h]->from = &(np->next); - np->next = x2a->ht[h]; - x2a->ht[h] = np; - np->from = &(x2a->ht[h]); - return 1; -} - -/* Return a pointer to data assigned to the given key. Return NULL -** if no such key. */ -struct symbol *Symbol_find(const char *key) -{ - unsigned h; - x2node *np; - - if( x2a==0 ) return 0; - h = strhash(key) & (x2a->size-1); - np = x2a->ht[h]; - while( np ){ - if( strcmp(np->key,key)==0 ) break; - np = np->next; - } - return np ? np->data : 0; -} - -/* Return the n-th data. Return NULL if n is out of range. */ -struct symbol *Symbol_Nth(int n) -{ - struct symbol *data; - if( x2a && n>0 && n<=x2a->count ){ - data = x2a->tbl[n-1].data; - }else{ - data = 0; - } - return data; -} - -/* Return the size of the array */ -int Symbol_count() -{ - return x2a ? x2a->count : 0; -} - -/* Return an array of pointers to all data in the table. -** The array is obtained from malloc. Return NULL if memory allocation -** problems, or if the array is empty. */ -struct symbol **Symbol_arrayof() -{ - struct symbol **array; - int i,arrSize; - if( x2a==0 ) return 0; - arrSize = x2a->count; - array = (struct symbol **)calloc(arrSize, sizeof(struct symbol *)); - if( array ){ - for(i=0; itbl[i].data; - } - return array; -} - -/* Compare two configurations */ -int Configcmp(const char *_a,const char *_b) -{ - const struct config *a = (struct config *) _a; - const struct config *b = (struct config *) _b; - int x; - x = a->rp->index - b->rp->index; - if( x==0 ) x = a->dot - b->dot; - return x; -} - -/* Compare two states */ -PRIVATE int statecmp(struct config *a, struct config *b) -{ - int rc; - for(rc=0; rc==0 && a && b; a=a->bp, b=b->bp){ - rc = a->rp->index - b->rp->index; - if( rc==0 ) rc = a->dot - b->dot; - } - if( rc==0 ){ - if( a ) rc = 1; - if( b ) rc = -1; - } - return rc; -} - -/* Hash a state */ -PRIVATE unsigned statehash(struct config *a) -{ - unsigned h=0; - while( a ){ - h = h*571 + a->rp->index*37 + a->dot; - a = a->bp; - } - return h; -} - -/* Allocate a new state structure */ -struct state *State_new() -{ - struct state *newstate; - newstate = (struct state *)calloc(1, sizeof(struct state) ); - MemoryCheck(newstate); - return newstate; -} - -/* There is one instance of the following structure for each -** associative array of type "x3". -*/ -struct s_x3 { - int size; /* The number of available slots. */ - /* Must be a power of 2 greater than or */ - /* equal to 1 */ - int count; /* Number of currently slots filled */ - struct s_x3node *tbl; /* The data stored here */ - struct s_x3node **ht; /* Hash table for lookups */ -}; - -/* There is one instance of this structure for every data element -** in an associative array of type "x3". -*/ -typedef struct s_x3node { - struct state *data; /* The data */ - struct config *key; /* The key */ - struct s_x3node *next; /* Next entry with the same hash */ - struct s_x3node **from; /* Previous link */ -} x3node; - -/* There is only one instance of the array, which is the following */ -static struct s_x3 *x3a; - -/* Allocate a new associative array */ -void State_init(void){ - if( x3a ) return; - x3a = (struct s_x3*)malloc( sizeof(struct s_x3) ); - if( x3a ){ - x3a->size = 128; - x3a->count = 0; - x3a->tbl = (x3node*)calloc(128, sizeof(x3node) + sizeof(x3node*)); - if( x3a->tbl==0 ){ - free(x3a); - x3a = 0; - }else{ - int i; - x3a->ht = (x3node**)&(x3a->tbl[128]); - for(i=0; i<128; i++) x3a->ht[i] = 0; - } - } -} -/* Insert a new record into the array. Return TRUE if successful. -** Prior data with the same key is NOT overwritten */ -int State_insert(struct state *data, struct config *key) -{ - x3node *np; - unsigned h; - unsigned ph; - - if( x3a==0 ) return 0; - ph = statehash(key); - h = ph & (x3a->size-1); - np = x3a->ht[h]; - while( np ){ - if( statecmp(np->key,key)==0 ){ - /* An existing entry with the same key is found. */ - /* Fail because overwrite is not allows. */ - return 0; - } - np = np->next; - } - if( x3a->count>=x3a->size ){ - /* Need to make the hash table bigger */ - int i,arrSize; - struct s_x3 array; - array.size = arrSize = x3a->size*2; - array.count = x3a->count; - array.tbl = (x3node*)calloc(arrSize, sizeof(x3node) + sizeof(x3node*)); - if( array.tbl==0 ) return 0; /* Fail due to malloc failure */ - array.ht = (x3node**)&(array.tbl[arrSize]); - for(i=0; icount; i++){ - x3node *oldnp, *newnp; - oldnp = &(x3a->tbl[i]); - h = statehash(oldnp->key) & (arrSize-1); - newnp = &(array.tbl[i]); - if( array.ht[h] ) array.ht[h]->from = &(newnp->next); - newnp->next = array.ht[h]; - newnp->key = oldnp->key; - newnp->data = oldnp->data; - newnp->from = &(array.ht[h]); - array.ht[h] = newnp; - } - free(x3a->tbl); - *x3a = array; - } - /* Insert the new data */ - h = ph & (x3a->size-1); - np = &(x3a->tbl[x3a->count++]); - np->key = key; - np->data = data; - if( x3a->ht[h] ) x3a->ht[h]->from = &(np->next); - np->next = x3a->ht[h]; - x3a->ht[h] = np; - np->from = &(x3a->ht[h]); - return 1; -} - -/* Return a pointer to data assigned to the given key. Return NULL -** if no such key. */ -struct state *State_find(struct config *key) -{ - unsigned h; - x3node *np; - - if( x3a==0 ) return 0; - h = statehash(key) & (x3a->size-1); - np = x3a->ht[h]; - while( np ){ - if( statecmp(np->key,key)==0 ) break; - np = np->next; - } - return np ? np->data : 0; -} - -/* Return an array of pointers to all data in the table. -** The array is obtained from malloc. Return NULL if memory allocation -** problems, or if the array is empty. */ -struct state **State_arrayof(void) -{ - struct state **array; - int i,arrSize; - if( x3a==0 ) return 0; - arrSize = x3a->count; - array = (struct state **)calloc(arrSize, sizeof(struct state *)); - if( array ){ - for(i=0; itbl[i].data; - } - return array; -} - -/* Hash a configuration */ -PRIVATE unsigned confighash(struct config *a) -{ - unsigned h=0; - h = h*571 + a->rp->index*37 + a->dot; - return h; -} - -/* There is one instance of the following structure for each -** associative array of type "x4". -*/ -struct s_x4 { - int size; /* The number of available slots. */ - /* Must be a power of 2 greater than or */ - /* equal to 1 */ - int count; /* Number of currently slots filled */ - struct s_x4node *tbl; /* The data stored here */ - struct s_x4node **ht; /* Hash table for lookups */ -}; - -/* There is one instance of this structure for every data element -** in an associative array of type "x4". -*/ -typedef struct s_x4node { - struct config *data; /* The data */ - struct s_x4node *next; /* Next entry with the same hash */ - struct s_x4node **from; /* Previous link */ -} x4node; - -/* There is only one instance of the array, which is the following */ -static struct s_x4 *x4a; - -/* Allocate a new associative array */ -void Configtable_init(void){ - if( x4a ) return; - x4a = (struct s_x4*)malloc( sizeof(struct s_x4) ); - if( x4a ){ - x4a->size = 64; - x4a->count = 0; - x4a->tbl = (x4node*)calloc(64, sizeof(x4node) + sizeof(x4node*)); - if( x4a->tbl==0 ){ - free(x4a); - x4a = 0; - }else{ - int i; - x4a->ht = (x4node**)&(x4a->tbl[64]); - for(i=0; i<64; i++) x4a->ht[i] = 0; - } - } -} -/* Insert a new record into the array. Return TRUE if successful. -** Prior data with the same key is NOT overwritten */ -int Configtable_insert(struct config *data) -{ - x4node *np; - unsigned h; - unsigned ph; - - if( x4a==0 ) return 0; - ph = confighash(data); - h = ph & (x4a->size-1); - np = x4a->ht[h]; - while( np ){ - if( Configcmp((const char *) np->data,(const char *) data)==0 ){ - /* An existing entry with the same key is found. */ - /* Fail because overwrite is not allows. */ - return 0; - } - np = np->next; - } - if( x4a->count>=x4a->size ){ - /* Need to make the hash table bigger */ - int i,arrSize; - struct s_x4 array; - array.size = arrSize = x4a->size*2; - array.count = x4a->count; - array.tbl = (x4node*)calloc(arrSize, sizeof(x4node) + sizeof(x4node*)); - if( array.tbl==0 ) return 0; /* Fail due to malloc failure */ - array.ht = (x4node**)&(array.tbl[arrSize]); - for(i=0; icount; i++){ - x4node *oldnp, *newnp; - oldnp = &(x4a->tbl[i]); - h = confighash(oldnp->data) & (arrSize-1); - newnp = &(array.tbl[i]); - if( array.ht[h] ) array.ht[h]->from = &(newnp->next); - newnp->next = array.ht[h]; - newnp->data = oldnp->data; - newnp->from = &(array.ht[h]); - array.ht[h] = newnp; - } - free(x4a->tbl); - *x4a = array; - } - /* Insert the new data */ - h = ph & (x4a->size-1); - np = &(x4a->tbl[x4a->count++]); - np->data = data; - if( x4a->ht[h] ) x4a->ht[h]->from = &(np->next); - np->next = x4a->ht[h]; - x4a->ht[h] = np; - np->from = &(x4a->ht[h]); - return 1; -} - -/* Return a pointer to data assigned to the given key. Return NULL -** if no such key. */ -struct config *Configtable_find(struct config *key) -{ - int h; - x4node *np; - - if( x4a==0 ) return 0; - h = confighash(key) & (x4a->size-1); - np = x4a->ht[h]; - while( np ){ - if( Configcmp((const char *) np->data,(const char *) key)==0 ) break; - np = np->next; - } - return np ? np->data : 0; -} - -/* Remove all data from the table. Pass each data to the function "f" -** as it is removed. ("f" may be null to avoid this step.) */ -void Configtable_clear(int(*f)(struct config *)) -{ - int i; - if( x4a==0 || x4a->count==0 ) return; - if( f ) for(i=0; icount; i++) (*f)(x4a->tbl[i].data); - for(i=0; isize; i++) x4a->ht[i] = 0; - x4a->count = 0; - return; -} diff --git a/tools/lemon/lempar.c b/tools/lemon/lempar.c deleted file mode 100644 index 5e2024fff..000000000 --- a/tools/lemon/lempar.c +++ /dev/null @@ -1,981 +0,0 @@ -/* -** 2000-05-29 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** Driver template for the LEMON parser generator. -** -** The "lemon" program processes an LALR(1) input grammar file, then uses -** this template to construct a parser. The "lemon" program inserts text -** at each "%%" line. Also, any "P-a-r-s-e" identifier prefix (without the -** interstitial "-" characters) contained in this template is changed into -** the value of the %name directive from the grammar. Otherwise, the content -** of this template is copied straight through into the generate parser -** source file. -** -** The following is the concatenation of all %include directives from the -** input grammar file: -*/ -#include -/************ Begin %include sections from the grammar ************************/ -%% -/**************** End of %include directives **********************************/ -/* These constants specify the various numeric values for terminal symbols -** in a format understandable to "makeheaders". This section is blank unless -** "lemon" is run with the "-m" command-line option. -***************** Begin makeheaders token definitions *************************/ -%% -/**************** End makeheaders token definitions ***************************/ - -/* The next sections is a series of control #defines. -** various aspects of the generated parser. -** YYCODETYPE is the data type used to store the integer codes -** that represent terminal and non-terminal symbols. -** "unsigned char" is used if there are fewer than -** 256 symbols. Larger types otherwise. -** YYNOCODE is a number of type YYCODETYPE that is not used for -** any terminal or nonterminal symbol. -** YYFALLBACK If defined, this indicates that one or more tokens -** (also known as: "terminal symbols") have fall-back -** values which should be used if the original symbol -** would not parse. This permits keywords to sometimes -** be used as identifiers, for example. -** YYACTIONTYPE is the data type used for "action codes" - numbers -** that indicate what to do in response to the next -** token. -** ParseTOKENTYPE is the data type used for minor type for terminal -** symbols. Background: A "minor type" is a semantic -** value associated with a terminal or non-terminal -** symbols. For example, for an "ID" terminal symbol, -** the minor type might be the name of the identifier. -** Each non-terminal can have a different minor type. -** Terminal symbols all have the same minor type, though. -** This macros defines the minor type for terminal -** symbols. -** YYMINORTYPE is the data type used for all minor types. -** This is typically a union of many types, one of -** which is ParseTOKENTYPE. The entry in the union -** for terminal symbols is called "yy0". -** YYSTACKDEPTH is the maximum depth of the parser's stack. If -** zero the stack is dynamically sized using realloc() -** ParseARG_SDECL A static variable declaration for the %extra_argument -** ParseARG_PDECL A parameter declaration for the %extra_argument -** ParseARG_STORE Code to store %extra_argument into yypParser -** ParseARG_FETCH Code to extract %extra_argument from yypParser -** YYERRORSYMBOL is the code number of the error symbol. If not -** defined, then do no error processing. -** YYNSTATE the combined number of states. -** YYNRULE the number of rules in the grammar -** YY_MAX_SHIFT Maximum value for shift actions -** YY_MIN_SHIFTREDUCE Minimum value for shift-reduce actions -** YY_MAX_SHIFTREDUCE Maximum value for shift-reduce actions -** YY_MIN_REDUCE Minimum value for reduce actions -** YY_MAX_REDUCE Maximum value for reduce actions -** YY_ERROR_ACTION The yy_action[] code for syntax error -** YY_ACCEPT_ACTION The yy_action[] code for accept -** YY_NO_ACTION The yy_action[] code for no-op -*/ -#ifndef INTERFACE -# define INTERFACE 1 -#endif -/************* Begin control #defines *****************************************/ -%% -/************* End control #defines *******************************************/ - -/* Define the yytestcase() macro to be a no-op if is not already defined -** otherwise. -** -** Applications can choose to define yytestcase() in the %include section -** to a macro that can assist in verifying code coverage. For production -** code the yytestcase() macro should be turned off. But it is useful -** for testing. -*/ -#ifndef yytestcase -# define yytestcase(X) -#endif - - -/* Next are the tables used to determine what action to take based on the -** current state and lookahead token. These tables are used to implement -** functions that take a state number and lookahead value and return an -** action integer. -** -** Suppose the action integer is N. Then the action is determined as -** follows -** -** 0 <= N <= YY_MAX_SHIFT Shift N. That is, push the lookahead -** token onto the stack and goto state N. -** -** N between YY_MIN_SHIFTREDUCE Shift to an arbitrary state then -** and YY_MAX_SHIFTREDUCE reduce by rule N-YY_MIN_SHIFTREDUCE. -** -** N between YY_MIN_REDUCE Reduce by rule N-YY_MIN_REDUCE -** and YY_MAX_REDUCE -** -** N == YY_ERROR_ACTION A syntax error has occurred. -** -** N == YY_ACCEPT_ACTION The parser accepts its input. -** -** N == YY_NO_ACTION No such action. Denotes unused -** slots in the yy_action[] table. -** -** The action table is constructed as a single large table named yy_action[]. -** Given state S and lookahead X, the action is computed as either: -** -** (A) N = yy_action[ yy_shift_ofst[S] + X ] -** (B) N = yy_default[S] -** -** The (A) formula is preferred. The B formula is used instead if: -** (1) The yy_shift_ofst[S]+X value is out of range, or -** (2) yy_lookahead[yy_shift_ofst[S]+X] is not equal to X, or -** (3) yy_shift_ofst[S] equal YY_SHIFT_USE_DFLT. -** (Implementation note: YY_SHIFT_USE_DFLT is chosen so that -** YY_SHIFT_USE_DFLT+X will be out of range for all possible lookaheads X. -** Hence only tests (1) and (2) need to be evaluated.) -** -** The formulas above are for computing the action when the lookahead is -** a terminal symbol. If the lookahead is a non-terminal (as occurs after -** a reduce action) then the yy_reduce_ofst[] array is used in place of -** the yy_shift_ofst[] array and YY_REDUCE_USE_DFLT is used in place of -** YY_SHIFT_USE_DFLT. -** -** The following are the tables generated in this section: -** -** yy_action[] A single table containing all actions. -** yy_lookahead[] A table containing the lookahead for each entry in -** yy_action. Used to detect hash collisions. -** yy_shift_ofst[] For each state, the offset into yy_action for -** shifting terminals. -** yy_reduce_ofst[] For each state, the offset into yy_action for -** shifting non-terminals after a reduce. -** yy_default[] Default action for each state. -** -*********** Begin parsing tables **********************************************/ -%% -/********** End of lemon-generated parsing tables *****************************/ - -/* The next table maps tokens (terminal symbols) into fallback tokens. -** If a construct like the following: -** -** %fallback ID X Y Z. -** -** appears in the grammar, then ID becomes a fallback token for X, Y, -** and Z. Whenever one of the tokens X, Y, or Z is input to the parser -** but it does not parse, the type of the token is changed to ID and -** the parse is retried before an error is thrown. -** -** This feature can be used, for example, to cause some keywords in a language -** to revert to identifiers if they keyword does not apply in the context where -** it appears. -*/ -#ifdef YYFALLBACK -static const YYCODETYPE yyFallback[] = { -%% -}; -#endif /* YYFALLBACK */ - -/* The following structure represents a single element of the -** parser's stack. Information stored includes: -** -** + The state number for the parser at this level of the stack. -** -** + The value of the token stored at this level of the stack. -** (In other words, the "major" token.) -** -** + The semantic value stored at this level of the stack. This is -** the information used by the action routines in the grammar. -** It is sometimes called the "minor" token. -** -** After the "shift" half of a SHIFTREDUCE action, the stateno field -** actually contains the reduce action for the second half of the -** SHIFTREDUCE. -*/ -struct yyStackEntry { - YYACTIONTYPE stateno; /* The state-number, or reduce action in SHIFTREDUCE */ - YYCODETYPE major; /* The major token value. This is the code - ** number for the token at this stack level */ - YYMINORTYPE minor; /* The user-supplied minor token value. This - ** is the value of the token */ -}; -typedef struct yyStackEntry yyStackEntry; - -/* The state of the parser is completely contained in an instance of -** the following structure */ -struct yyParser { - yyStackEntry *yytos; /* Pointer to top element of the stack */ -#ifdef YYTRACKMAXSTACKDEPTH - int yyhwm; /* High-water mark of the stack */ -#endif -#ifndef YYNOERRORRECOVERY - int yyerrcnt; /* Shifts left before out of the error */ -#endif - ParseARG_SDECL /* A place to hold %extra_argument */ -#if YYSTACKDEPTH<=0 - int yystksz; /* Current side of the stack */ - yyStackEntry *yystack; /* The parser's stack */ - yyStackEntry yystk0; /* First stack entry */ -#else - yyStackEntry yystack[YYSTACKDEPTH]; /* The parser's stack */ - yyStackEntry *yystackEnd; /* Last entry in the stack */ -#endif -}; -typedef struct yyParser yyParser; - -#ifndef NDEBUG -#include -static FILE *yyTraceFILE = 0; -static char *yyTracePrompt = 0; -#endif /* NDEBUG */ - -#ifndef NDEBUG -/* -** Turn parser tracing on by giving a stream to which to write the trace -** and a prompt to preface each trace message. Tracing is turned off -** by making either argument NULL -** -** Inputs: -**
    -**
  • A FILE* to which trace output should be written. -** If NULL, then tracing is turned off. -**
  • A prefix string written at the beginning of every -** line of trace output. If NULL, then tracing is -** turned off. -**
-** -** Outputs: -** None. -*/ -void ParseTrace(FILE *TraceFILE, char *zTracePrompt){ - yyTraceFILE = TraceFILE; - yyTracePrompt = zTracePrompt; - if( yyTraceFILE==0 ) yyTracePrompt = 0; - else if( yyTracePrompt==0 ) yyTraceFILE = 0; -} -#endif /* NDEBUG */ - -#ifndef NDEBUG -/* For tracing shifts, the names of all terminals and nonterminals -** are required. The following table supplies these names */ -static const char *const yyTokenName[] = { -%% -}; -#endif /* NDEBUG */ - -#ifndef NDEBUG -/* For tracing reduce actions, the names of all rules are required. -*/ -static const char *const yyRuleName[] = { -%% -}; -#endif /* NDEBUG */ - - -#if YYSTACKDEPTH<=0 -/* -** Try to increase the size of the parser stack. Return the number -** of errors. Return 0 on success. -*/ -static int yyGrowStack(yyParser *p){ - int newSize; - int idx; - yyStackEntry *pNew; - - newSize = p->yystksz*2 + 100; - idx = p->yytos ? (int)(p->yytos - p->yystack) : 0; - if( p->yystack==&p->yystk0 ){ - pNew = malloc(newSize*sizeof(pNew[0])); - if( pNew ) pNew[0] = p->yystk0; - }else{ - pNew = realloc(p->yystack, newSize*sizeof(pNew[0])); - } - if( pNew ){ - p->yystack = pNew; - p->yytos = &p->yystack[idx]; -#ifndef NDEBUG - if( yyTraceFILE ){ - fprintf(yyTraceFILE,"%sStack grows from %d to %d entries.\n", - yyTracePrompt, p->yystksz, newSize); - } -#endif - p->yystksz = newSize; - } - return pNew==0; -} -#endif - -/* Datatype of the argument to the memory allocated passed as the -** second argument to ParseAlloc() below. This can be changed by -** putting an appropriate #define in the %include section of the input -** grammar. -*/ -#ifndef YYMALLOCARGTYPE -# define YYMALLOCARGTYPE size_t -#endif - -/* Initialize a new parser that has already been allocated. -*/ -void ParseInit(void *yypParser){ - yyParser *pParser = (yyParser*)yypParser; -#ifdef YYTRACKMAXSTACKDEPTH - pParser->yyhwm = 0; -#endif -#if YYSTACKDEPTH<=0 - pParser->yytos = NULL; - pParser->yystack = NULL; - pParser->yystksz = 0; - if( yyGrowStack(pParser) ){ - pParser->yystack = &pParser->yystk0; - pParser->yystksz = 1; - } -#endif -#ifndef YYNOERRORRECOVERY - pParser->yyerrcnt = -1; -#endif - pParser->yytos = pParser->yystack; - pParser->yystack[0].stateno = 0; - pParser->yystack[0].major = 0; -#if YYSTACKDEPTH>0 - pParser->yystackEnd = &pParser->yystack[YYSTACKDEPTH-1]; -#endif -} - -#ifndef Parse_ENGINEALWAYSONSTACK -/* -** This function allocates a new parser. -** The only argument is a pointer to a function which works like -** malloc. -** -** Inputs: -** A pointer to the function used to allocate memory. -** -** Outputs: -** A pointer to a parser. This pointer is used in subsequent calls -** to Parse and ParseFree. -*/ -void *ParseAlloc(void *(*mallocProc)(YYMALLOCARGTYPE)){ - yyParser *pParser; - pParser = (yyParser*)(*mallocProc)( (YYMALLOCARGTYPE)sizeof(yyParser) ); - if( pParser ) ParseInit(pParser); - return pParser; -} -#endif /* Parse_ENGINEALWAYSONSTACK */ - - -/* The following function deletes the "minor type" or semantic value -** associated with a symbol. The symbol can be either a terminal -** or nonterminal. "yymajor" is the symbol code, and "yypminor" is -** a pointer to the value to be deleted. The code used to do the -** deletions is derived from the %destructor and/or %token_destructor -** directives of the input grammar. -*/ -static void yy_destructor( - yyParser *yypParser, /* The parser */ - YYCODETYPE yymajor, /* Type code for object to destroy */ - YYMINORTYPE *yypminor /* The object to be destroyed */ -){ - ParseARG_FETCH; - switch( yymajor ){ - /* Here is inserted the actions which take place when a - ** terminal or non-terminal is destroyed. This can happen - ** when the symbol is popped from the stack during a - ** reduce or during error processing or when a parser is - ** being destroyed before it is finished parsing. - ** - ** Note: during a reduce, the only symbols destroyed are those - ** which appear on the RHS of the rule, but which are *not* used - ** inside the C code. - */ -/********* Begin destructor definitions ***************************************/ -%% -/********* End destructor definitions *****************************************/ - default: break; /* If no destructor action specified: do nothing */ - } -} - -/* -** Pop the parser's stack once. -** -** If there is a destructor routine associated with the token which -** is popped from the stack, then call it. -*/ -static void yy_pop_parser_stack(yyParser *pParser){ - yyStackEntry *yytos; - assert( pParser->yytos!=0 ); - assert( pParser->yytos > pParser->yystack ); - yytos = pParser->yytos--; -#ifndef NDEBUG - if( yyTraceFILE ){ - fprintf(yyTraceFILE,"%sPopping %s\n", - yyTracePrompt, - yyTokenName[yytos->major]); - } -#endif - yy_destructor(pParser, yytos->major, &yytos->minor); -} - -/* -** Clear all secondary memory allocations from the parser -*/ -void ParseFinalize(void *p){ - yyParser *pParser = (yyParser*)p; - while( pParser->yytos>pParser->yystack ) yy_pop_parser_stack(pParser); -#if YYSTACKDEPTH<=0 - if( pParser->yystack!=&pParser->yystk0 ) free(pParser->yystack); -#endif -} - -#ifndef Parse_ENGINEALWAYSONSTACK -/* -** Deallocate and destroy a parser. Destructors are called for -** all stack elements before shutting the parser down. -** -** If the YYPARSEFREENEVERNULL macro exists (for example because it -** is defined in a %include section of the input grammar) then it is -** assumed that the input pointer is never NULL. -*/ -void ParseFree( - void *p, /* The parser to be deleted */ - void (*freeProc)(void*) /* Function used to reclaim memory */ -){ -#ifndef YYPARSEFREENEVERNULL - if( p==0 ) return; -#endif - ParseFinalize(p); - (*freeProc)(p); -} -#endif /* Parse_ENGINEALWAYSONSTACK */ - -/* -** Return the peak depth of the stack for a parser. -*/ -#ifdef YYTRACKMAXSTACKDEPTH -int ParseStackPeak(void *p){ - yyParser *pParser = (yyParser*)p; - return pParser->yyhwm; -} -#endif - -/* -** Find the appropriate action for a parser given the terminal -** look-ahead token iLookAhead. -*/ -static unsigned int yy_find_shift_action( - yyParser *pParser, /* The parser */ - YYCODETYPE iLookAhead /* The look-ahead token */ -){ - int i; - int stateno = pParser->yytos->stateno; - - if( stateno>=YY_MIN_REDUCE ) return stateno; - assert( stateno <= YY_SHIFT_COUNT ); - do{ - i = yy_shift_ofst[stateno]; - assert( iLookAhead!=YYNOCODE ); - i += iLookAhead; - if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){ -#ifdef YYFALLBACK - YYCODETYPE iFallback; /* Fallback token */ - if( iLookAhead %s\n", - yyTracePrompt, yyTokenName[iLookAhead], yyTokenName[iFallback]); - } -#endif - assert( yyFallback[iFallback]==0 ); /* Fallback loop must terminate */ - iLookAhead = iFallback; - continue; - } -#endif -#ifdef YYWILDCARD - { - int j = i - iLookAhead + YYWILDCARD; - if( -#if YY_SHIFT_MIN+YYWILDCARD<0 - j>=0 && -#endif -#if YY_SHIFT_MAX+YYWILDCARD>=YY_ACTTAB_COUNT - j0 - ){ -#ifndef NDEBUG - if( yyTraceFILE ){ - fprintf(yyTraceFILE, "%sWILDCARD %s => %s\n", - yyTracePrompt, yyTokenName[iLookAhead], - yyTokenName[YYWILDCARD]); - } -#endif /* NDEBUG */ - return yy_action[j]; - } - } -#endif /* YYWILDCARD */ - return yy_default[stateno]; - }else{ - return yy_action[i]; - } - }while(1); -} - -/* -** Find the appropriate action for a parser given the non-terminal -** look-ahead token iLookAhead. -*/ -static int yy_find_reduce_action( - int stateno, /* Current state number */ - YYCODETYPE iLookAhead /* The look-ahead token */ -){ - int i; -#ifdef YYERRORSYMBOL - if( stateno>YY_REDUCE_COUNT ){ - return yy_default[stateno]; - } -#else - assert( stateno<=YY_REDUCE_COUNT ); -#endif - i = yy_reduce_ofst[stateno]; - assert( i!=YY_REDUCE_USE_DFLT ); - assert( iLookAhead!=YYNOCODE ); - i += iLookAhead; -#ifdef YYERRORSYMBOL - if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){ - return yy_default[stateno]; - } -#else - assert( i>=0 && iyytos>yypParser->yystack ) yy_pop_parser_stack(yypParser); - /* Here code is inserted which will execute if the parser - ** stack every overflows */ -/******** Begin %stack_overflow code ******************************************/ -%% -/******** End %stack_overflow code ********************************************/ - ParseARG_STORE; /* Suppress warning about unused %extra_argument var */ -} - -/* -** Print tracing information for a SHIFT action -*/ -#ifndef NDEBUG -static void yyTraceShift(yyParser *yypParser, int yyNewState){ - if( yyTraceFILE ){ - if( yyNewStateyytos->major], - yyNewState); - }else{ - fprintf(yyTraceFILE,"%sShift '%s'\n", - yyTracePrompt,yyTokenName[yypParser->yytos->major]); - } - } -} -#else -# define yyTraceShift(X,Y) -#endif - -/* -** Perform a shift action. -*/ -static void yy_shift( - yyParser *yypParser, /* The parser to be shifted */ - int yyNewState, /* The new state to shift in */ - int yyMajor, /* The major token to shift in */ - ParseTOKENTYPE yyMinor /* The minor token to shift in */ -){ - yyStackEntry *yytos; - yypParser->yytos++; -#ifdef YYTRACKMAXSTACKDEPTH - if( (int)(yypParser->yytos - yypParser->yystack)>yypParser->yyhwm ){ - yypParser->yyhwm++; - assert( yypParser->yyhwm == (int)(yypParser->yytos - yypParser->yystack) ); - } -#endif -#if YYSTACKDEPTH>0 - if( yypParser->yytos>yypParser->yystackEnd ){ - yypParser->yytos--; - yyStackOverflow(yypParser); - return; - } -#else - if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz] ){ - if( yyGrowStack(yypParser) ){ - yypParser->yytos--; - yyStackOverflow(yypParser); - return; - } - } -#endif - if( yyNewState > YY_MAX_SHIFT ){ - yyNewState += YY_MIN_REDUCE - YY_MIN_SHIFTREDUCE; - } - yytos = yypParser->yytos; - yytos->stateno = (YYACTIONTYPE)yyNewState; - yytos->major = (YYCODETYPE)yyMajor; - yytos->minor.yy0 = yyMinor; - yyTraceShift(yypParser, yyNewState); -} - -/* The following table contains information about every rule that -** is used during the reduce. -*/ -static const struct { - YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */ - signed char nrhs; /* Negative of the number of RHS symbols in the rule */ -} yyRuleInfo[] = { -%% -}; - -static void yy_accept(yyParser*); /* Forward Declaration */ - -/* -** Perform a reduce action and the shift that must immediately -** follow the reduce. -** -** The yyLookahead and yyLookaheadToken parameters provide reduce actions -** access to the lookahead token (if any). The yyLookahead will be YYNOCODE -** if the lookahead token has already been consumed. As this procedure is -** only called from one place, optimizing compilers will in-line it, which -** means that the extra parameters have no performance impact. -*/ -static void yy_reduce( - yyParser *yypParser, /* The parser */ - unsigned int yyruleno, /* Number of the rule by which to reduce */ - int yyLookahead, /* Lookahead token, or YYNOCODE if none */ - ParseTOKENTYPE yyLookaheadToken /* Value of the lookahead token */ -){ - int yygoto; /* The next state */ - int yyact; /* The next action */ - yyStackEntry *yymsp; /* The top of the parser's stack */ - int yysize; /* Amount to pop the stack */ - ParseARG_FETCH; - yymsp = yypParser->yytos; -#ifndef NDEBUG - if( yyTraceFILE && yyruleno<(int)(sizeof(yyRuleName)/sizeof(yyRuleName[0])) ){ - yysize = yyRuleInfo[yyruleno].nrhs; - fprintf(yyTraceFILE, "%sReduce [%s], go to state %d.\n", yyTracePrompt, - yyRuleName[yyruleno], yymsp[yysize].stateno); - } -#endif /* NDEBUG */ - - /* Check that the stack is large enough to grow by a single entry - ** if the RHS of the rule is empty. This ensures that there is room - ** enough on the stack to push the LHS value */ - if( yyRuleInfo[yyruleno].nrhs==0 ){ -#ifdef YYTRACKMAXSTACKDEPTH - if( (int)(yypParser->yytos - yypParser->yystack)>yypParser->yyhwm ){ - yypParser->yyhwm++; - assert( yypParser->yyhwm == (int)(yypParser->yytos - yypParser->yystack)); - } -#endif -#if YYSTACKDEPTH>0 - if( yypParser->yytos>=yypParser->yystackEnd ){ - yyStackOverflow(yypParser); - return; - } -#else - if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz-1] ){ - if( yyGrowStack(yypParser) ){ - yyStackOverflow(yypParser); - return; - } - yymsp = yypParser->yytos; - } -#endif - } - - switch( yyruleno ){ - /* Beginning here are the reduction cases. A typical example - ** follows: - ** case 0: - ** #line - ** { ... } // User supplied code - ** #line - ** break; - */ -/********** Begin reduce actions **********************************************/ -%% -/********** End reduce actions ************************************************/ - }; - assert( yyrulenoYY_MAX_SHIFT && yyact<=YY_MAX_SHIFTREDUCE) ); - - /* It is not possible for a REDUCE to be followed by an error */ - assert( yyact!=YY_ERROR_ACTION ); - - if( yyact==YY_ACCEPT_ACTION ){ - yypParser->yytos += yysize; - yy_accept(yypParser); - }else{ - yymsp += yysize+1; - yypParser->yytos = yymsp; - yymsp->stateno = (YYACTIONTYPE)yyact; - yymsp->major = (YYCODETYPE)yygoto; - yyTraceShift(yypParser, yyact); - } -} - -/* -** The following code executes when the parse fails -*/ -#ifndef YYNOERRORRECOVERY -static void yy_parse_failed( - yyParser *yypParser /* The parser */ -){ - ParseARG_FETCH; -#ifndef NDEBUG - if( yyTraceFILE ){ - fprintf(yyTraceFILE,"%sFail!\n",yyTracePrompt); - } -#endif - while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser); - /* Here code is inserted which will be executed whenever the - ** parser fails */ -/************ Begin %parse_failure code ***************************************/ -%% -/************ End %parse_failure code *****************************************/ - ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */ -} -#endif /* YYNOERRORRECOVERY */ - -/* -** The following code executes when a syntax error first occurs. -*/ -static void yy_syntax_error( - yyParser *yypParser, /* The parser */ - int yymajor, /* The major type of the error token */ - ParseTOKENTYPE yyminor /* The minor type of the error token */ -){ - ParseARG_FETCH; -#define TOKEN yyminor -/************ Begin %syntax_error code ****************************************/ -%% -/************ End %syntax_error code ******************************************/ - ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */ -} - -/* -** The following is executed when the parser accepts -*/ -static void yy_accept( - yyParser *yypParser /* The parser */ -){ - ParseARG_FETCH; -#ifndef NDEBUG - if( yyTraceFILE ){ - fprintf(yyTraceFILE,"%sAccept!\n",yyTracePrompt); - } -#endif -#ifndef YYNOERRORRECOVERY - yypParser->yyerrcnt = -1; -#endif - assert( yypParser->yytos==yypParser->yystack ); - /* Here code is inserted which will be executed whenever the - ** parser accepts */ -/*********** Begin %parse_accept code *****************************************/ -%% -/*********** End %parse_accept code *******************************************/ - ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */ -} - -/* The main parser program. -** The first argument is a pointer to a structure obtained from -** "ParseAlloc" which describes the current state of the parser. -** The second argument is the major token number. The third is -** the minor token. The fourth optional argument is whatever the -** user wants (and specified in the grammar) and is available for -** use by the action routines. -** -** Inputs: -**
    -**
  • A pointer to the parser (an opaque structure.) -**
  • The major token number. -**
  • The minor token number. -**
  • An option argument of a grammar-specified type. -**
-** -** Outputs: -** None. -*/ -void Parse( - void *yyp, /* The parser */ - int yymajor, /* The major token code number */ - ParseTOKENTYPE yyminor /* The value for the token */ - ParseARG_PDECL /* Optional %extra_argument parameter */ -){ - YYMINORTYPE yyminorunion; - unsigned int yyact; /* The parser action. */ -#if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY) - int yyendofinput; /* True if we are at the end of input */ -#endif -#ifdef YYERRORSYMBOL - int yyerrorhit = 0; /* True if yymajor has invoked an error */ -#endif - yyParser *yypParser; /* The parser */ - - yypParser = (yyParser*)yyp; - assert( yypParser->yytos!=0 ); -#if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY) - yyendofinput = (yymajor==0); -#endif - ParseARG_STORE; - -#ifndef NDEBUG - if( yyTraceFILE ){ - fprintf(yyTraceFILE,"%sInput '%s'\n",yyTracePrompt,yyTokenName[yymajor]); - } -#endif - - do{ - yyact = yy_find_shift_action(yypParser,(YYCODETYPE)yymajor); - if( yyact <= YY_MAX_SHIFTREDUCE ){ - yy_shift(yypParser,yyact,yymajor,yyminor); -#ifndef YYNOERRORRECOVERY - yypParser->yyerrcnt--; -#endif - yymajor = YYNOCODE; - }else if( yyact <= YY_MAX_REDUCE ){ - yy_reduce(yypParser,yyact-YY_MIN_REDUCE,yymajor,yyminor); - }else{ - assert( yyact == YY_ERROR_ACTION ); - yyminorunion.yy0 = yyminor; -#ifdef YYERRORSYMBOL - int yymx; -#endif -#ifndef NDEBUG - if( yyTraceFILE ){ - fprintf(yyTraceFILE,"%sSyntax Error!\n",yyTracePrompt); - } -#endif -#ifdef YYERRORSYMBOL - /* A syntax error has occurred. - ** The response to an error depends upon whether or not the - ** grammar defines an error token "ERROR". - ** - ** This is what we do if the grammar does define ERROR: - ** - ** * Call the %syntax_error function. - ** - ** * Begin popping the stack until we enter a state where - ** it is legal to shift the error symbol, then shift - ** the error symbol. - ** - ** * Set the error count to three. - ** - ** * Begin accepting and shifting new tokens. No new error - ** processing will occur until three tokens have been - ** shifted successfully. - ** - */ - if( yypParser->yyerrcnt<0 ){ - yy_syntax_error(yypParser,yymajor,yyminor); - } - yymx = yypParser->yytos->major; - if( yymx==YYERRORSYMBOL || yyerrorhit ){ -#ifndef NDEBUG - if( yyTraceFILE ){ - fprintf(yyTraceFILE,"%sDiscard input token %s\n", - yyTracePrompt,yyTokenName[yymajor]); - } -#endif - yy_destructor(yypParser, (YYCODETYPE)yymajor, &yyminorunion); - yymajor = YYNOCODE; - }else{ - while( yypParser->yytos >= yypParser->yystack - && yymx != YYERRORSYMBOL - && (yyact = yy_find_reduce_action( - yypParser->yytos->stateno, - YYERRORSYMBOL)) >= YY_MIN_REDUCE - ){ - yy_pop_parser_stack(yypParser); - } - if( yypParser->yytos < yypParser->yystack || yymajor==0 ){ - yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); - yy_parse_failed(yypParser); -#ifndef YYNOERRORRECOVERY - yypParser->yyerrcnt = -1; -#endif - yymajor = YYNOCODE; - }else if( yymx!=YYERRORSYMBOL ){ - yy_shift(yypParser,yyact,YYERRORSYMBOL,yyminor); - } - } - yypParser->yyerrcnt = 3; - yyerrorhit = 1; -#elif defined(YYNOERRORRECOVERY) - /* If the YYNOERRORRECOVERY macro is defined, then do not attempt to - ** do any kind of error recovery. Instead, simply invoke the syntax - ** error routine and continue going as if nothing had happened. - ** - ** Applications can set this macro (for example inside %include) if - ** they intend to abandon the parse upon the first syntax error seen. - */ - yy_syntax_error(yypParser,yymajor, yyminor); - yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); - yymajor = YYNOCODE; - -#else /* YYERRORSYMBOL is not defined */ - /* This is what we do if the grammar does not define ERROR: - ** - ** * Report an error message, and throw away the input token. - ** - ** * If the input token is $, then fail the parse. - ** - ** As before, subsequent error messages are suppressed until - ** three input tokens have been successfully shifted. - */ - if( yypParser->yyerrcnt<=0 ){ - yy_syntax_error(yypParser,yymajor, yyminor); - } - yypParser->yyerrcnt = 3; - yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); - if( yyendofinput ){ - yy_parse_failed(yypParser); -#ifndef YYNOERRORRECOVERY - yypParser->yyerrcnt = -1; -#endif - } - yymajor = YYNOCODE; -#endif - } - }while( yymajor!=YYNOCODE && yypParser->yytos>yypParser->yystack ); -#ifndef NDEBUG - if( yyTraceFILE ){ - yyStackEntry *i; - char cDiv = '['; - fprintf(yyTraceFILE,"%sReturn. Stack=",yyTracePrompt); - for(i=&yypParser->yystack[1]; i<=yypParser->yytos; i++){ - fprintf(yyTraceFILE,"%c%s", cDiv, yyTokenName[i->major]); - cDiv = ' '; - } - fprintf(yyTraceFILE,"]\n"); - } -#endif - return; -}