首页 > 其他分享 >编译原理实验二 使用lex创建词法分析器

编译原理实验二 使用lex创建词法分析器

时间:2023-06-17 22:55:28浏览次数:35  
标签:return 分析器 zA 词法 lex include

实验二直接上代码吧,其实我也不怎么知道哪里是致命的,课上听老师的课后,将代码写上,但是运行在环境里面还是不行,把注释去掉就可以了,不知道会不会是注释的问题

%{

#include <stdio.h>
#include "define.h"

int lineno = 1;	
TokenType id2keyword(const char* token);

%}

newline		\n
whitespace	[ \t]+
id  [a-zA-Z_]+[a-zA-Z0-9_]*
num ([1-9]+[0-9]*)|([1-9])|0 

%%

":="			{ return ASSIGN; }
"="				{ return EQ;}
"<"				{ return LT; }
"+"				{ return PLUS; }
"-"				{ return MINUS; }
"*"				{ return TIMES; }
"/"				{ return OVER; }
"("				{ return LPAREN; }
")"				{ return RPAREN; }
";"				{ return SEMI; }
{id}            { 
                 	return id2keyword(yytext);
                 } 
{num}           { return NUM; } 

{newline}		{ lineno++; }
{whitespace}	{  }

"{"				{
				
					
					
					char c;
					do
					{
						c = input();
						if(c == EOF)
						{
							return ERROR;
						}
						else if(c == '\n')
							lineno++;
						else if(c == '}')
							break;
					}while(1);
					

				}
				
.				{ return ERROR; }


%%


void printToken(TokenType token,char* tokenString);


int main(int argc, char* argv[])
{
	TokenType tt;
	

	if(argc < 2)
	{
		printf("Usage: scan.exe filename.\n");
		return 1;
	}

	FILE* file = fopen(argv[1], "rt");
	if(NULL == file)
	{
		printf("Can not open file \"%s\".\n", argv[1]);
		return 1;
	}
	

	yyin = file;
	
	
	while((tt = yylex()) != 0)
	{
			
		printToken(tt, yytext);
		if(tt==ERROR)
		break;
	}
	
		fclose(file);	
	
	return 0;
}


typedef struct _KeyWord_Entry
{
	const char* word;
	TokenType type;
}KeyWord_Entry;

static const KeyWord_Entry key_table[] =
{
	{ "if", 	IF 		},
    { "then",	THEN	},
    { "else",	ELSE	},
    { "end",	END		},
    { "repeat",	REPEAT	},
    { "until",	UNTIL	},
    { "read",	READ	},
    { "write", WRITE     }
};


TokenType id2keyword(const char* id)
{
	int i;
	for (i = 0; i < 8; i++)
	{
		if (!strcmp(id, key_table[i].word))
			return key_table[i].type;
			
		
	}
	return ID;

}


void printToken(TokenType token,char* tokenString)
{
	switch (token)
	{
	    
		case IF:        
			printf("line%2d:  %-6d%-10s%s\n", lineno,IF,"IF", "if");
			break;
		case THEN:     
			printf("line%2d:  %-6d%-10s%s\n", lineno,THEN, "THEN","then");
			break;
		case ELSE:        
			printf("line%2d:  %-6d%-10s%s\n",lineno, ELSE, "ELSE" "else");
			break;
		case END:       
			printf("line%2d:  %-6d%-10s%s\n", lineno,END,"END", "end");
			break;
		case REPEAT:     
			printf("line%2d:  %-6d%-10s%s\n", lineno,REPEAT,"REPEAT", "repeat");
			break;
		case UNTIL:      
			printf("line%2d:  %-6d%-10s%s\n", lineno,UNTIL,"UNTIL", "until");
			break;
		case READ:       
			printf("line%2d:  %-6d%-10s%s\n",lineno, READ,"READ", "read");
			break;
		case WRITE:       
			printf("line%2d:  %-6d%-10s%s\n",lineno, WRITE, "WRITE", "write");
			break;
		case ASSIGN:      
			printf("line%2d:  %-6d%-10s%s\n",lineno, ASSIGN,"ASSIGN", ":=");
			break;
		case LT:          
			printf("line%2d:  %-6d%-10s%s\n",lineno, LT,"LT", "<");
			break;
		case EQ:           
			printf("line%2d:  %-6d%-10s%s\n", lineno,EQ, "EQ","=");
			break;
		case LPAREN:        
			printf("line%2d:  %-6d%-10s%s\n", lineno,LPAREN," LPAREN" ,"(");
			break;
		case RPAREN:        
			printf("line%2d:  %-6d%-10s%s\n", lineno,RPAREN,"RPAREN", ")");
			break;
		case SEMI:        
			printf("line%2d:  %-6d%-10s%s\n", lineno,SEMI,"SEMI", ";");
			break;
		case PLUS:       
			printf("line%2d:  %-6d%-10s%s\n", lineno,PLUS, "PLUS","+"); 
			break;
		case MINUS:       
			printf("line%2d:  %-6d%-10s%s\n", lineno,MINUS, "MINUS","-");
			break;
		case TIMES:       
			printf("line%2d:  %-6d%-10s%s\n", lineno,TIMES, "TIMES","*");
			break;
		case OVER:         
			printf("line%2d:  %-6d%-10s%s\n", lineno,OVER,"OVER", "/");
			break;
		case ENDFILE:       
			printf("line%2d:  %-6d%-10s%s\n", lineno,ENDFILE,"ENDFILE", "endfile");
			break;
		case NUM: 
			printf("line%2d:  %-6d%-10s%s\n", lineno,NUM,"NUM", tokenString);
			break;
		case ID:  
			printf("line%2d:  %-6d%-10s%s\n", lineno,ID, "ID",tokenString);
			break;
         case ERROR:  
			printf("line%2d:  %-6d%-10s\n", lineno,ERROR, "ERROR");
			break;
		default: return ;
			

	}
}

标签:return,分析器,zA,词法,lex,include
From: https://www.cnblogs.com/hellciw/p/17488438.html

相关文章

  • tmux -- terminal multiplexer
    概念https://www.ruanyifeng.com/blog/2019/10/tmux.htmlSSH登录后,使用tmux可以保留回话,即使关闭终端。同一个回话可以被多个终端共享,分享屏幕,主机开启一个tmux,远程机器SSH登录主机,使用tmuxattach此回话。 命令行的典型使用方式是,打开一个终端窗口(terminalwindow,以下简......
  • 自然语言处理 Paddle NLP - 词法分析技术及其应用
    词法分析就是利用计算机对自然语言的形态(morphology)进行分析,判断词的结构和类别等。”简单而言,就是分词并对每个词进行分类,包括:分词、词性标注、实体识别三个任务问答知识图谱,类似一张表,里面放了姚明(人)、妻子(属性)对应的是谁这张表来源于网页挖掘,也是词法分析,进行对应......
  • 关于display:flex;justify-content: space-between;的最后一个元素无法左对齐的问题解
    1.问题:当使用v-for遍历一个数组,当数字长度不是要进行左右对齐的数字的倍数*(以3为例),无法进行左对齐的问题 解决方法:1.使用watch监听这个数组的长度的变化,判断这个数组的长度是否3%2是不是等于0,如果是为则这个数字追加一个空对象,代码如下:watch:{rowsForm:{......
  • ScheduledThreadPoolExecutor模仿学习
     publicinterfaceCBlockingQueue<E>{booleanadd(Ee);Etake();} importjava.util.concurrent.Delayed;importjava.util.concurrent.FutureTask;importjava.util.concurrent.RunnableScheduledFuture;importjava.util.concurrent.TimeUnit;......
  • 自己动手写编译器:词法解析的系统化研究
    在前面章节中,我们千辛万苦的做了一个可以将部分c语言代码进行解析并编译成中间语言的微型编译器,通过实践我们对编译技术的整体架构和实现原理有了一定的感性认识,实现了“没吃过猪肉但见过猪跑”,从本节开始,我们正式进入“吃猪肉”的过程,我们将非常系统的去研究编译原理各部分理论和......
  • springcloud 启动失败 YAMLException java.nio.charset.MalformedInputException Inp
     上面这个是错误信息,但是该微服务在本地启动的时候是可以的,但是本地打成jar包本地执行的时候就失败。需要再Java-jar的中间加一下字符编码java-Dfile.encoding=utf-8-jar  myself.jar   myself.jar是自己的jar包问题解决......
  • 前端弹性布局神器display:flex【转】
    本文内容摘自博文:https://www.cnblogs.com/qingchunshiguang/p/8011103.html、https://blog.csdn.net/ababab12345/article/details/119612918在进行网页前端设计时,需要垂直居中显示文本,但CSS似乎没有明确的垂直居中的代码方法,由于目前的页面不再考虑以前的浏览器了,因此采用CSS3......
  • 编译原理:词法分析实验
    实验二词法分析实验目的根据PL/0语言的文法规范,编写PL/0语言的词法分析程序。通过设计调试词法分析程序,实现从源程序中分出各种单词的方法;加深对课堂教学的理解;提高词法分析方法的实践能力。掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的法。掌......
  • ALEXA排名代表什么?网站ALEXA排名怎么查询?
    ALEXA排名是根据一个站点的流量数据来列出的排名,排名越靠前,说明该网站的流量越大,被访问的次数也越多。 ......
  • Rust - 接口设计建议之灵活(flexible)
    Rust-接口设计建议之灵活(flexible)灵活(flexible)代码的契约(Contract)你写的代码包含契约契约:要求:代码使用的限制承诺:代码使用的保证设计接口时(经验法则):避免施加不必要的限制,只做能够兑现的承诺增加限制或取消承诺:重大的语义版本更改可导致其他代码出问题放......