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

📄 c--.l

📁 c—语言的句法分析器。读入一个C--语言程序
💻 L
字号:
%{
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include 	<stdlib.h>
#include  "y.tab.h"
#define HASHLEN 1024
int nline = 1;

struct id_entry {
	char * id;
	struct id_entry *next; /* next entry on hash chain */
};

struct id_entry * id_hash_table[HASHLEN];

int hash(char * name) 
{
  int h = *name++;
  while (*name) h = h << 4 + *name++;
  return h;
}

char * insert_id(char *name)
{ int h = hash(name) & (HASHLEN-1);
  struct id_entry *p=id_hash_table[h];
  while (p && (strcmp(p->id, name) != 0)) p = p->next;
  if (p) return p->id;
  p = (struct id_entry *)malloc(sizeof *p);
  p->id = (char *)malloc(strlen(name)+1);
  strcpy(p->id, name);
  p->next = id_hash_table[h];
  id_hash_table[h] = p; /* 新名字在表头 */
  return p->id;
}  

%}

/*正规定义*/
delim      [ \t]
ws         {delim}+
leter      [A-Za-z]                                        
digit      [0-9]
id         {leter}({leter}|{digit})*  
number     {digit}+(\.{digit}+)?(E[+\-]?{digit}+)?          
comment    (\#[^\n]*)|(\/\*(((\*)*[^\*\/]+(\/)*)*|(\*)*|(\/)*)\*\/)|(\/\/[^\n]*)
sentence   \"(.)*\"
chartype   (\'([^\n]|\n)\')|\'\'
special    [\@\~\\\$\`]    
%%
"\n"          { nline++;}
{comment}  {/*对预处理和注释部分没有动作和返回值*/}
{ws}       {/*对空白串没有动作和返回值*/}
{number}   { yylval._ident = insert_id(yytext); return NUM;}
"__stdcall" {return STDCALL;}
{chartype}  { yylval._op=yytext[0]; return CHARATER;}
{sentence}  { yylval._ident=yytext; return STRING ;}
"__cdecl"   {return CDECL;}
"if"   {return IF;}
"int"   {return INT;}
"void"   {return VOID;}
"char"   {return CHAR;}
"else"   {return ELSE;}
"while"   {return WHILE;}
"return"   {return RETURN;}
{id}       { yylval._ident = insert_id(yytext); return ID;}
"<="       {return LE;}
">="       {return GE;}
"<"        {return LT;}
">"        {return GT;}
"!="       {return NE;}
"=="       {return EQ;}
[+-]	   {yylval._op = yytext[0]; return ADDOP;}
.          { return yytext[0]; }
%%

error(char *m)
{
     fprintf(stderr,"%s\n",m);
     exit(1);         /*非正常终止*/
}

int yywrap(){return 1;}




⌨️ 快捷键说明

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