mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-31 08:16:47 +00:00 
			
		
		
		
	git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@13840 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			235 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			235 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*===-- Lexer.l - Scanner for Stacker language -----------------*- C++ -*--===//
 | |
| // 
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file was developed by Reid Spencer and donated to the LLVM research 
 | |
| // group and is distributed under the University of Illinois Open Source 
 | |
| // License. See LICENSE.TXT for details.
 | |
| // 
 | |
| //===----------------------------------------------------------------------===//
 | |
| //
 | |
| //  This file implements the flex scanner for Stacker languages files.
 | |
| //
 | |
| //===----------------------------------------------------------------------===*/
 | |
| 
 | |
| %option prefix="Stacker"
 | |
| %option yylineno
 | |
| %option nostdinit
 | |
| %option never-interactive
 | |
| %option batch
 | |
| %option noyywrap
 | |
| %option nodefault
 | |
| %option 8bit
 | |
| %option outfile="Lexer.cpp"
 | |
| %option ecs
 | |
| %option noreject
 | |
| %option noyymore
 | |
| 
 | |
| %{
 | |
| 
 | |
| #include "StackerCompiler.h"
 | |
| #include "StackerParser.h"
 | |
| 
 | |
| /* Conversion of text ints to binary */
 | |
| static int64_t IntToVal(const char *Buffer) {
 | |
|   int64_t Result = 0;
 | |
|   for (; *Buffer; Buffer++) {
 | |
|     int64_t OldRes = Result;
 | |
|     Result *= 10;
 | |
|     Result += *Buffer-'0';
 | |
|     if (Result < OldRes)   // Uh, oh, overflow detected!!!
 | |
|       StackerCompiler::ThrowException("constant bigger than 64 bits detected!");
 | |
|   }
 | |
|   return Result;
 | |
| }
 | |
| 
 | |
| /* Conversion of text hexadecimal ints to binary */
 | |
| static int64_t HexIntToVal(const char *Buffer) {
 | |
|   int64_t Result = 0;
 | |
|   for (; *Buffer; ++Buffer) {
 | |
|     int64_t OldRes = Result;
 | |
|     Result *= 16;
 | |
|     char C = *Buffer;
 | |
|     if (C >= '0' && C <= '9')
 | |
|       Result += C-'0';
 | |
|     else if (C >= 'A' && C <= 'F')
 | |
|       Result += C-'A'+10;
 | |
|     else if (C >= 'a' && C <= 'f')
 | |
|       Result += C-'a'+10;
 | |
| 
 | |
|     if (Result < OldRes)   // Uh, oh, overflow detected!!!
 | |
|       StackerCompiler::ThrowException("constant bigger than 64 bits detected!");
 | |
|   }
 | |
|   return Result;
 | |
| }
 | |
| 
 | |
| #define YY_NEVER_INTERACTIVE 1
 | |
| %}
 | |
| 
 | |
| /* Comments start with a ; and go till end of line */
 | |
| Comment1	[#].*$
 | |
| /* You can also embed them in ( ... ) */
 | |
| Comment2	\(.*\)
 | |
| /* We ignore white space */
 | |
| White		[ \t\r\n]
 | |
| 
 | |
| /* jdentifiers start with a % sign */
 | |
| Identifier  	[A-Za-z][-A-Za-z0-9_]*
 | |
| 
 | |
| /* Strings can contain any character except " and \ */
 | |
| String		\"[^\"]*\"
 | |
| 
 | |
| /* Positive and negative integer constants*/
 | |
| PInteger	[+]?[0-9]+
 | |
| NInteger	-[0-9]+
 | |
| HexInteger 	0x[0-9A-Fa-f]+
 | |
| 
 | |
| /* Special Characters - name them to avoid flex confusion */
 | |
| Semi 		[;]
 | |
| Colon 		[:]
 | |
| Less		\<
 | |
| More		\>
 | |
| LessEq		\<\=
 | |
| MoreEq		\>\=
 | |
| NotEq		\<\>
 | |
| Equal		\=
 | |
| Plus		\+
 | |
| Minus		\-
 | |
| Incr		\+\+
 | |
| Decr		\-\-
 | |
| Mult		\*
 | |
| Div		\/
 | |
| StarSlash	\*\/
 | |
| LShift		\<\<
 | |
| RShift		\>\>
 | |
| InStr		\<s
 | |
| InNum		\<d
 | |
| InChar		\<c
 | |
| OutStr		\>s
 | |
| OutNum		\>d
 | |
| OutChar		\>c
 | |
| 
 | |
| %%
 | |
| 
 | |
| {Comment1}	{ /* Ignore comments */ }
 | |
| {Comment2}	{ /* Ignore comments */ }
 | |
| 
 | |
| {Colon}		{ return COLON; }
 | |
| {Semi}		{ return SEMI; }
 | |
| 
 | |
| TRUE		{ return TRUETOK; }
 | |
| FALSE		{ return FALSETOK; }
 | |
| ON		{ return TRUETOK; }
 | |
| OFF		{ return FALSETOK; }
 | |
| {Less}		{ return LESS; }
 | |
| LT		{ return LESS; }
 | |
| {More}		{ return MORE; }
 | |
| GT		{ return MORE; }
 | |
| {LessEq}	{ return LESS_EQUAL; }
 | |
| LE		{ return LESS_EQUAL; }
 | |
| {MoreEq}	{ return MORE_EQUAL; }
 | |
| GE		{ return MORE_EQUAL; }
 | |
| {NotEq}		{ return NOT_EQUAL; }
 | |
| NE		{ return NOT_EQUAL; }
 | |
| {Equal}		{ return EQUAL; }
 | |
| EQ		{ return EQUAL; }
 | |
| 
 | |
| {Plus}		{ return PLUS; }
 | |
| {Minus}		{ return MINUS; }
 | |
| {Incr}		{ return INCR; }
 | |
| {Decr}		{ return DECR; }
 | |
| {Mult}		{ return MULT; }
 | |
| {Div}		{ return DIV; }
 | |
| MOD		{ return MODULUS; }
 | |
| NEG		{ return NEGATE; }
 | |
| ABS		{ return ABS; }
 | |
| MIN		{ return MIN; }
 | |
| MAX		{ return MAX; }
 | |
| {StarSlash}	{ return STAR_SLASH; }
 | |
| 
 | |
| AND		{ return AND; }
 | |
| OR		{ return OR; }
 | |
| XOR		{ return XOR; }
 | |
| {LShift}	{ return LSHIFT; }
 | |
| {RShift}	{ return RSHIFT; }
 | |
| 
 | |
| DROP		{ return DROP; }
 | |
| NIP		{ return NIP; }
 | |
| DUP		{ return DUP; }
 | |
| SWAP		{ return SWAP; }
 | |
| OVER		{ return OVER; }
 | |
| PICK		{ return PICK; }
 | |
| SELECT		{ return SELECT; }
 | |
| ROT		{ return ROT; }
 | |
| RROT		{ return RROT; }
 | |
| ROLL		{ return ROLL; }
 | |
| TUCK		{ return TUCK; }
 | |
| DROP2		{ return DROP2; }
 | |
| NIP2		{ return NIP2; }
 | |
| DUP2		{ return DUP2; }
 | |
| SWAP2		{ return SWAP2; }
 | |
| OVER2		{ return OVER2; }
 | |
| TUCK2		{ return TUCK2; }
 | |
| ROT2		{ return ROT2; }
 | |
| RROT2		{ return RROT2; }
 | |
| 
 | |
| MALLOC		{ return MALLOC; }
 | |
| FREE		{ return FREE; }
 | |
| GET		{ return GET; }
 | |
| PUT		{ return PUT; }
 | |
| 
 | |
| IF		{ return IF; }
 | |
| ELSE		{ return ELSE; }
 | |
| ENDIF		{ return ENDIF; }
 | |
| WHILE		{ return WHILE; }
 | |
| END		{ return END; }
 | |
| 
 | |
| RECURSE		{ return RECURSE; }
 | |
| RETURN		{ return RETURN; }
 | |
| EXIT		{ return EXIT; }
 | |
| FORWARD		{ return FORWARD; }
 | |
| TAB		{ return TAB; }
 | |
| SPACE		{ return SPACE; }
 | |
| CR		{ return CR; }
 | |
| 
 | |
| {InStr}		{ return IN_STR; }
 | |
| {InNum}		{ return IN_NUM; }
 | |
| {InChar} 	{ return IN_CHAR; }
 | |
| 
 | |
| {OutStr}	{ return OUT_STR; }
 | |
| {OutNum}	{ return OUT_NUM; }
 | |
| {OutChar} 	{ return OUT_CHAR; }
 | |
| 
 | |
| MAIN		{ return MAIN; }
 | |
| 
 | |
| DUMP		{ return DUMP; }
 | |
| 
 | |
| !=		{ StackerCompiler::ThrowException(
 | |
| 		  "You probably meant to use a <> instead of !=" ); }
 | |
| 
 | |
| ==		{ StackerCompiler::ThrowException(
 | |
| 		  "You probably meant to use a single = .. this isn't C"); }
 | |
| 
 | |
| {PInteger}      { Stackerlval.IntegerVal = IntToVal(yytext); return INTEGER; }
 | |
| {NInteger}      { uint64_t Val = IntToVal(yytext+1);
 | |
| 		  // +1:  we have bigger negative range
 | |
| 		  if (Val > (uint64_t)INT64_MAX+1)
 | |
| 		    StackerCompiler::ThrowException(
 | |
| 		    "Constant too large for signed 64 bits!");
 | |
|                   Stackerlval.IntegerVal = -Val; 
 | |
| 		  return INTEGER; 
 | |
|                 }
 | |
| {HexInteger} 	{ Stackerlval.IntegerVal = HexIntToVal(yytext+3); 
 | |
|                    return INTEGER;
 | |
|                 }
 | |
| 
 | |
| {String} 	{ yytext[strlen(yytext)-1] = 0;           // nuke end quote
 | |
| 		  Stackerlval.StringVal = strdup(yytext+1);  // Nuke start quote
 | |
| 		  return STRING;
 | |
|                 }
 | |
| 
 | |
| {Identifier}    { Stackerlval.StringVal = strdup(yytext); return IDENTIFIER; }
 | |
| 
 | |
| {White}         { /* Ignore whitespace */ }
 | |
| %%
 |