aicasm_scan.l revision 60938
123925Sgibbs%{
223925Sgibbs/*
323925Sgibbs * Lexical Analyzer for the Aic7xxx SCSI Host adapter sequencer assembler.
423925Sgibbs *
539220Sgibbs * Copyright (c) 1997-1998 Justin T. Gibbs.
623925Sgibbs * All rights reserved.
723925Sgibbs *
823925Sgibbs * Redistribution and use in source and binary forms, with or without
923925Sgibbs * modification, are permitted provided that the following conditions
1023925Sgibbs * are met:
1123925Sgibbs * 1. Redistributions of source code must retain the above copyright
1226997Sgibbs *    notice, this list of conditions, and the following disclaimer,
1354211Sgibbs *    without modification.
1439220Sgibbs * 2. The name of the author may not be used to endorse or promote products
1523925Sgibbs *    derived from this software without specific prior written permission.
1623925Sgibbs *
1723925Sgibbs * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1823925Sgibbs * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1923925Sgibbs * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2023925Sgibbs * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
2123925Sgibbs * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2223925Sgibbs * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2323925Sgibbs * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2423925Sgibbs * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2523925Sgibbs * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2623925Sgibbs * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2723925Sgibbs * SUCH DAMAGE.
2823925Sgibbs *
2950477Speter * $FreeBSD: head/sys/dev/aic7xxx/aicasm/aicasm_scan.l 60938 2000-05-26 02:09:24Z jake $
3023925Sgibbs */
3123925Sgibbs
3223942Sbde#include <sys/types.h>
3323942Sbde
3423925Sgibbs#include <limits.h>
3523925Sgibbs#include <stdio.h>
3623925Sgibbs#include <string.h>
3723925Sgibbs#include <sysexits.h>
3823925Sgibbs#include <sys/queue.h>
3923925Sgibbs
4029050Sgibbs#include "aicasm.h"
4129050Sgibbs#include "aicasm_symbol.h"
4223925Sgibbs#include "y.tab.h"
4339220Sgibbs
4439220Sgibbs#define MAX_STR_CONST 256
4539220Sgibbschar string_buf[MAX_STR_CONST];
4639220Sgibbschar *string_buf_ptr;
4739220Sgibbsint  parren_count;
4823925Sgibbs%}
4923925Sgibbs
5023925SgibbsPATH		[-/A-Za-z0-9_.]*[./][-/A-Za-z0-9_.]*
5123925SgibbsWORD		[A-Za-z_][-A-Za-z_0-9]*
5223925SgibbsSPACE		[ \t]+
5323925Sgibbs
5423925Sgibbs%x COMMENT
5539220Sgibbs%x CEXPR
5639220Sgibbs%x INCLUDE
5723925Sgibbs
5823925Sgibbs%%
5923925Sgibbs\n			{ ++yylineno; }
6023925Sgibbs"/*"			{ BEGIN COMMENT;  /* Enter comment eating state */ }
6123925Sgibbs<COMMENT>"/*"		{ fprintf(stderr, "Warning! Comment within comment."); }
6223925Sgibbs<COMMENT>\n		{ ++yylineno; }
6323925Sgibbs<COMMENT>[^*/\n]*	;
6423925Sgibbs<COMMENT>"*"+[^*/\n]*	;
6523925Sgibbs<COMMENT>"/"+[^*/\n]*	;
6623925Sgibbs<COMMENT>"*"+"/"	{ BEGIN INITIAL; }
6739220Sgibbsif[ \t]*\(		{
6839220Sgibbs				string_buf_ptr = string_buf;
6939220Sgibbs				parren_count = 1;
7039220Sgibbs				BEGIN CEXPR;
7139220Sgibbs				return T_IF;
7239220Sgibbs			}
7339220Sgibbs<CEXPR>\(		{	*string_buf_ptr++ = '('; parren_count++; }
7439220Sgibbs<CEXPR>\)		{
7539220Sgibbs				parren_count--;
7639220Sgibbs				if (parren_count == 0) {
7739220Sgibbs					/* All done */
7839220Sgibbs					BEGIN INITIAL;
7939220Sgibbs					*string_buf_ptr = '\0';
8039220Sgibbs					yylval.sym = symtable_get(string_buf);
8139220Sgibbs					return T_CEXPR;
8239220Sgibbs				} else {
8339220Sgibbs					*string_buf_ptr++ = ')';
8439220Sgibbs				}
8539220Sgibbs			}
8639220Sgibbs<CEXPR>\n		{ ++yylineno; }
8739220Sgibbs<CEXPR>[^()\n]+		{
8839220Sgibbs				char *yptr = yytext;
8923925Sgibbs
9039220Sgibbs				while (*yptr != '\0')
9139220Sgibbs					*string_buf_ptr++ = *yptr++;
9239220Sgibbs			}
9339220Sgibbs
9423925Sgibbs{SPACE}			;
9523925Sgibbs
9623925Sgibbs	/* Register/SCB/SRAM definition keywords */
9723925Sgibbsregister		{ return T_REGISTER; }
9823925Sgibbsconst			{ yylval.value = FALSE; return T_CONST; }
9929897Sgibbsdownload		{ return T_DOWNLOAD; }
10023925Sgibbsaddress			{ return T_ADDRESS; }
10123925Sgibbsaccess_mode		{ return T_ACCESS_MODE; }
10223925SgibbsRW|RO|WO		{
10323925Sgibbs				 if (strcmp(yytext, "RW") == 0)
10423925Sgibbs					yylval.value = RW;
10523925Sgibbs				 else if (strcmp(yytext, "RO") == 0)
10623925Sgibbs					yylval.value = RO;
10723925Sgibbs				 else
10823925Sgibbs					yylval.value = WO;
10923925Sgibbs				 return T_MODE;
11023925Sgibbs			}
11123925Sgibbsbit			{ return T_BIT; }
11223925Sgibbsmask			{ return T_MASK; }
11323925Sgibbsalias			{ return T_ALIAS; }
11423925Sgibbssize			{ return T_SIZE; }
11523925Sgibbsscb			{ return T_SCB; }
11623925Sgibbsscratch_ram		{ return T_SRAM; }
11723925Sgibbsaccumulator		{ return T_ACCUM; }
11823925Sgibbsallones			{ return T_ALLONES; }
11923925Sgibbsallzeros		{ return T_ALLZEROS; }
12023925Sgibbsnone			{ return T_NONE; }
12123925Sgibbssindex			{ return T_SINDEX; }
12223925SgibbsA			{ return T_A; }
12323925Sgibbs
12423925Sgibbs	/* Opcodes */
12523925Sgibbsshl			{ return T_SHL; }
12623925Sgibbsshr			{ return T_SHR; }
12723925Sgibbsror			{ return T_ROR; }
12823925Sgibbsrol			{ return T_ROL; }
12923925Sgibbsmvi			{ return T_MVI; }
13023925Sgibbsmov			{ return T_MOV; }
13123925Sgibbsclr			{ return T_CLR; }
13223925Sgibbsjmp			{ return T_JMP; }
13323925Sgibbsjc			{ return T_JC;	}
13423925Sgibbsjnc			{ return T_JNC;	}
13523925Sgibbsje			{ return T_JE;	}
13623925Sgibbsjne			{ return T_JNE;	}
13723925Sgibbsjz			{ return T_JZ;	}
13823925Sgibbsjnz			{ return T_JNZ;	}
13923925Sgibbscall			{ return T_CALL; }
14023925Sgibbsadd			{ return T_ADD; }
14123925Sgibbsadc			{ return T_ADC; }
14239220Sgibbsbmov			{ return T_BMOV; }
14323925Sgibbsinc			{ return T_INC; }
14423925Sgibbsdec			{ return T_DEC; }
14523925Sgibbsstc			{ return T_STC;	}
14623925Sgibbsclc			{ return T_CLC; }
14723925Sgibbscmp			{ return T_CMP;	}
14823925Sgibbsxor			{ return T_XOR;	}
14923925Sgibbstest			{ return T_TEST;}
15023925Sgibbsand			{ return T_AND;	}
15123925Sgibbsor			{ return T_OR;	}
15223925Sgibbsret			{ return T_RET; }
15323925Sgibbsnop			{ return T_NOP; }
15439220Sgibbselse			{ return T_ELSE; }
15523925Sgibbs
15623925Sgibbs	/* Allowed Symbols */
15739220Sgibbs[-+,:()~|&."{};<>[\]!]	{ return yytext[0]; }
15823925Sgibbs
15923925Sgibbs	/* Number processing */
16023925Sgibbs0[0-7]*			{
16123925Sgibbs				yylval.value = strtol(yytext, NULL, 8);
16223925Sgibbs				return T_NUMBER;
16323925Sgibbs			}
16423925Sgibbs
16523925Sgibbs0[xX][0-9a-fA-F]+	{
16623925Sgibbs				yylval.value = strtoul(yytext + 2, NULL, 16);
16723925Sgibbs				return T_NUMBER;
16823925Sgibbs			}
16923925Sgibbs
17023925Sgibbs[1-9][0-9]*		{
17123925Sgibbs				yylval.value = strtol(yytext, NULL, 10);
17223925Sgibbs				return T_NUMBER;
17323925Sgibbs			}
17423925Sgibbs
17523925Sgibbs	/* Include Files */
17639220Sgibbs#include		{ return T_INCLUDE; BEGIN INCLUDE;}
17739220Sgibbs<INCLUDE>[<>\"]		{ return yytext[0]; }
17839220Sgibbs<INCLUDE>{PATH}		{ yylval.str = strdup(yytext); return T_PATH; }
17939220Sgibbs<INCLUDE>;		{ BEGIN INITIAL; return yytext[0]; }
18039220Sgibbs<INCLUDE>.		{ stop("Invalid include line", EX_DATAERR); }
18123925Sgibbs
18223925Sgibbs	/* For parsing C include files with #define foo */
18323925Sgibbs#define			{ yylval.value = TRUE; return T_CONST; }
18423925Sgibbs	/* Throw away macros */
18523925Sgibbs#define[^\n]*[()]+[^\n]* ;
18623925Sgibbs{PATH}			{ yylval.str = strdup(yytext); return T_PATH; }
18723925Sgibbs
18823925Sgibbs{WORD}			{ yylval.sym = symtable_get(yytext);  return T_SYMBOL; }
18923925Sgibbs
19023925Sgibbs.			{
19123925Sgibbs				char buf[255];
19223925Sgibbs
19323925Sgibbs				snprintf(buf, sizeof(buf), "Invalid character "
19423925Sgibbs					 "'%c'", yytext[0]);
19523925Sgibbs				stop(buf, EX_DATAERR);
19623925Sgibbs			}
19723925Sgibbs%%
19823925Sgibbs
19923925Sgibbstypedef struct include {
20023925Sgibbs        YY_BUFFER_STATE  buffer;
20123925Sgibbs        int              lineno;
20223925Sgibbs        char            *filename;
20360938Sjake	SLIST_ENTRY(include) links;
20423925Sgibbs}include_t;
20523925Sgibbs
20660938SjakeSLIST_HEAD(, include) include_stack;
20723925Sgibbs
20823925Sgibbsvoid
20923925Sgibbsinclude_file(file_name, type)
21023925Sgibbs	char	*file_name;
21123925Sgibbs	include_type type;
21223925Sgibbs{
21323925Sgibbs	FILE *newfile;
21423925Sgibbs	include_t *include;
21523925Sgibbs
21623925Sgibbs	newfile = NULL;
21723925Sgibbs	/* Try the current directory first */
21823925Sgibbs	if (includes_search_curdir != 0 || type == SOURCE_FILE)
21923925Sgibbs		newfile = fopen(file_name, "r");
22023925Sgibbs
22123925Sgibbs	if (newfile == NULL && type != SOURCE_FILE) {
22223925Sgibbs                path_entry_t include_dir;
22323925Sgibbs                for (include_dir = search_path.slh_first;
22423925Sgibbs                     include_dir != NULL;
22523925Sgibbs                     include_dir = include_dir->links.sle_next) {
22623925Sgibbs			char fullname[PATH_MAX];
22723925Sgibbs
22823925Sgibbs			if ((include_dir->quoted_includes_only == TRUE)
22923925Sgibbs			 && (type != QUOTED_INCLUDE))
23023925Sgibbs				continue;
23123925Sgibbs
23223925Sgibbs			snprintf(fullname, sizeof(fullname),
23323925Sgibbs				 "%s/%s", include_dir->directory, file_name);
23423925Sgibbs
23523925Sgibbs			if ((newfile = fopen(fullname, "r")) != NULL)
23623925Sgibbs				break;
23723925Sgibbs                }
23823925Sgibbs        }
23923925Sgibbs
24023925Sgibbs	if (newfile == NULL) {
24123925Sgibbs		perror(file_name);
24223925Sgibbs		stop("Unable to open input file", EX_SOFTWARE);
24323925Sgibbs		/* NOTREACHED */
24423925Sgibbs	}
24526997Sgibbs
24626997Sgibbs	if (type != SOURCE_FILE) {
24726997Sgibbs		include = (include_t *)malloc(sizeof(include_t));
24826997Sgibbs		if (include == NULL) {
24926997Sgibbs			stop("Unable to allocate include stack entry",
25026997Sgibbs			     EX_SOFTWARE);
25126997Sgibbs			/* NOTREACHED */
25226997Sgibbs		}
25326997Sgibbs		include->buffer = YY_CURRENT_BUFFER;
25426997Sgibbs		include->lineno = yylineno;
25526997Sgibbs		include->filename = yyfilename;
25626997Sgibbs		SLIST_INSERT_HEAD(&include_stack, include, links);
25723925Sgibbs	}
25823925Sgibbs	yy_switch_to_buffer(yy_create_buffer(newfile, YY_BUF_SIZE));
25923925Sgibbs	yylineno = 1;
26023925Sgibbs	yyfilename = strdup(file_name);
26123925Sgibbs}
26223925Sgibbs
26323925Sgibbsint
26423925Sgibbsyywrap()
26523925Sgibbs{
26623925Sgibbs	include_t *include;
26723925Sgibbs
26823925Sgibbs	yy_delete_buffer(YY_CURRENT_BUFFER);
26923925Sgibbs	(void)fclose(yyin);
27023925Sgibbs	if (yyfilename != NULL)
27123925Sgibbs		free(yyfilename);
27226997Sgibbs	yyfilename = NULL;
27323925Sgibbs	include = include_stack.slh_first;
27423925Sgibbs	if (include != NULL) {
27523925Sgibbs		yy_switch_to_buffer(include->buffer);
27623925Sgibbs		yylineno = include->lineno;
27723925Sgibbs		yyfilename = include->filename;
27823925Sgibbs		SLIST_REMOVE_HEAD(&include_stack, links);
27923925Sgibbs		free(include);
28023925Sgibbs		return (0);
28123925Sgibbs	}
28223925Sgibbs	return (1);
28323925Sgibbs}
284