1 2 %{ 3 /****************************************************************************** 4 * 5 * Module Name: aslcompiler.l - Flex input file 6 * 7 *****************************************************************************/ 8 9 /* 10 * Copyright (C) 2000 - 2011, Intel Corp. 11 * All rights reserved. 12 * 13 * Redistribution and use in source and binary forms, with or without 14 * modification, are permitted provided that the following conditions 15 * are met: 16 * 1. Redistributions of source code must retain the above copyright 17 * notice, this list of conditions, and the following disclaimer, 18 * without modification. 19 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 20 * substantially similar to the "NO WARRANTY" disclaimer below 21 * ("Disclaimer") and any redistribution must be conditioned upon 22 * including a substantially similar Disclaimer requirement for further 23 * binary redistribution. 24 * 3. Neither the names of the above-listed copyright holders nor the names 25 * of any contributors may be used to endorse or promote products derived 26 * from this software without specific prior written permission. 27 * 28 * Alternatively, this software may be distributed under the terms of the 29 * GNU General Public License ("GPL") version 2 as published by the Free 30 * Software Foundation. 31 * 32 * NO WARRANTY 33 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 34 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 35 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 36 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 37 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 38 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 39 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 40 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 41 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 42 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 43 * POSSIBILITY OF SUCH DAMAGES. 44 */ 45 46 #include <contrib/dev/acpica/compiler/aslcompiler.h> 47 #include "aslcompiler.y.h" 48 49 #include <stdlib.h> 50 #include <string.h> 51 YYSTYPE AslCompilerlval; 52 53 /* 54 * Generation: Use the following command line: 55 * 56 * flex.exe -PAslCompiler -i -o$(InputPath).c $(InputPath) 57 * 58 * -i: Scanner must be case-insensitive 59 */ 60 61 #define _COMPONENT ACPI_COMPILER 62 ACPI_MODULE_NAME ("aslscan") 63 char 64 comment (void); 65 char 66 comment2 (void); 67 void 68 count (int type); 69 char 70 literal (void); 71 void 72 copy (void); 73 74 /*! [Begin] no source code translation */ 75 76 %} 77 78 79 LeadNameChar [A-Za-z_] 80 DigitChar [0-9] 81 HexDigitChar [A-Fa-f0-9] 82 RootChar [\\] 83 Nothing [] 84 85 NameChar [A-Za-z_0-9] 86 NameSeg1 {LeadNameChar}{NameChar} 87 NameSeg2 {LeadNameChar}{NameChar}{NameChar} 88 NameSeg3 {LeadNameChar}{NameChar}{NameChar}{NameChar} 89 NameSeg {LeadNameChar}|{NameSeg1}|{NameSeg2}|{NameSeg3} 90 91 NameString {RootChar}|{RootChar}{NamePath}|[\^]+{NamePath}|{NonEmptyNamePath} 92 NamePath {NonEmptyNamePath}? 93 NonEmptyNamePath {NameSeg}{NamePathTail}* 94 NamePathTail [.]{NameSeg} 95 96 %% 97 98 [ ] { count (0); } 99 [\n] { count (0); } /* Handle files with both LF and CR/LF */ 100 [\r] { count (0); } /* termination on both Unix and Windows */ 101 [ \t] { count (0); } 102 103 104 "/*" { if (!comment ()) yyterminate (); } 105 "//" { if (!comment2 ()) yyterminate (); } 106 107 "\"" { if (literal ()) return (PARSEOP_STRING_LITERAL); else yyterminate (); } 108 109 110 0[xX]{HexDigitChar}+ | 111 {DigitChar}+ { AslCompilerlval.i = UtDoConstant ((char *) AslCompilertext); 112 count (1); return (PARSEOP_INTEGER); } 113 114 "Include" { count (1); return (PARSEOP_INCLUDE); } 115 "#include" { count (1); return (PARSEOP_INCLUDE_CSTYLE); } 116 "#line" { count (1); return (PARSEOP_LINE_CSTYLE); } 117 "External" { count (1); return (PARSEOP_EXTERNAL); } 118 119 120 "Ones" { count (1); return (PARSEOP_ONES); } 121 "One" { count (1); return (PARSEOP_ONE); } 122 "Zero" { count (1); return (PARSEOP_ZERO); } 123 "Revision" { count (1); return (PARSEOP_REVISION); } 124 125 "Offset" { count (1); return (PARSEOP_OFFSET); } 126 "AccessAs" { count (1); return (PARSEOP_ACCESSAS); } 127 "BankField" { count (2); return (PARSEOP_BANKFIELD); } 128 "CreateBitField" { count (2); return (PARSEOP_CREATEBITFIELD); } 129 "CreateByteField" { count (2); return (PARSEOP_CREATEBYTEFIELD); } 130 "CreateDWordField" { count (2); return (PARSEOP_CREATEDWORDFIELD); } 131 "CreateField" { count (2); return (PARSEOP_CREATEFIELD); } 132 "CreateQWordField" { count (2); return (PARSEOP_CREATEQWORDFIELD); } 133 "CreateWordField" { count (2); return (PARSEOP_CREATEWORDFIELD); } 134 "DataTableRegion" { count (2); return (PARSEOP_DATATABLEREGION); } 135 "Device" { count (2); return (PARSEOP_DEVICE); } 136 "Event" { count (2); return (PARSEOP_EVENT); } 137 "Field" { count (2); return (PARSEOP_FIELD); } 138 "Function" { count (2); return (PARSEOP_FUNCTION); } 139 "IndexField" { count (2); return (PARSEOP_INDEXFIELD); } 140 "Method" { count (2); return (PARSEOP_METHOD); } 141 "Mutex" { count (2); return (PARSEOP_MUTEX); } 142 "OperationRegion" { count (2); return (PARSEOP_OPERATIONREGION); } 143 "PowerResource" { count (2); return (PARSEOP_POWERRESOURCE); } 144 "Processor" { count (2); return (PARSEOP_PROCESSOR); } 145 "ThermalZone" { count (2); return (PARSEOP_THERMALZONE); } 146 "Alias" { count (2); return (PARSEOP_ALIAS); } 147 "Name" { count (2); return (PARSEOP_NAME); } 148 "Scope" { count (2); return (PARSEOP_SCOPE); } 149 "Break" { count (3); return (PARSEOP_BREAK); } 150 "BreakPoint" { count (3); return (PARSEOP_BREAKPOINT); } 151 "Continue" { count (3); return (PARSEOP_CONTINUE); } 152 "Fatal" { count (3); return (PARSEOP_FATAL); } 153 "If" { count (3); return (PARSEOP_IF); } 154 "Else" { count (3); return (PARSEOP_ELSE); } 155 "ElseIf" { count (3); return (PARSEOP_ELSEIF); } 156 "Load" { count (3); return (PARSEOP_LOAD); } 157 "Noop" { count (3); return (PARSEOP_NOOP); } 158 "Notify" { count (3); return (PARSEOP_NOTIFY); } 159 "Release" { count (3); return (PARSEOP_RELEASE); } 160 "Reset" { count (3); return (PARSEOP_RESET); } 161 "Return" { count (3); return (PARSEOP_RETURN); } 162 "Signal" { count (3); return (PARSEOP_SIGNAL); } 163 "Sleep" { count (3); return (PARSEOP_SLEEP); } 164 "Stall" { count (3); return (PARSEOP_STALL); } 165 "Switch" { count (3); return (PARSEOP_SWITCH); } 166 "Case" { count (3); return (PARSEOP_CASE); } 167 "Default" { count (3); return (PARSEOP_DEFAULT); } 168 "Unload" { count (3); return (PARSEOP_UNLOAD); } 169 "While" { count (3); return (PARSEOP_WHILE); } 170 171 "Acquire" { count (3); return (PARSEOP_ACQUIRE); } 172 "Add" { count (3); return (PARSEOP_ADD); } 173 "And" { count (3); return (PARSEOP_AND); } 174 "Concatenate" { count (3); return (PARSEOP_CONCATENATE); } 175 "ConcatenateResTemplate" { count (3); return (PARSEOP_CONCATENATERESTEMPLATE); } 176 "CondRefOf" { count (3); return (PARSEOP_CONDREFOF); } 177 "CopyObject" { count (3); return (PARSEOP_COPYOBJECT); } 178 "Decrement" { count (3); return (PARSEOP_DECREMENT); } 179 "DeRefOf" { count (3); return (PARSEOP_DEREFOF); } 180 "Divide" { count (3); return (PARSEOP_DIVIDE); } 181 "FindSetLeftBit" { count (3); return (PARSEOP_FINDSETLEFTBIT); } 182 "FindSetRightBit" { count (3); return (PARSEOP_FINDSETRIGHTBIT); } 183 "FromBCD" { count (3); return (PARSEOP_FROMBCD); } 184 "Increment" { count (3); return (PARSEOP_INCREMENT); } 185 "Index" { count (3); return (PARSEOP_INDEX); } 186 "LAnd" { count (3); return (PARSEOP_LAND); } 187 "LEqual" { count (3); return (PARSEOP_LEQUAL); } 188 "LGreater" { count (3); return (PARSEOP_LGREATER); } 189 "LGreaterEqual" { count (3); return (PARSEOP_LGREATEREQUAL); } 190 "LLess" { count (3); return (PARSEOP_LLESS); } 191 "LLessEqual" { count (3); return (PARSEOP_LLESSEQUAL); } 192 "LNot" { count (3); return (PARSEOP_LNOT); } 193 "LNotEqual" { count (3); return (PARSEOP_LNOTEQUAL); } 194 "LoadTable" { count (3); return (PARSEOP_LOADTABLE); } 195 "LOr" { count (3); return (PARSEOP_LOR); } 196 "Match" { count (3); return (PARSEOP_MATCH); } 197 "Mid" { count (3); return (PARSEOP_MID); } 198 "Mod" { count (3); return (PARSEOP_MOD); } 199 "Multiply" { count (3); return (PARSEOP_MULTIPLY); } 200 "NAnd" { count (3); return (PARSEOP_NAND); } 201 "NOr" { count (3); return (PARSEOP_NOR); } 202 "Not" { count (3); return (PARSEOP_NOT); } 203 "ObjectType" { count (3); return (PARSEOP_OBJECTTYPE); } 204 "Or" { count (3); return (PARSEOP_OR); } 205 "RefOf" { count (3); return (PARSEOP_REFOF); } 206 "ShiftLeft" { count (3); return (PARSEOP_SHIFTLEFT); } 207 "ShiftRight" { count (3); return (PARSEOP_SHIFTRIGHT); } 208 "SizeOf" { count (3); return (PARSEOP_SIZEOF); } 209 "Store" { count (3); return (PARSEOP_STORE); } 210 "Subtract" { count (3); return (PARSEOP_SUBTRACT); } 211 "Timer" { count (3); return (PARSEOP_TIMER); } 212 "ToBCD" { count (3); return (PARSEOP_TOBCD); } 213 "ToBuffer" { count (3); return (PARSEOP_TOBUFFER); } 214 "ToDecimalString" { count (3); return (PARSEOP_TODECIMALSTRING); } 215 "ToHexString" { count (3); return (PARSEOP_TOHEXSTRING); } 216 "ToInteger" { count (3); return (PARSEOP_TOINTEGER); } 217 "ToString" { count (3); return (PARSEOP_TOSTRING); } 218 "Wait" { count (3); return (PARSEOP_WAIT); } 219 "XOr" { count (3); return (PARSEOP_XOR); } 220 221 "Arg0" { count (1); return (PARSEOP_ARG0); } 222 "Arg1" { count (1); return (PARSEOP_ARG1); } 223 "Arg2" { count (1); return (PARSEOP_ARG2); } 224 "Arg3" { count (1); return (PARSEOP_ARG3); } 225 "Arg4" { count (1); return (PARSEOP_ARG4); } 226 "Arg5" { count (1); return (PARSEOP_ARG5); } 227 "Arg6" { count (1); return (PARSEOP_ARG6); } 228 229 "Local0" { count (1); return (PARSEOP_LOCAL0); } 230 "Local1" { count (1); return (PARSEOP_LOCAL1); } 231 "Local2" { count (1); return (PARSEOP_LOCAL2); } 232 "Local3" { count (1); return (PARSEOP_LOCAL3); } 233 "Local4" { count (1); return (PARSEOP_LOCAL4); } 234 "Local5" { count (1); return (PARSEOP_LOCAL5); } 235 "Local6" { count (1); return (PARSEOP_LOCAL6); } 236 "Local7" { count (1); return (PARSEOP_LOCAL7); } 237 238 "Debug" { count (1); return (PARSEOP_DEBUG); } 239 240 "DefinitionBlock" { count (1); return (PARSEOP_DEFINITIONBLOCK); } 241 "Buffer" { count (1); return (PARSEOP_BUFFER); } 242 "Package" { count (1); return (PARSEOP_PACKAGE); } 243 244 "EISAID" { count (1); return (PARSEOP_EISAID); } 245 "ResourceTemplate" { count (1); return (PARSEOP_RESOURCETEMPLATE); } 246 "ToUUID" { count (1); return (PARSEOP_TOUUID); } 247 "Unicode" { count (1); return (PARSEOP_UNICODE); } 248 "DMA" { count (1); return (PARSEOP_DMA); } 249 "DWordIO" { count (1); return (PARSEOP_DWORDIO); } 250 "DWordMemory" { count (1); return (PARSEOP_DWORDMEMORY); } 251 "DWordSpace" { count (1); return (PARSEOP_DWORDSPACE); } 252 "EndDependentFn" { count (1); return (PARSEOP_ENDDEPENDENTFN); } 253 "ExtendedIO" { count (1); return (PARSEOP_EXTENDEDIO); } 254 "ExtendedMemory" { count (1); return (PARSEOP_EXTENDEDMEMORY); } 255 "ExtendedSpace" { count (1); return (PARSEOP_EXTENDEDSPACE); } 256 "FixedIO" { count (1); return (PARSEOP_FIXEDIO); } 257 "Interrupt" { count (1); return (PARSEOP_INTERRUPT); } 258 "IO" { count (1); return (PARSEOP_IO); } 259 "IRQNoFlags" { count (1); return (PARSEOP_IRQNOFLAGS); } 260 "IRQ" { count (1); return (PARSEOP_IRQ); } 261 "Memory24" { count (1); return (PARSEOP_MEMORY24); } 262 "Memory32Fixed" { count (1); return (PARSEOP_MEMORY32FIXED); } 263 "Memory32" { count (1); return (PARSEOP_MEMORY32); } 264 "QWordIO" { count (1); return (PARSEOP_QWORDIO); } 265 "QWordMemory" { count (1); return (PARSEOP_QWORDMEMORY); } 266 "QWordSpace" { count (1); return (PARSEOP_QWORDSPACE); } 267 "Register" { count (1); return (PARSEOP_REGISTER); } 268 "StartDependentFn" { count (1); return (PARSEOP_STARTDEPENDENTFN); } 269 "StartDependentFnNoPri" { count (1); return (PARSEOP_STARTDEPENDENTFN_NOPRI); } 270 "VendorLong" { count (1); return (PARSEOP_VENDORLONG); } 271 "VendorShort" { count (1); return (PARSEOP_VENDORSHORT); } 272 "WordBusNumber" { count (1); return (PARSEOP_WORDBUSNUMBER); } 273 "WordIO" { count (1); return (PARSEOP_WORDIO); } 274 "WordSpace" { count (1); return (PARSEOP_WORDSPACE); } 275 276 "UnknownObj" { count (0); return (PARSEOP_OBJECTTYPE_UNK); } 277 "IntObj" { count (0); return (PARSEOP_OBJECTTYPE_INT); } 278 "StrObj" { count (0); return (PARSEOP_OBJECTTYPE_STR); } 279 "BuffObj" { count (0); return (PARSEOP_OBJECTTYPE_BUF); } 280 "PkgObj" { count (0); return (PARSEOP_OBJECTTYPE_PKG); } 281 "FieldUnitObj" { count (0); return (PARSEOP_OBJECTTYPE_FLD); } 282 "DeviceObj" { count (0); return (PARSEOP_OBJECTTYPE_DEV); } 283 "EventObj" { count (0); return (PARSEOP_OBJECTTYPE_EVT); } 284 "MethodObj" { count (0); return (PARSEOP_OBJECTTYPE_MTH); } 285 "MutexObj" { count (0); return (PARSEOP_OBJECTTYPE_MTX); } 286 "OpRegionObj" { count (0); return (PARSEOP_OBJECTTYPE_OPR); } 287 "PowerResObj" { count (0); return (PARSEOP_OBJECTTYPE_POW); } 288 "ProcessorObj" { count (0); return (PARSEOP_OBJECTTYPE_PRO); } 289 "ThermalZoneObj" { count (0); return (PARSEOP_OBJECTTYPE_THZ); } 290 "BuffFieldObj" { count (0); return (PARSEOP_OBJECTTYPE_BFF); } 291 "DDBHandleObj" { count (0); return (PARSEOP_OBJECTTYPE_DDB); } 292 293 "AnyAcc" { count (0); return (PARSEOP_ACCESSTYPE_ANY); } 294 "ByteAcc" { count (0); return (PARSEOP_ACCESSTYPE_BYTE); } 295 "WordAcc" { count (0); return (PARSEOP_ACCESSTYPE_WORD); } 296 "DWordAcc" { count (0); return (PARSEOP_ACCESSTYPE_DWORD); } 297 "QWordAcc" { count (0); return (PARSEOP_ACCESSTYPE_QWORD); } 298 "BufferAcc" { count (0); return (PARSEOP_ACCESSTYPE_BUF); } 299 300 "Lock" { count (0); return (PARSEOP_LOCKRULE_LOCK); } 301 "NoLock" { count (0); return (PARSEOP_LOCKRULE_NOLOCK); } 302 303 "Preserve" { count (0); return (PARSEOP_UPDATERULE_PRESERVE); } 304 "WriteAsOnes" { count (0); return (PARSEOP_UPDATERULE_ONES); } 305 "WriteAsZeros" { count (0); return (PARSEOP_UPDATERULE_ZEROS); } 306 307 "Serialized" { count (0); return (PARSEOP_SERIALIZERULE_SERIAL); } 308 "NotSerialized" { count (0); return (PARSEOP_SERIALIZERULE_NOTSERIAL); } 309 310 "SystemIO" { count (0); return (PARSEOP_REGIONSPACE_IO); } 311 "SystemMemory" { count (0); return (PARSEOP_REGIONSPACE_MEM); } 312 "PCI_Config" { count (0); return (PARSEOP_REGIONSPACE_PCI); } 313 "EmbeddedControl" { count (0); return (PARSEOP_REGIONSPACE_EC); } 314 "SMBus" { count (0); return (PARSEOP_REGIONSPACE_SMBUS); } 315 "SystemCMOS" { count (0); return (PARSEOP_REGIONSPACE_CMOS); } 316 "PciBarTarget" { count (0); return (PARSEOP_REGIONSPACE_PCIBAR); } 317 "IPMI" { count (0); return (PARSEOP_REGIONSPACE_IPMI); } 318 319 "FFixedHW" { count (0); return (PARSEOP_ADDRESSSPACE_FFIXEDHW); } 320 321 "SMBQuick" { count (0); return (PARSEOP_ACCESSATTRIB_QUICK); } 322 "SMBSendReceive" { count (0); return (PARSEOP_ACCESSATTRIB_SND_RCV); } 323 "SMBByte" { count (0); return (PARSEOP_ACCESSATTRIB_BYTE); } 324 "SMBWord" { count (0); return (PARSEOP_ACCESSATTRIB_WORD); } 325 "SMBBlock" { count (0); return (PARSEOP_ACCESSATTRIB_BLOCK); } 326 "SMBProcessCall" { count (0); return (PARSEOP_ACCESSATTRIB_WORD_CALL); } 327 "SMBBlockProcessCall" { count (0); return (PARSEOP_ACCESSATTRIB_BLOCK_CALL); } 328 329 "MTR" { count (0); return (PARSEOP_MATCHTYPE_MTR); } 330 "MEQ" { count (0); return (PARSEOP_MATCHTYPE_MEQ); } 331 "MLE" { count (0); return (PARSEOP_MATCHTYPE_MLE); } 332 "MLT" { count (0); return (PARSEOP_MATCHTYPE_MLT); } 333 "MGE" { count (0); return (PARSEOP_MATCHTYPE_MGE); } 334 "MGT" { count (0); return (PARSEOP_MATCHTYPE_MGT); } 335 336 "Compatibility" { count (0); return (PARSEOP_DMATYPE_COMPATIBILITY); } 337 "TypeA" { count (0); return (PARSEOP_DMATYPE_A); } 338 "TypeB" { count (0); return (PARSEOP_DMATYPE_B); } 339 "TypeF" { count (0); return (PARSEOP_DMATYPE_F); } 340 341 "BusMaster" { count (0); return (PARSEOP_BUSMASTERTYPE_MASTER); } 342 "NotBusMaster" { count (0); return (PARSEOP_BUSMASTERTYPE_NOTMASTER); } 343 344 "Transfer8" { count (0); return (PARSEOP_XFERTYPE_8); } 345 "Transfer8_16" { count (0); return (PARSEOP_XFERTYPE_8_16); } 346 "Transfer16" { count (0); return (PARSEOP_XFERTYPE_16); } 347 348 "ResourceConsumer" { count (0); return (PARSEOP_RESOURCETYPE_CONSUMER); } 349 "ResourceProducer" { count (0); return (PARSEOP_RESOURCETYPE_PRODUCER); } 350 351 "MinFixed" { count (0); return (PARSEOP_MINTYPE_FIXED); } 352 "MinNotFixed" { count (0); return (PARSEOP_MINTYPE_NOTFIXED); } 353 354 "MaxFixed" { count (0); return (PARSEOP_MAXTYPE_FIXED); } 355 "MaxNotFixed" { count (0); return (PARSEOP_MAXTYPE_NOTFIXED); } 356 357 "PosDecode" { count (0); return (PARSEOP_DECODETYPE_POS); } 358 "SubDecode" { count (0); return (PARSEOP_DECODETYPE_SUB); } 359 360 "ISAOnlyRanges" { count (0); return (PARSEOP_RANGETYPE_ISAONLY); } 361 "NonISAOnlyRanges" { count (0); return (PARSEOP_RANGETYPE_NONISAONLY); } 362 "EntireRange" { count (0); return (PARSEOP_RANGETYPE_ENTIRE); } 363 364 "Cacheable" { count (0); return (PARSEOP_MEMTYPE_CACHEABLE); } 365 "WriteCombining" { count (0); return (PARSEOP_MEMTYPE_WRITECOMBINING); } 366 "Prefetchable" { count (0); return (PARSEOP_MEMTYPE_PREFETCHABLE); } 367 "NonCacheable" { count (0); return (PARSEOP_MEMTYPE_NONCACHEABLE); } 368 369 "ReadWrite" { count (0); return (PARSEOP_READWRITETYPE_BOTH); } 370 "ReadOnly" { count (0); return (PARSEOP_READWRITETYPE_READONLY); } 371 372 "Edge" { count (0); return (PARSEOP_INTTYPE_EDGE); } 373 "Level" { count (0); return (PARSEOP_INTTYPE_LEVEL); } 374 375 "ActiveHigh" { count (0); return (PARSEOP_INTLEVEL_ACTIVEHIGH); } 376 "ActiveLow" { count (0); return (PARSEOP_INTLEVEL_ACTIVELOW); } 377 378 "Shared" { count (0); return (PARSEOP_SHARETYPE_SHARED); } 379 "Exclusive" { count (0); return (PARSEOP_SHARETYPE_EXCLUSIVE); } 380 381 "Decode10" { count (0); return (PARSEOP_IODECODETYPE_10); } 382 "Decode16" { count (0); return (PARSEOP_IODECODETYPE_16); } 383 384 "TypeTranslation" { count (0); return (PARSEOP_TYPE_TRANSLATION); } 385 "TypeStatic" { count (0); return (PARSEOP_TYPE_STATIC); } 386 387 "SparseTranslation" { count (0); return (PARSEOP_TRANSLATIONTYPE_SPARSE); } 388 "DenseTranslation" { count (0); return (PARSEOP_TRANSLATIONTYPE_DENSE); } 389 390 "AddressRangeMemory" { count (0); return (PARSEOP_ADDRESSTYPE_MEMORY); } 391 "AddressRangeReserved" { count (0); return (PARSEOP_ADDRESSTYPE_RESERVED); } 392 "AddressRangeNVS" { count (0); return (PARSEOP_ADDRESSTYPE_NVS); } 393 "AddressRangeACPI" { count (0); return (PARSEOP_ADDRESSTYPE_ACPI); } 394 395 "__DATE__" { count (0); return (PARSEOP___DATE__); } 396 "__FILE__" { count (0); return (PARSEOP___FILE__); } 397 "__LINE__" { count (0); return (PARSEOP___LINE__); } 398 399 "{" { count (0); return('{'); } 400 "}" { count (0); return('}'); } 401 "," { count (0); return(','); } 402 "(" { count (0); return('('); } 403 ")" { count (0); return(')'); } 404 405 406 {NameSeg} { char *s; 407 count (0); 408 s=malloc (ACPI_NAME_SIZE + 1); 409 if (strcmp (AslCompilertext, "\\")) 410 { 411 strcpy (s, "____"); 412 AcpiUtStrupr (AslCompilertext); 413 } 414 memcpy (s, AslCompilertext, strlen (AslCompilertext)); 415 AslCompilerlval.s = s; 416 DbgPrint (ASL_PARSE_OUTPUT, "NameSeg: %s\n", s); 417 return (PARSEOP_NAMESEG); } 418 419 {NameString} { char *s; 420 count (0); 421 s=malloc (strlen (AslCompilertext)+1); 422 AcpiUtStrupr (AslCompilertext); 423 strcpy (s, AslCompilertext); 424 s[strlen (AslCompilertext)] = 0; 425 AslCompilerlval.s = s; 426 DbgPrint (ASL_PARSE_OUTPUT, "NameString: %s\n", s); 427 return (PARSEOP_NAMESTRING); } 428 429 "*" | 430 "/" { count (1); 431 AslCompilererror ("Parse error, expecting ASL keyword or name");} 432 433 . { count (1); 434 sprintf (MsgBuffer, 435 "Invalid character (0x%2.2X), expecting ASL keyword or name", 436 *AslCompilertext); 437 AslCompilererror (MsgBuffer);} 438 439 <<EOF>> { if (AslPopInputFileStack ()) 440 yyterminate(); 441 else 442 return (PARSEOP_INCLUDE_END);}; 443 444 %% 445 446 /*! [End] no source code translation !*/ 447 448 typedef struct asl_file_node 449 { 450 FILE *File; 451 UINT32 CurrentLineNumber; 452 YY_BUFFER_STATE State; 453 char *Filename; 454 struct asl_file_node *Next; 455 456 } ASL_FILE_NODE; 457 458 ASL_FILE_NODE *InputStack = NULL; 459 460 461 /******************************************************************************* 462 * 463 * FUNCTION: AslPopInputFileStack 464 * 465 * PARAMETERS: None 466 * 467 * RETURN: 0 if a node was popped, -1 otherwise 468 * 469 * DESCRIPTION: Pop the top of the input file stack and point the parser to 470 * the saved parse buffer contained in the fnode. Also, set the 471 * global line counters to the saved values. This function is 472 * called when an include file reaches EOF. 473 * 474 ******************************************************************************/ 475 476 int 477 AslPopInputFileStack ( 478 void) 479 { 480 ASL_FILE_NODE *Fnode; 481 FILE *InputFile = NULL; 482 483 484 Fnode = InputStack; 485 DbgPrint (ASL_PARSE_OUTPUT, "\nPop InputFile Stack, Fnode %p\n\n", Fnode); 486 487 488 if (!Fnode) 489 { 490 return -1; 491 } 492 493 /* Close the current include file */ 494 495 fclose (yyin); 496 497 /* Update the top-of-stack */ 498 499 InputStack = Fnode->Next; 500 InputFile = Fnode->File; 501 502 /* Reset global line counter and filename */ 503 504 Gbl_Files[ASL_FILE_INPUT].Filename = Fnode->Filename; 505 Gbl_CurrentLineNumber = Fnode->CurrentLineNumber; 506 507 /* Point the parser to the popped file */ 508 509 yy_delete_buffer (YY_CURRENT_BUFFER); 510 yy_switch_to_buffer (Fnode->State); 511 512 /* All done with this node */ 513 514 ACPI_FREE (Fnode); 515 return 0; 516 } 517 518 519 /******************************************************************************* 520 * 521 * FUNCTION: AslPushInputFileStack 522 * 523 * PARAMETERS: InputFile - Open file pointer 524 * Filename - Name of the file 525 * 526 * RETURN: None 527 * 528 * DESCRIPTION: Push the InputFile onto the file stack, and point the parser 529 * to this file. Called when an include file is successfully 530 * opened. 531 * 532 ******************************************************************************/ 533 534 void 535 AslPushInputFileStack ( 536 FILE *InputFile, 537 char *Filename) 538 { 539 ASL_FILE_NODE *Fnode; 540 YY_BUFFER_STATE State; 541 542 543 /* Save the current state in an Fnode */ 544 545 Fnode = UtLocalCalloc (sizeof (ASL_FILE_NODE)); 546 547 Fnode->File = yyin; 548 Fnode->Next = InputStack; 549 Fnode->State = YY_CURRENT_BUFFER; 550 Fnode->CurrentLineNumber = Gbl_CurrentLineNumber; 551 Fnode->Filename = Gbl_Files[ASL_FILE_INPUT].Filename; 552 553 /* Push it on the stack */ 554 555 InputStack = Fnode; 556 557 /* Point the parser to this file */ 558 559 State = yy_create_buffer (InputFile, YY_BUF_SIZE); 560 yy_switch_to_buffer (State); 561 562 DbgPrint (ASL_PARSE_OUTPUT, "\nPush InputFile Stack, returning %p\n\n", InputFile); 563 564 /* Reset the global line count and filename */ 565 566 Gbl_Files[ASL_FILE_INPUT].Filename = Filename; 567 Gbl_CurrentLineNumber = 1; 568 yyin = InputFile; 569 } 570 571 572 /******************************************************************************* 573 * 574 * FUNCTION: ResetCurrentLineBuffer 575 * 576 * PARAMETERS: None 577 * 578 * RETURN: None 579 * 580 * DESCRIPTION: Reset the Line Buffer to zero, increment global line numbers. 581 * 582 ******************************************************************************/ 583 584 void 585 ResetCurrentLineBuffer ( 586 void) 587 { 588 589 if (Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle) 590 { 591 FlWriteFile (ASL_FILE_SOURCE_OUTPUT, Gbl_CurrentLineBuffer, 592 Gbl_LineBufPtr - Gbl_CurrentLineBuffer); 593 } 594 595 Gbl_CurrentLineOffset += Gbl_CurrentColumn; 596 Gbl_CurrentColumn = 0; 597 598 Gbl_CurrentLineNumber++; 599 Gbl_LogicalLineNumber++; 600 Gbl_LineBufPtr = Gbl_CurrentLineBuffer; 601 } 602 603 604 /******************************************************************************* 605 * 606 * FUNCTION: InsertLineBuffer 607 * 608 * PARAMETERS: SourceChar - One char from the input ASL source file 609 * 610 * RETURN: None 611 * 612 * DESCRIPTION: Put one character of the source file into the temp line buffer 613 * 614 ******************************************************************************/ 615 616 #define ASL_SPACES_PER_TAB 4 617 618 void 619 InsertLineBuffer ( 620 int SourceChar) 621 { 622 UINT32 i; 623 UINT32 Count = 1; 624 625 626 if (SourceChar == EOF) 627 { 628 return; 629 } 630 631 Gbl_InputByteCount++; 632 633 /* Handle tabs. Convert to spaces */ 634 635 if (SourceChar == '\t') 636 { 637 SourceChar = ' '; 638 Count = ASL_SPACES_PER_TAB - 639 (Gbl_CurrentColumn & (ASL_SPACES_PER_TAB-1)); 640 } 641 642 643 for (i = 0; i < Count; i++) 644 { 645 Gbl_CurrentColumn++; 646 647 /* Insert the character into the line buffer */ 648 649 *Gbl_LineBufPtr = (UINT8) SourceChar; 650 Gbl_LineBufPtr++; 651 652 if (Gbl_LineBufPtr > (Gbl_CurrentLineBuffer + (ASL_LINE_BUFFER_SIZE - 1))) 653 { 654 #if 0 655 /* 656 * Warning if we have split a long source line. 657 * <Probably overkill> 658 */ 659 sprintf (MsgBuffer, "Max %u", ASL_LINE_BUFFER_SIZE); 660 AslCommonError (ASL_WARNING, ASL_MSG_LONG_LINE, 661 Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 662 Gbl_CurrentLineOffset, Gbl_CurrentColumn, 663 Gbl_Files[ASL_FILE_INPUT].Filename, MsgBuffer); 664 #endif 665 666 ResetCurrentLineBuffer (); 667 } 668 else if (SourceChar == '\n') 669 { 670 /* End of line */ 671 672 ResetCurrentLineBuffer (); 673 } 674 } 675 } 676 677 678 /******************************************************************************* 679 * 680 * FUNCTION: count 681 * 682 * PARAMETERS: yytext - Contains the matched keyword. 683 * Type - Keyword/Character type: 684 * 0 = anything except a keyword 685 * 1 = pseudo-keywords 686 * 2 = non-executable ASL keywords 687 * 3 = executable ASL keywords 688 * 689 * RETURN: None 690 * 691 * DESCRIPTION: Count keywords and put them into the line buffer 692 * 693 ******************************************************************************/ 694 695 void 696 count ( 697 int Type) 698 { 699 int i; 700 701 702 switch (Type) 703 { 704 case 2: 705 TotalKeywords++; 706 TotalNamedObjects++; 707 break; 708 709 case 3: 710 TotalKeywords++; 711 TotalExecutableOpcodes++; 712 break; 713 } 714 715 for (i = 0; (yytext[i] != 0) && (yytext[i] != EOF); i++) 716 { 717 InsertLineBuffer (yytext[i]); 718 *Gbl_LineBufPtr = 0; 719 } 720 } 721 722 723 /******************************************************************************* 724 * 725 * FUNCTION: comment 726 * 727 * PARAMETERS: none 728 * 729 * RETURN: none 730 * 731 * DESCRIPTION: Process a standard comment. 732 * 733 ******************************************************************************/ 734 735 char 736 comment (void) 737 { 738 char c; 739 char c1 = 0; 740 741 742 InsertLineBuffer ('/'); 743 InsertLineBuffer ('*'); 744 745 loop: 746 747 /* Eat chars until end-of-comment */ 748 749 while ((c = (char) input()) != '*' && c != EOF) 750 { 751 InsertLineBuffer (c); 752 c1 = c; 753 } 754 755 if (c == EOF) 756 { 757 goto EarlyEOF; 758 } 759 760 /* 761 * Check for nested comment -- can help catch cases where a previous 762 * comment was accidently left unterminated 763 */ 764 if ((c1 == '/') && (c == '*')) 765 { 766 AslCommonError (ASL_WARNING, ASL_MSG_NESTED_COMMENT, 767 Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 768 Gbl_InputByteCount, Gbl_CurrentColumn, 769 Gbl_Files[ASL_FILE_INPUT].Filename, NULL); 770 } 771 772 /* Comment is closed only if the NEXT character is a slash */ 773 774 InsertLineBuffer (c); 775 776 if ((c1 = (char) input()) != '/' && c1 != EOF) 777 { 778 unput(c1); 779 goto loop; 780 } 781 782 if (c1 == EOF) 783 { 784 goto EarlyEOF; 785 } 786 787 InsertLineBuffer (c1); 788 return TRUE; 789 790 791 EarlyEOF: 792 /* 793 * Premature End-Of-File 794 */ 795 AslCommonError (ASL_ERROR, ASL_MSG_EARLY_EOF, 796 Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 797 Gbl_CurrentLineOffset, Gbl_CurrentColumn, 798 Gbl_Files[ASL_FILE_INPUT].Filename, NULL); 799 return (FALSE); 800 } 801 802 803 /******************************************************************************* 804 * 805 * FUNCTION: comment 806 * 807 * PARAMETERS: none 808 * 809 * RETURN: none 810 * 811 * DESCRIPTION: Process a new "//" comment. 812 * 813 ******************************************************************************/ 814 815 char 816 comment2 (void) 817 { 818 char c; 819 820 821 InsertLineBuffer ('/'); 822 InsertLineBuffer ('/'); 823 824 while ((c = (char) input()) != '\n' && c != EOF) 825 { 826 InsertLineBuffer (c); 827 } 828 829 if (c == EOF) 830 { 831 /* End of file is OK, change to newline. Let parser detect EOF later */ 832 833 c = '\n'; 834 } 835 836 InsertLineBuffer (c); 837 return (TRUE); 838 } 839 840 841 /******************************************************************************* 842 * 843 * FUNCTION: literal 844 * 845 * PARAMETERS: none 846 * 847 * RETURN: none 848 * 849 * DESCRIPTION: Process a string literal (surrounded by quotes) 850 * 851 ******************************************************************************/ 852 853 #define ASL_NORMAL_CHAR 0 854 #define ASL_ESCAPE_SEQUENCE 1 855 #define ASL_OCTAL_CONSTANT 2 856 #define ASL_HEX_CONSTANT 3 857 858 char 859 literal (void) 860 { 861 char *StringBuffer = MsgBuffer; 862 char *EndBuffer = MsgBuffer + ASL_MSG_BUFFER_SIZE; 863 char *CleanString; 864 char StringChar; 865 UINT32 State = ASL_NORMAL_CHAR; 866 UINT32 i = 0; 867 UINT8 Digit; 868 char ConvertBuffer[4]; 869 870 871 /* 872 * Eat chars until end-of-literal. 873 * NOTE: Put back the original surrounding quotes into the 874 * source line buffer. 875 */ 876 InsertLineBuffer ('\"'); 877 while ((StringChar = (char) input()) != EOF) 878 { 879 InsertLineBuffer (StringChar); 880 881 DoCharacter: 882 883 switch (State) 884 { 885 case ASL_NORMAL_CHAR: 886 887 switch (StringChar) 888 { 889 case '\\': 890 /* 891 * Special handling for backslash-escape sequence. We will 892 * toss the backslash and translate the escape char(s). 893 */ 894 State = ASL_ESCAPE_SEQUENCE; 895 continue; 896 897 case '\"': 898 899 /* String terminator */ 900 901 goto CompletedString; 902 } 903 break; 904 905 906 case ASL_ESCAPE_SEQUENCE: 907 908 State = ASL_NORMAL_CHAR; 909 switch (StringChar) 910 { 911 case 'a': 912 StringChar = 0x07; /* BELL */ 913 break; 914 915 case 'b': 916 StringChar = 0x08; /* BACKSPACE */ 917 break; 918 919 case 'f': 920 StringChar = 0x0C; /* FORMFEED */ 921 break; 922 923 case 'n': 924 StringChar = 0x0A; /* LINEFEED */ 925 break; 926 927 case 'r': 928 StringChar = 0x0D; /* CARRIAGE RETURN*/ 929 break; 930 931 case 't': 932 StringChar = 0x09; /* HORIZONTAL TAB */ 933 break; 934 935 case 'v': 936 StringChar = 0x0B; /* VERTICAL TAB */ 937 break; 938 939 case 'x': 940 State = ASL_HEX_CONSTANT; 941 i = 0; 942 continue; 943 944 case '\'': /* Single Quote */ 945 case '\"': /* Double Quote */ 946 case '\\': /* Backslash */ 947 break; 948 949 default: 950 951 /* Check for an octal digit (0-7) */ 952 953 if (ACPI_IS_OCTAL_DIGIT (StringChar)) 954 { 955 State = ASL_OCTAL_CONSTANT; 956 ConvertBuffer[0] = StringChar; 957 i = 1; 958 continue; 959 } 960 961 /* Unknown escape sequence issue warning, but use the character */ 962 963 AslCommonError (ASL_WARNING, ASL_MSG_INVALID_ESCAPE, 964 Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 965 Gbl_CurrentLineOffset, Gbl_CurrentColumn, 966 Gbl_Files[ASL_FILE_INPUT].Filename, NULL); 967 break; 968 } 969 break; 970 971 972 case ASL_OCTAL_CONSTANT: 973 974 /* Up to three octal digits allowed */ 975 976 if (!ACPI_IS_OCTAL_DIGIT (StringChar) || 977 (i > 2)) 978 { 979 /* 980 * Reached end of the constant. Convert the assembled ASCII 981 * string and resume processing of the next character 982 */ 983 ConvertBuffer[i] = 0; 984 Digit = (UINT8) ACPI_STRTOUL (ConvertBuffer, NULL, 8); 985 986 /* Check for NULL or non-ascii character (ignore if so) */ 987 988 if ((Digit == 0) || (Digit > ACPI_ASCII_MAX)) 989 { 990 AslCommonError (ASL_WARNING, ASL_MSG_INVALID_STRING, 991 Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 992 Gbl_CurrentLineOffset, Gbl_CurrentColumn, 993 Gbl_Files[ASL_FILE_INPUT].Filename, NULL); 994 } 995 else 996 { 997 *StringBuffer = (char) Digit; 998 StringBuffer++; 999 if (StringBuffer >= EndBuffer) 1000 { 1001 goto BufferOverflow; 1002 } 1003 } 1004 1005 State = ASL_NORMAL_CHAR; 1006 goto DoCharacter; 1007 break; 1008 } 1009 1010 /* Append another digit of the constant */ 1011 1012 ConvertBuffer[i] = StringChar; 1013 i++; 1014 continue; 1015 1016 1017 case ASL_HEX_CONSTANT: 1018 1019 /* Up to two hex digits allowed */ 1020 1021 if (!ACPI_IS_XDIGIT (StringChar) || 1022 (i > 1)) 1023 { 1024 /* 1025 * Reached end of the constant. Convert the assembled ASCII 1026 * string and resume processing of the next character 1027 */ 1028 ConvertBuffer[i] = 0; 1029 Digit = (UINT8) ACPI_STRTOUL (ConvertBuffer, NULL, 16); 1030 1031 /* Check for NULL or non-ascii character (ignore if so) */ 1032 1033 if ((Digit == 0) || (Digit > ACPI_ASCII_MAX)) 1034 { 1035 AslCommonError (ASL_WARNING, ASL_MSG_INVALID_STRING, 1036 Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 1037 Gbl_CurrentLineOffset, Gbl_CurrentColumn, 1038 Gbl_Files[ASL_FILE_INPUT].Filename, NULL); 1039 } 1040 else 1041 { 1042 *StringBuffer = (char) Digit; 1043 StringBuffer++; 1044 if (StringBuffer >= EndBuffer) 1045 { 1046 goto BufferOverflow; 1047 } 1048 } 1049 1050 State = ASL_NORMAL_CHAR; 1051 goto DoCharacter; 1052 break; 1053 } 1054 1055 /* Append another digit of the constant */ 1056 1057 ConvertBuffer[i] = StringChar; 1058 i++; 1059 continue; 1060 } 1061 1062 /* Save the finished character */ 1063 1064 *StringBuffer = StringChar; 1065 StringBuffer++; 1066 if (StringBuffer >= EndBuffer) 1067 { 1068 goto BufferOverflow; 1069 } 1070 } 1071 1072 /* 1073 * Premature End-Of-File 1074 */ 1075 AslCommonError (ASL_ERROR, ASL_MSG_EARLY_EOF, 1076 Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 1077 Gbl_CurrentLineOffset, Gbl_CurrentColumn, 1078 Gbl_Files[ASL_FILE_INPUT].Filename, NULL); 1079 return (FALSE); 1080 1081 1082 CompletedString: 1083 /* 1084 * Null terminate the input string and copy string to a new buffer 1085 */ 1086 *StringBuffer = 0; 1087 1088 CleanString = UtGetStringBuffer (strlen (MsgBuffer) + 1); 1089 if (!CleanString) 1090 { 1091 AslCommonError (ASL_ERROR, ASL_MSG_MEMORY_ALLOCATION, 1092 Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 1093 Gbl_CurrentLineOffset, Gbl_CurrentColumn, 1094 Gbl_Files[ASL_FILE_INPUT].Filename, NULL); 1095 return (FALSE); 1096 } 1097 1098 ACPI_STRCPY (CleanString, MsgBuffer); 1099 AslCompilerlval.s = CleanString; 1100 return (TRUE); 1101 1102 1103 BufferOverflow: 1104 1105 /* Literal was too long */ 1106 1107 AslCommonError (ASL_ERROR, ASL_MSG_STRING_LENGTH, 1108 Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 1109 Gbl_CurrentLineOffset, Gbl_CurrentColumn, 1110 Gbl_Files[ASL_FILE_INPUT].Filename, "Max length 4096"); 1111 return (FALSE); 1112 } 1113 1114 1115