aicasm_scan.l revision 54211
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 54211 1999-12-06 18:23:31Z gibbs $ 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; 20323925Sgibbs SLIST_ENTRY(include) links; 20423925Sgibbs}include_t; 20523925Sgibbs 20623925SgibbsSLIST_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