⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scan_conf.l

📁 這是一個arm模擬器 以C++實做 主要模擬ARM9架構
💻 L
字号:
/*************************************************************************    Copyright (C) 2002 - 2007 Wei Qin    See file COPYING for more information.    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 2 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.*************************************************************************/%{#include <cstring>#include <cstdio>#include <cctype>#include <vector>#include "parse_conf.hpp"int mylineno;static std::vector<char> *lex_str(char *val, unsigned int len);#define YY_NO_UNPUT#define yyin conf_in%}%option noyywrapD       [0-9]L       [a-zA-Z_]E       [Ee][+-]?{D}+DECNUM  [1-9][0-9]*|0HEXNUM  0[xX][0-9a-fA-F]+WHITES  [ \t]*IDENT   [a-zA-Z_][a-zA-Z_0-9]*PATH	[a-zA-Z_0-9/\.\-]+STR		\"(\\.|[^\\"])*\"%x comment%x directive%%"cpu"				return CPU;"mach"				return MACH;"mem_bank"			return MEM;"map"				return MAP;"type"				return TYPE;"address"			return ADDR;"addr"				return ADDR;"size"				return SIZE;"image"				return IMG;"elf32"				return ELF;"value"				return VAL;"preload"			return PRE;"reginit"			return REG;":"		return COLON;";"		return SEMI;","		return COMMA;"="		return EQUAL;{STR}		conf_lval.nnstr  = lex_str(yytext, yyleng); return STR;{IDENT}		conf_lval.strval = strdup(yytext); return IDENT;{HEXNUM}	conf_lval.strval = strdup(yytext); return HCONST;{DECNUM}	conf_lval.strval = strdup(yytext); return DCONST;{PATH}		conf_lval.strval = strdup(yytext); return PATH;"/*"			BEGIN(comment);<comment>"\n"	mylineno++;<comment>.		/*ignore*/<comment>"*/"	BEGIN(INITIAL);"#"				BEGIN(directive);<directive>.	/*ignore*/<directive>"\n"	mylineno++; BEGIN(INITIAL);"\n"			mylineno++;{WHITES}		/*ignore*/<<EOF>>			return 0;.				/*ignore*/%%static char tohex(char val){	if (val>='0' && val<='9') return val - '0';	return val - 'a' + 10;}using std::vector;static vector<char> *lex_str(char *val, unsigned int len){	char tmp;	unsigned pos = 0;	vector<char> *ret = new vector<char>;	/* skip the quotes */	pos++;	len--;	while (pos < len)	{		/* escape sequence */		if (val[pos] == '\\')		{			if (++pos >= len)				goto error;			switch (val[pos])			{				case 'a': tmp = '\a'; break;				case 'b': tmp = '\b'; break;				case 'f': tmp = '\f'; break;				case 'n': tmp = '\n'; break;				case 'r': tmp = '\r'; break;				case 't': tmp = '\t'; break;				case 'v': tmp = '\v'; break;				case '\\': tmp = '\\'; break;				case '?' : tmp = '\?'; break;				case '\'': tmp = '\''; break;				case '\"': tmp = '\"'; break;				case 'x': 				{					if (pos + 2 >= len ||						!isxdigit(val[pos + 1]) || !isxdigit(val[pos + 2]))						goto error;					tmp = (tohex(val[pos + 1]) << 4) |							tohex(val[pos + 2]);					pos++;					break;				}				default:				{					if (pos + 2 >= len ||						val[pos] < '0' || val[pos] > '3' ||						val[pos+1] < '0' || val[pos+1] > '7' ||						val[pos+2] < '0' || val[pos+2] > '7')						goto error;					tmp =   ((val[pos] - '0') << 6) |							((val[pos+1] - '0') << 3)  |							(val[pos+2] - '0');					pos += 2;					break;				}			}			ret->push_back(tmp);			pos++;		}		else			ret->push_back(val[pos]);		pos++;	}	return ret;error:	fprintf(stderr, "Error parsing ASCII string, character %c, at %d:%d\n",		val[pos], mylineno + 1, pos);	delete ret;	return NULL;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -