187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/*===- ScriptParser.yy ----------------------------------------------------===//
287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//
387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//                     The MCLinker Project
487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//
587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// This file is distributed under the University of Illinois Open Source
687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// License. See LICENSE.TXT for details.
787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//
887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//===----------------------------------------------------------------------===*/
987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
1087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%{
1187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* C/C++ Declarations */
1287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/Script/ScriptReader.h>
1387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/Script/ScriptScanner.h>
1487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/Script/Operand.h>
1587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/Script/Operator.h>
1687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/Script/Assignment.h>
1787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/Script/RpnExpr.h>
1887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/Script/FileToken.h>
1987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/Script/NameSpec.h>
2087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/Script/WildcardPattern.h>
2187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/Support/MsgHandling.h>
2287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesusing namespace mcld;
2387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
2487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#undef yylex
2587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#define yylex m_ScriptScanner.lex
2687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%}
2787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
2887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%code requires {
2987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/Script/StrToken.h>
3087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/Script/StringList.h>
3187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/Script/OutputSectDesc.h>
3287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/Script/InputSectDesc.h>
3387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <llvm/Support/DataTypes.h>
3487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
3587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesusing namespace mcld;
3687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
3787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines}
3887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
3987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%require "2.4"
4087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%skeleton "glr.cc"
413a2e300ddef8b046136a931d632c0671fa1c930fTim Murray/*
423a2e300ddef8b046136a931d632c0671fa1c930fTim Murray * BEGIN android-removed: prevent bison from generating the header in current directory
4387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%defines "ScriptParser.h"
443a2e300ddef8b046136a931d632c0671fa1c930fTim Murray * END android-removed
453a2e300ddef8b046136a931d632c0671fa1c930fTim Murray */
4687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%debug
4787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%error-verbose
4887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%define namespace "mcld"
4987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%define "parser_class_name" "ScriptParser"
5087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%parse-param { const class LinkerConfig& m_LDConfig }
5187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%parse-param { class ScriptFile& m_ScriptFile }
5287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%parse-param { class ScriptScanner& m_ScriptScanner }
5387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%parse-param { class GroupReader& m_GroupReader}
5487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%lex-param { const class ScriptFile& m_ScriptFile }
5587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
5687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%locations
5787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%initial-action
5887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines{
5987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /* Initialize the initial location. */
6087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  @$.begin.filename = @$.end.filename = &(m_ScriptFile.name());
6187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines}
6287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
6387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%start script_file
6487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
6587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%union {
6687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  const std::string* string;
6787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  uint64_t integer;
6887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  RpnExpr* rpn_expr;
6987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  StrToken* str_token;
7087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  StringList* str_tokens;
7187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  OutputSectDesc::Prolog output_prolog;
7287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  OutputSectDesc::Type output_type;
7387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  OutputSectDesc::Constraint output_constraint;
7487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  OutputSectDesc::Epilog output_epilog;
7587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  WildcardPattern* wildcard;
7687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  InputSectDesc::Spec input_spec;
7787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines}
7887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
7987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token END 0 /* EOF */
8087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token <string> STRING LNAMESPEC
8187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token <integer> INTEGER
8287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
8387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Initial states */
8487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token LINKER_SCRIPT DEFSYM VERSION_SCRIPT DYNAMIC_LIST
8587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
8687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Entry point */
8787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token ENTRY
8887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* File Commands */
8987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token INCLUDE
9087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token INPUT
9187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token GROUP
9287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token AS_NEEDED
9387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token OUTPUT
9487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token SEARCH_DIR
9587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token STARTUP
9687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Format Commands */
9787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token OUTPUT_FORMAT
9887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token TARGET
9987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Misc Commands */
10087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token ASSERT
10187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token EXTERN
10287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token FORCE_COMMON_ALLOCATION
10387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token INHIBIT_COMMON_ALLOCATION
10487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token INSERT
10587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token NOCROSSREFS
10687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token OUTPUT_ARCH
10787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token LD_FEATURE
10887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Assignments */
10987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token HIDDEN
11087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token PROVIDE
11187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token PROVIDE_HIDDEN
11287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* SECTIONS Command */
11387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token SECTIONS
11487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* MEMORY Command */
11587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token MEMORY
11687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* PHDRS Command */
11787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token PHDRS
11887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Builtin Functions */
11987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token ABSOLUTE
12087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token ADDR
12187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token ALIGN
12287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token ALIGNOF
12387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token BLOCK
12487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token DATA_SEGMENT_ALIGN
12587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token DATA_SEGMENT_END
12687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token DATA_SEGMENT_RELRO_END
12787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token DEFINED
12887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token LENGTH
12987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token LOADADDR
13087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token MAX
13187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token MIN
13287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token NEXT
13387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token ORIGIN
13487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token SEGMENT_START
13587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token SIZEOF
13687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token SIZEOF_HEADERS
13787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token CONSTANT
13887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Symbolic Constants */
13987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token MAXPAGESIZE
14087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token COMMONPAGESIZE
14187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Input Section Description */
14287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token EXCLUDE_FILE
14387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token COMMON
14487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token KEEP
14587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token SORT_BY_NAME
14687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token SORT_BY_ALIGNMENT
14787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token SORT_NONE
14887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token SORT_BY_INIT_PRIORITY
14987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Output Section Data */
15087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token BYTE
15187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token SHORT
15287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token LONG
15387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token QUAD
15487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token SQUAD
15587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token FILL
15687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Output Section Discarding */
15787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token DISCARD
15887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Output Section Keywords */
15987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token CREATE_OBJECT_SYMBOLS
16087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token CONSTRUCTORS
16187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Output Section Attributes */
16287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Output Section Type */
16387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token NOLOAD
16487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token DSECT
16587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token COPY
16687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token INFO
16787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token OVERLAY
16887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Output Section LMA */
16987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token AT
17087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Forced Input Alignment */
17187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token SUBALIGN
17287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Output Section Constraint */
17387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token ONLY_IF_RO
17487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token ONLY_IF_RW
17587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Operators are listed top to bottem, in ascending order */
17687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%left ','
17787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%right '=' ADD_ASSIGN SUB_ASSIGN MUL_ASSIGN DIV_ASSIGN AND_ASSIGN OR_ASSIGN LS_ASSIGN RS_ASSIGN
17887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%right '?' ':'
17987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%left LOGICAL_OR
18087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%left LOGICAL_AND
18187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%left '|'
18287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%left '^'
18387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%left '&'
18487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%left EQ NE
18587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%left '<' LE '>' GE
18687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%left LSHIFT RSHIFT
18787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%left '+' '-'
18887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%left '*' '/' '%'
18987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%right UNARY_PLUS UNARY_MINUS '!' '~'
19087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
19187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%type <integer> exp
19287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%type <string> string symbol opt_region opt_lma_region wildcard_pattern
19387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%type <rpn_expr> script_exp opt_lma opt_align opt_subalign opt_fill
19487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%type <str_token> input phdr
19587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%type <str_tokens> input_list opt_phdr opt_exclude_files input_sect_wildcard_patterns
19687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%type <output_prolog> output_desc_prolog opt_vma_and_type
19787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%type <output_type> opt_type type
19887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%type <output_constraint> opt_constraint
19987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%type <output_epilog> output_desc_epilog
20087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%type <wildcard> wildcard_file wildcard_section
20187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%type <input_spec> input_sect_spec
20287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
20387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%%
20487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
20587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesscript_file : LINKER_SCRIPT
20687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines              { m_ScriptScanner.setLexState(ScriptFile::LDScript); }
20787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines              linker_script
20887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines              { m_ScriptScanner.popLexState(); }
20987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines            ;
21087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
21187f34658dec9097d987d254a990ea7f311bfc95fStephen Hineslinker_script : linker_script script_command
21287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines              | /* Empty */
21387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines              ;
21487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
21587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesscript_command : entry_command
21687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               | output_format_command
21787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               | group_command
21887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               | output_command
21987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               | search_dir_command
22087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               | output_arch_command
22187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               | assert_command
22287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               | symbol_assignment
22387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               | sections_command
22487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               | ';'
22587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               ;
22687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
22787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesentry_command : ENTRY '(' STRING ')'
22887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                { m_ScriptFile.addEntryPoint(*$3); }
22987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines              ;
23087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
23187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesoutput_format_command : OUTPUT_FORMAT '(' STRING ')'
23287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                        { m_ScriptFile.addOutputFormatCmd(*$3); }
23387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                      | OUTPUT_FORMAT '(' STRING ',' STRING ',' STRING ')'
23487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                        { m_ScriptFile.addOutputFormatCmd(*$3, *$5, *$7); }
23587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                      ;
23687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
23787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesgroup_command : GROUP '(' input_list ')'
23887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                { m_ScriptFile.addGroupCmd(*$3, m_GroupReader, m_LDConfig); }
23987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines              ;
24087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
24187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinessearch_dir_command : SEARCH_DIR '(' STRING ')'
24287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                     { m_ScriptFile.addSearchDirCmd(*$3); }
24387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   ;
24487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
24587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesoutput_command : OUTPUT '(' STRING ')'
24687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 { m_ScriptFile.addOutputCmd(*$3); }
24787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               ;
24887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
24987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesoutput_arch_command : OUTPUT_ARCH '(' STRING ')'
25087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                      { m_ScriptFile.addOutputArchCmd(*$3); }
25187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    ;
25287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
25387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesassert_command : ASSERT '(' script_exp ',' string ')'
25487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 { m_ScriptFile.addAssertCmd(*$3, *$5); }
25587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               ;
25687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
25787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesinput_list : { m_ScriptFile.createStringList(); }
25887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines             inputs
25987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines             { $$ = m_ScriptFile.getCurrentStringList(); }
26087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines           ;
26187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
26287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesinputs : input
26387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         { m_ScriptFile.getCurrentStringList()->push_back($1); }
26487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines       | inputs input
26587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         { m_ScriptFile.getCurrentStringList()->push_back($2); }
26687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines       | inputs ',' input
26787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         { m_ScriptFile.getCurrentStringList()->push_back($3); }
26887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines       | AS_NEEDED '('
26987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         { m_ScriptFile.setAsNeeded(true); }
27087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         inputs ')'
27187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         { m_ScriptFile.setAsNeeded(false); }
27287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines       | inputs AS_NEEDED '('
27387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         { m_ScriptFile.setAsNeeded(true); }
27487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         inputs ')'
27587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         { m_ScriptFile.setAsNeeded(false); }
27687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines       | inputs ',' AS_NEEDED '('
27787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         { m_ScriptFile.setAsNeeded(true); }
27887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         inputs ')'
27987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         { m_ScriptFile.setAsNeeded(false); }
28087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines       ;
28187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
28287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesinput : string
28387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        { $$ = FileToken::create(*$1, m_ScriptFile.asNeeded()); }
28487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      | LNAMESPEC
28587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        { $$ = NameSpec::create(*$1, m_ScriptFile.asNeeded()); }
28687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      ;
28787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
28887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/*
28987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  SECTIONS
29087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  {
29187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    sections-command
29287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    sections-command
29387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    ...
29487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  }
29587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines*/
29687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinessections_command : SECTIONS
29787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   { m_ScriptFile.enterSectionsCmd(); }
29887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   '{' sect_commands '}'
29987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   { m_ScriptFile.leaveSectionsCmd(); }
30087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 ;
30187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
30287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinessect_commands : sect_commands sect_cmd
30387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines              | /* Empty */
30487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines              ;
30587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
30687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/*
30787f34658dec9097d987d254a990ea7f311bfc95fStephen HinesEach sections-command may of be one of the following:
30887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
30987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesan ENTRY command (see Entry command)
31087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesa symbol assignment (see Assignments)
31187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesan output section description
31287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesan overlay description
31387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines*/
31487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinessect_cmd : entry_command
31587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         | symbol_assignment
31687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         | output_sect_desc
31787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         ;
31887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
31987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/*
32087f34658dec9097d987d254a990ea7f311bfc95fStephen HinesThe full description of an output section looks like this:
32187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
32287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  section [address] [(type)] :
32387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    [AT(lma)]
32487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    [ALIGN(section_align)]
32587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    [SUBALIGN(subsection_align)]
32687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    [constraint]
32787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    {
32887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      output-section-command
32987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      output-section-command
33087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      ...
33187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    } [>region] [AT>lma_region] [:phdr :phdr ...] [=fillexp]
33287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines*/
33387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesoutput_sect_desc : string output_desc_prolog
33487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   { m_ScriptFile.enterOutputSectDesc(*$1, $2); }
33587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   '{'
33687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                       output_sect_commands
33787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   '}' output_desc_epilog
33887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   { m_ScriptFile.leaveOutputSectDesc($7); }
33987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 ;
34087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
34187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesoutput_desc_prolog : {
34287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                       m_ScriptScanner.setLexState(ScriptFile::Expression);
34387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                       /* create exp for vma */
34487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                       m_ScriptFile.createRpnExpr();
34587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                     }
34687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                     opt_vma_and_type
34787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                     { m_ScriptScanner.popLexState(); }
34887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                     ':'
34987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                     opt_lma opt_align opt_subalign opt_constraint
35087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                     {
35187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                       $$.m_pVMA       = $2.m_pVMA;
35287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                       $$.m_Type       = $2.m_Type;
35387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                       $$.m_pLMA       = $5;
35487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                       $$.m_pAlign     = $6;
35587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                       $$.m_pSubAlign  = $7;
35687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                       $$.m_Constraint = $8;
35787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                     }
35887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   ;
35987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
36087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesoutput_sect_commands : output_sect_commands output_sect_cmd
36187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                     | /* Empty */
36287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                     ;
36387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
36487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesoutput_desc_epilog : opt_region opt_lma_region opt_phdr opt_fill
36587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                     {
36687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                        $$.m_pRegion    = $1;
36787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                        $$.m_pLMARegion = $2;
36887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                        $$.m_pPhdrs     = $3;
36987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                        $$.m_pFillExp   = $4;
37087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                     }
37187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   ;
37287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
37387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Output Section Attributes */
37487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesopt_vma_and_type : exp opt_type
37587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   {
37687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                     $$.m_pVMA = m_ScriptFile.getCurrentRpnExpr();
37787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                     $$.m_Type = $2;
37887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   }
37987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 | opt_type
38087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   {
38187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                     $$.m_pVMA = NULL;
38287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                     $$.m_Type = $1;
38387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   }
38487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 ;
38587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
38687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesopt_type : '(' type ')'
38787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines           { $$ = $2; }
38887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         | '(' ')'
38987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines           { $$ = OutputSectDesc::LOAD; }
39087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         | /* Empty */
39187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines           { $$ = OutputSectDesc::LOAD; }
39287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         ;
39387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
39487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestype : NOLOAD
39587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines       { $$ = OutputSectDesc::NOLOAD; }
39687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines     | DSECT
39787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines       { $$ = OutputSectDesc::DSECT; }
39887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines     | COPY
39987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines       { $$ = OutputSectDesc::COPY; }
40087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines     | INFO
40187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines       { $$ = OutputSectDesc::INFO; }
40287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines     | OVERLAY
40387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines       { $$ = OutputSectDesc::OVERLAY; }
40487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines     ;
40587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
40687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesopt_lma : AT '(' script_exp ')'
40787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          { $$ = $3; }
40887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        | /* Empty */
40987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          { $$ = NULL; }
41087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        ;
41187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
41287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Forced Output Alignment */
41387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesopt_align : ALIGN '(' script_exp ')'
41487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines            { $$ = $3; }
41587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          | /* Empty */
41687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines            { $$ = NULL; }
41787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          ;
41887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
41987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Forced Input Alignment */
42087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesopt_subalign : SUBALIGN '(' script_exp ')'
42187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               { $$ = $3; }
42287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines             | /* Empty */
42387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               { $$ = NULL; }
42487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines             ;
42587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
42687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesopt_constraint : ONLY_IF_RO
42787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 { $$ = OutputSectDesc::ONLY_IF_RO; }
42887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               | ONLY_IF_RW
42987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 { $$ = OutputSectDesc::ONLY_IF_RW; }
43087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               | /* Empty */
43187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 { $$ = OutputSectDesc::NO_CONSTRAINT; }
43287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               ;
43387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
43487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesopt_region : '>' string
43587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines             { $$ = $2; }
43687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines           | /* Empty */
43787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines             { $$ = NULL; }
43887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines           ;
43987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
44087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesopt_lma_region : AT '>' string
44187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 { $$ = $3; }
44287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               | /* Empty */
44387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 { $$ = NULL; }
44487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               ;
44587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
44687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesopt_phdr : { m_ScriptFile.createStringList(); }
44787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines           phdrs
44887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines           { $$ = m_ScriptFile.getCurrentStringList(); }
44987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         ;
45087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
45187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesphdrs : phdrs ':' phdr
45287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        { m_ScriptFile.getCurrentStringList()->push_back($3); }
45387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      | /* Empty */
45487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      ;
45587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
45687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesphdr : string
45787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines       { $$ = StrToken::create(*$1); }
45887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines     ;
45987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
46087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesopt_fill : '=' script_exp
46187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines           { $$ = $2; }
46287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         | /* Empty */
46387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines           { $$ = NULL; }
46487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         ;
46587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
46687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/*
46787f34658dec9097d987d254a990ea7f311bfc95fStephen HinesEach output-section-command may be one of the following:
46887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
46987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesa symbol assignment (see Assignments)
47087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesan input section description (see Input Section)
47187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesdata values to include directly (see Output Section Data)
47287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesa special output section keyword (see Output Section Keywords)
47387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines*/
47487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesoutput_sect_cmd : symbol_assignment
47587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                | input_sect_desc
47687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                | output_sect_data
47787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                | output_sect_keyword
47887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                | ';'
47987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                ;
48087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
48187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesinput_sect_desc : input_sect_spec
48287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  { m_ScriptFile.addInputSectDesc(InputSectDesc::NoKeep, $1); }
48387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                | KEEP '(' input_sect_spec ')'
48487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  { m_ScriptFile.addInputSectDesc(InputSectDesc::Keep, $3); }
48587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                ;
48687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
48787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesinput_sect_spec : string
48887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  {
48987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    $$.m_pWildcardFile =
49087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                      WildcardPattern::create(*$1, WildcardPattern::SORT_NONE);
49187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    $$.m_pExcludeFiles = NULL;
49287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    $$.m_pWildcardSections = NULL;
49387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  }
49487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                | wildcard_file '(' opt_exclude_files input_sect_wildcard_patterns ')'
49587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  {
49687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    $$.m_pWildcardFile = $1;
49787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    $$.m_pExcludeFiles = $3;
49887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    $$.m_pWildcardSections = $4;
49987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  }
50087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                ;
50187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
50287f34658dec9097d987d254a990ea7f311bfc95fStephen Hineswildcard_file : wildcard_pattern
50387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                { $$ = WildcardPattern::create(*$1, WildcardPattern::SORT_NONE); }
50487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines              | SORT_BY_NAME '(' wildcard_pattern ')'
50587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                { $$ = WildcardPattern::create(*$3, WildcardPattern::SORT_BY_NAME); }
50687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines              ;
50787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
50887f34658dec9097d987d254a990ea7f311bfc95fStephen Hineswildcard_pattern : string
50987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   { $$ = $1; }
51087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 | '*'
51187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   { $$ = &m_ScriptFile.createParserStr("*", 1); }
51287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 | '?'
51387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   { $$ = &m_ScriptFile.createParserStr("?", 1); }
51487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 ;
51587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
51687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesopt_exclude_files : EXCLUDE_FILE '('
51787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    { m_ScriptFile.createStringList(); }
51887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    exclude_files ')'
51987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    { $$ = m_ScriptFile.getCurrentStringList(); }
52087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  | /* Empty */
52187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    { $$ = NULL; }
52287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  ;
52387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
52487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesexclude_files : exclude_files wildcard_pattern
52587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                {
52687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  m_ScriptFile.getCurrentStringList()->push_back(
52787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    WildcardPattern::create(*$2, WildcardPattern::SORT_NONE));
52887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                }
52987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines              | wildcard_pattern
53087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                {
53187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  m_ScriptFile.getCurrentStringList()->push_back(
53287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    WildcardPattern::create(*$1, WildcardPattern::SORT_NONE));
53387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                }
53487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines              ;
53587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
53687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesinput_sect_wildcard_patterns : { m_ScriptFile.createStringList(); }
53787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                               wildcard_sections
53887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                               { $$ = m_ScriptFile.getCurrentStringList(); }
53987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                             ;
54087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
54187f34658dec9097d987d254a990ea7f311bfc95fStephen Hineswildcard_sections : wildcard_sections wildcard_section
54287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    {
54387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                      m_ScriptFile.getCurrentStringList()->push_back($2);
54487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    }
54587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  | wildcard_section
54687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    {
54787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                      m_ScriptFile.getCurrentStringList()->push_back($1);
54887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    }
54987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  ;
55087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
55187f34658dec9097d987d254a990ea7f311bfc95fStephen Hineswildcard_section : wildcard_pattern
55287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   { $$ = WildcardPattern::create(*$1, WildcardPattern::SORT_NONE); }
55387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 | SORT_NONE '(' wildcard_pattern ')'
55487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   { $$ = WildcardPattern::create(*$3, WildcardPattern::SORT_NONE); }
55587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 | SORT_BY_NAME '(' wildcard_pattern ')'
55687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   { $$ = WildcardPattern::create(*$3, WildcardPattern::SORT_BY_NAME); }
55787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 | SORT_BY_ALIGNMENT '(' wildcard_pattern ')'
55887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   { $$ = WildcardPattern::create(*$3, WildcardPattern::SORT_BY_ALIGNMENT); }
55987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 | SORT_BY_NAME '(' SORT_BY_ALIGNMENT '(' wildcard_pattern ')' ')'
56087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   { $$ = WildcardPattern::create(*$5, WildcardPattern::SORT_BY_NAME_ALIGNMENT); }
56187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 | SORT_BY_ALIGNMENT '('SORT_BY_NAME '(' wildcard_pattern ')' ')'
56287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   { $$ = WildcardPattern::create(*$5, WildcardPattern::SORT_BY_ALIGNMENT_NAME); }
56387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 | SORT_BY_NAME '(' SORT_BY_NAME '(' wildcard_pattern ')' ')'
56487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   { $$ = WildcardPattern::create(*$5, WildcardPattern::SORT_BY_NAME); }
56587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 | SORT_BY_ALIGNMENT '(' SORT_BY_ALIGNMENT '(' wildcard_pattern ')' ')'
56687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   { $$ = WildcardPattern::create(*$5, WildcardPattern::SORT_BY_ALIGNMENT); }
56787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 | SORT_BY_INIT_PRIORITY '(' wildcard_pattern ')'
56887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   { $$ = WildcardPattern::create(*$3, WildcardPattern::SORT_BY_INIT_PRIORITY); }
56987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 ;
57087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
57187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesoutput_sect_data : BYTE  '(' script_exp ')'
57287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 | SHORT '(' script_exp ')'
57387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 | LONG  '(' script_exp ')'
57487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 | QUAD  '(' script_exp ')'
57587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 | SQUAD '(' script_exp ')'
57687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 ;
57787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
57887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesoutput_sect_keyword : CREATE_OBJECT_SYMBOLS
57987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    | CONSTRUCTORS
58087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    | SORT_BY_NAME '(' CONSTRUCTORS ')'
58187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    ;
58287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
58387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinessymbol_assignment : symbol '=' script_exp ';'
58487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    { m_ScriptFile.addAssignment(*$1, *$3); }
58587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  | symbol ADD_ASSIGN exp ';'
58687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  | symbol SUB_ASSIGN exp ';'
58787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  | symbol MUL_ASSIGN exp ';'
58887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  | symbol DIV_ASSIGN exp ';'
58987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  | symbol AND_ASSIGN exp ';'
59087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  | symbol OR_ASSIGN exp ';'
59187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  | symbol LS_ASSIGN exp ';'
59287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  | symbol RS_ASSIGN exp ';'
59387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  | HIDDEN '(' symbol '=' script_exp ')' ';'
59487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    {
59587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                      m_ScriptFile.addAssignment(*$3, *$5,
59687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                                 Assignment::HIDDEN);
59787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    }
59887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  | PROVIDE '(' symbol '=' script_exp ')' ';'
59987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    {
60087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                      m_ScriptFile.addAssignment(*$3, *$5,
60187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                                 Assignment::PROVIDE);
60287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    }
60387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  | PROVIDE_HIDDEN '(' symbol '=' script_exp ')' ';'
60487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    {
60587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                      m_ScriptFile.addAssignment(*$3, *$5,
60687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                                 Assignment::PROVIDE_HIDDEN);
60787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    }
60887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  ;
60987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
61087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesscript_exp : {
61187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               m_ScriptScanner.setLexState(ScriptFile::Expression);
61287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               m_ScriptFile.createRpnExpr();
61387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines             }
61487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines             exp
61587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines             {
61687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               m_ScriptScanner.popLexState();
61787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               $$ = m_ScriptFile.getCurrentRpnExpr();
61887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines             }
61987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines           ;
62087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
62187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesexp : '(' exp ')'
62287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
62387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $2;
62487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
62587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | '+' exp %prec UNARY_PLUS
62687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
62787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
62887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::UNARY_PLUS>());
62987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $2 + 1;
63087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
63187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | '-' exp %prec UNARY_MINUS
63287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
63387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
63487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::UNARY_MINUS>());
63587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $2 + 1;
63687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
63787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | '!' exp
63887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
63987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
64087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::LOGICAL_NOT>());
64187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $2 + 1;
64287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
64387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | '~' exp
64487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
64587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
64687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::BITWISE_NOT>());
64787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $2 + 1;
64887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
64987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp '*' exp
65087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
65187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
65287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::MUL>());
65387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + 1;
65487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
65587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp '/' exp
65687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
65787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
65887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::DIV>());
65987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + 1;
66087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
66187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp '%' exp
66287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
66387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
66487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::MOD>());
66587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + 1;
66687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
66787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp '+' exp
66887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
66987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
67087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::ADD>());
67187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + 1;
67287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
67387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp '-' exp
67487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
67587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
67687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::SUB>());
67787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + 1;
67887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
67987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp LSHIFT exp
68087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
68187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
68287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::LSHIFT>());
68387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + 1;
68487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
68587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp RSHIFT exp
68687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
68787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
68887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::RSHIFT>());
68987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + 1;
69087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
69187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp '<' exp
69287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
69387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
69487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::LT>());
69587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + 1;
69687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
69787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp LE exp
69887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
69987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
70087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::LE>());
70187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + 1;
70287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
70387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp '>' exp
70487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
70587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
70687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::GT>());
70787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + 1;
70887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
70987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp GE exp
71087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
71187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
71287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::GE>());
71387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + 1;
71487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
71587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp EQ exp
71687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
71787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
71887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::EQ>());
71987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + 1;
72087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
72187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp NE exp
72287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
72387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
72487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::NE>());
72587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + 1;
72687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
72787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp '&' exp
72887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
72987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
73087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::BITWISE_AND>());
73187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + 1;
73287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
73387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp '^' exp
73487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
73587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
73687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::BITWISE_XOR>());
73787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + 1;
73887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
73987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp '|' exp
74087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
74187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
74287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::BITWISE_OR>());
74387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + 1;
74487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
74587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp LOGICAL_AND exp
74687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
74787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
74887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::LOGICAL_AND>());
74987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + 1;
75087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
75187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp LOGICAL_OR exp
75287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
75387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
75487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::LOGICAL_OR>());
75587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + 1;
75687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
75787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp '?' exp ':' exp
75887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
75987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
76087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::TERNARY_IF>());
76187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + $5 + 1;
76287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
76387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | ABSOLUTE '(' exp ')'
76487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
76587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
76687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::ABSOLUTE>());
76787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $3 + 1;
76887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
76987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | ADDR '(' string ')'
77087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
77187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(SectOperand::create(*$3));
77287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
77387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::ADDR>());
77487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = 2;
77587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
77687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | ALIGN '(' exp ')'
77787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
77887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        RpnExpr::iterator pos = m_ScriptFile.getCurrentRpnExpr()->begin() +
77987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                m_ScriptFile.getCurrentRpnExpr()->size() - $3;
78087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->insert(pos, SymOperand::create("."));
78187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
78287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::ALIGN>());
78387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $3 + 2;
78487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
78587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | ALIGN '(' exp ',' exp ')'
78687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
78787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
78887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::ALIGN>());
78987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $3 + $5 + 1;
79087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
79187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | ALIGNOF '(' string ')'
79287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
79387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(SectOperand::create(*$3));
79487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
79587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::ALIGNOF>());
79687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = 2;
79787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
79887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | BLOCK '(' exp ')'
79987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
80087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        RpnExpr::iterator pos = m_ScriptFile.getCurrentRpnExpr()->begin() +
80187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                m_ScriptFile.getCurrentRpnExpr()->size() - $3;
80287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->insert(pos, SymOperand::create("."));
80387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
80487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::ALIGN>());
80587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $3 + 2;
80687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
80787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | DATA_SEGMENT_ALIGN
80887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
80987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(SymOperand::create("."));
81087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
81187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      '(' exp ',' exp ')'
81287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
81387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
81487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::DATA_SEGMENT_ALIGN>());
81587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $4 + $6 + 2;
81687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
81787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | DATA_SEGMENT_END '(' exp ')'
81887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
81987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
82087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::DATA_SEGMENT_END>());
82187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $3 + 1;
82287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
82387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | DATA_SEGMENT_RELRO_END '(' exp ',' exp ')'
82487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
82587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
82687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::DATA_SEGMENT_RELRO_END>());
82787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $3 + $5 + 1;
82887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
82987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | DEFINED '(' symbol ')'
83087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
83187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(SymOperand::create(*$3));
83287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
83387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::DEFINED>());
83487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = 2;
83587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
83687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | LENGTH '(' string ')'
83787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
83887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        /* TODO */
83987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
84087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | LOADADDR '(' string ')'
84187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
84287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(SectOperand::create(*$3));
84387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
84487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::LOADADDR>());
84587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = 2;
84687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
84787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | MAX '(' exp ',' exp ')'
84887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
84987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
85087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::MAX>());
85187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $3 + $5 + 1;
85287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
85387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | MIN '(' exp ',' exp ')'
85487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
85587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
85687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::MIN>());
85787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $3 + $5 + 1;
85887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
85987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | NEXT '(' exp ')'
86087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
86187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
86287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::NEXT>());
86387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $3 + 1;
86487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
86587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | ORIGIN '(' string ')'
86687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
86787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        /* TODO */
86887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
86987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | SEGMENT_START '(' string
87087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
87187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(SectOperand::create(*$3));
87287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
87387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      ',' exp ')'
87487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
87587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
87687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::SEGMENT_START>());
87787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $6 + 2;
87887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
87987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | SIZEOF '(' string ')'
88087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
88187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(SectOperand::create(*$3));
88287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
88387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::SIZEOF>());
88487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = 2;
88587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
88687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | SIZEOF_HEADERS
88787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
88887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
88987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::SIZEOF_HEADERS>());
89087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = 1;
89187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
89287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | CONSTANT '(' MAXPAGESIZE ')'
89387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
89487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
89587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::MAXPAGESIZE>());
89687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = 1;
89787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
89887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | CONSTANT '(' COMMONPAGESIZE')'
89987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
90087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
90187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::COMMONPAGESIZE>());
90287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = 1;
90387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
90487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | INTEGER
90587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
90687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(IntOperand::create($1));
90787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = 1;
90887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
90987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | symbol
91087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
91187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(SymOperand::create(*$1));
91287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = 1;
91387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
91487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    ;
91587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
91687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinessymbol : STRING
91787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         { $$ = $1; }
91887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines       ;
91987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
92087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesstring : STRING
92187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         { $$ = $1; }
92287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines       | '"' STRING '"'
92387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         { $$ = $2; }
92487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines       ;
92587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
92687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%%
92787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
92887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesvoid mcld::ScriptParser::error(const mcld::ScriptParser::location_type& pLoc,
92987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                               const std::string &pMsg)
93087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines{
93187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  position last = pLoc.end - 1;
93287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  std::string filename = "NaN";
93387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  if (last.filename != NULL)
93487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    filename = *last.filename;
93587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
93687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  mcld::error(diag::err_syntax_error)
93787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    << filename << last.line << last.column << pMsg;
93887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines}
93987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
940