// This file is based on ld/ldgram.y and ld/ldlex.l from the binutils-gdb git repository. Original license header: /* A YACC grammar to parse a superset of the AT&T linker scripting language. Copyright (C) 1991-2016 Free Software Foundation, Inc. Written by Steve Chamberlain of Cygnus Support (steve@cygnus.com). This file is part of the GNU Binutils. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ lexer grammar GnuLdLexer; //%token LBRACE : '{'; RBRACE : '}'; // // assign_op atype attributes_opt sect_constraint opt_align_with_input // filename //%type vers_defns //%type vers_tag //%type verdep ABSOLUTE : 'ABSOLUTE'; ADDR : 'ADDR'; AFTER : 'AFTER'; ALIAS : 'ALIAS'; //ALIGN : 'ALIGN'; ALIGN_K : 'ALIGN'; ALIGNMOD : 'ALIGNMOD'; ALIGNOF : 'ALIGNOF'; ALIGN_WITH_INPUT : 'ALIGN_WITH_INPUT'; AS_NEEDED : 'AS_NEEDED'; ASSERT : 'ASSERT'; AT : 'AT'; BASE : 'BASE'; BEFORE : 'BEFORE'; BIND : 'BIND'; BLOCK : 'BLOCK'; BYTE : 'BYTE'; CASE : 'CASE'; CHIP : 'CHIP'; CONSTANT : 'CONSTANT'; CONSTRUCTORS : 'CONSTRUCTORS'; COPY : 'COPY'; CREATE_OBJECT_SYMBOLS : 'CREATE_OBJECT_SYMBOLS'; DATA_SEGMENT_ALIGN : 'DATA_SEGMENT_ALIGN'; DATA_SEGMENT : 'DATA_SEGMENT'; DATA_SEGMENT_END : 'DATA_SEGMENT_END'; DATA_SEGMENT_RELRO_END : 'DATA_SEGMENT_RELRO_END'; DEFINED : 'DEFINED'; DEFSYMEND : 'DEFSYMEND'; DSECT : 'DSECT'; ENDWORD : 'ENDWORD'; ENTRY : 'ENTRY'; EXCLUDE_FILE : 'EXCLUDE_FILE'; EXTERN : 'EXTERN'; FILL : 'FILL'; FLOAT : 'FLOAT'; FORCE_COMMON_ALLOCATION : 'FORCE_COMMON_ALLOCATION'; FORMAT : 'FORMAT'; GLOBAL : 'GLOBAL'; GROUP : 'GROUP'; HIDDEN_ : 'HIDDEN'; HLL : 'HLL'; INCLUDE : 'INCLUDE'; INFO : 'INFO'; INHIBIT_COMMON_ALLOCATION : 'INHIBIT_COMMON_ALLOCATION'; //INPUT_DEFSYM : 'INPUT_DEFSYM'; //INPUT_DYNAMIC_LIST : 'INPUT_DYNAMIC_LIST'; INPUT : 'INPUT'; //INPUT_MRI_SCRIPT : 'INPUT_MRI_SCRIPT'; //INPUT_SCRIPT : 'INPUT_SCRIPT'; //INPUT_SECTION_FLAGS : 'INPUT_SECTION_FLAGS'; //INPUT_VERSION_SCRIPT : 'INPUT_VERSION_SCRIPT'; INSERT_K : 'INSERT'; KEEP : 'KEEP'; LD_FEATURE : 'LD_FEATURE'; LENGTH : 'LENGTH'; LIST : 'LIST'; LOADADDR : 'LOADADDR'; LOAD : 'LOAD'; LOCAL : 'LOCAL'; LOG2CEIL : 'LOG2CEIL'; LONG : 'LONG'; MAP : 'MAP'; MAX_K : 'MAX'; MEMORY : 'MEMORY'; MIN_K : 'MIN'; NAMEWORD : 'NAMEWORD'; NEWLINE : 'NEWLINE'; NEXT : 'NEXT'; NOCROSSREFS : 'NOCROSSREFS'; NOCROSSREFS_TO : 'NOCROSSREFS_TO'; NOFLOAT : 'NOFLOAT'; NOLOAD : 'NOLOAD'; ONLY_IF_RO : 'ONLY_IF_RO'; ONLY_IF_RW : 'ONLY_IF_RW'; ORDER : 'ORDER'; ORIGIN : 'ORIGIN'; // TODO: or 'org' or 'o'. OUTPUT_ARCH : 'OUTPUT_ARCH'; OUTPUT_FORMAT : 'OUTPUT_FORMAT'; OUTPUT : 'OUTPUT'; OVERLAY : 'OVERLAY'; PHDRS : 'PHDRS'; PROVIDE_HIDDEN : 'PROVIDE_HIDDEN'; PROVIDE : 'PROVIDE'; PUBLIC : 'PUBLIC'; QUAD : 'QUAD'; REGION_ALIAS : 'REGION_ALIAS'; REL : 'REL'; SEARCH_DIR : 'SEARCH_DIR'; SECTIONS : 'SECTIONS'; SECT : 'SECT'; SEGMENT_START : 'SEGMENT_START'; SHORT : 'SHORT'; SIZEOF_HEADERS : 'SIZEOF_HEADERS'; SIZEOF : 'SIZEOF'; SORT_BY_ALIGNMENT : 'SORT_BY_ALIGNMENT'; SORT_BY_INIT_PRIORITY : 'SORT_BY_INIT_PRIORITY'; SORT : 'SORT'; SORT_BY_NAME : 'SORT_BY_NAME'; SORT_NONE : 'SORT_NONE'; SPECIAL : 'SPECIAL'; SQUAD : 'SQUAD'; START : 'START'; STARTUP : 'STARTUP'; SUBALIGN : 'SUBALIGN'; SYSLIB : 'SYSLIB'; TARGET_K : 'TARGET'; TRUNCATE : 'TRUNCATE'; VERS_IDENTIFIER : 'VERS_IDENTIFIER'; VERSIONK : 'VERSIONK'; VERS_TAG : 'VERS_TAG'; QUOTE : '"' -> skip, pushMode(STRING); NAME : [*\._a-zA-Z][*\-\.\/_a-zA-Z0-9]* | '/DISCARD/'; // TODO: ld supports some really fancy expressions here, like "0101010b", "ffH", "ffx", "$Aa" etc //INT : '0x' [0-9a-fA-F]+ // | [0-9]+; INT : INT_NUMBER INT_SIZE?; fragment INT_NUMBER : INT_HEX | INT_DECIMAL; fragment INT_HEX : '0' ('X' | 'x') [0-9a-fA-F]+; fragment INT_DECIMAL : [0-9]+; fragment INT_SIZE : 'M' | 'm' | 'K' | 'k'; END : 'END'; LNAME : '-l' NAME; PLUSEQ : '+='; MINUSEQ : '-='; MULTEQ : '*='; DIVEQ : '/='; LSHIFTEQ : '<<='; RSHIFTEQ : '>>='; ANDEQ : '&='; OREQ : '|='; LSHIFT : '<<'; RSHIFT : '>>'; EQEQ : '=='; EQ : '='; NE : '!='; LE : '<='; GE : '>='; ANDAND : '&&'; OROR : '||'; // Extra tokens COLON : ':'; EXLAMATION : '!'; DASH : '-'; PLUS : '+'; TILDE : '~'; SLASH : '/'; MOD : '%'; LT : '<'; GT : '>'; HAT : '^'; BAR : '|'; COMMA : ','; SEMICOLON : ';'; LPAREN : '('; RPAREN : ')'; STAR : '*'; QUESTION : '?'; AMPERSAND : '&'; LBRACKET : '['; RBRACKET : ']'; BlockComment : '/*' .*? '*/' -> skip ; WS : [ \t\r\n]+ -> skip ; mode STRING; STRING_ANY : ~'"'+; STRING_END_QUOTE : '"' -> skip, popMode;