一个IF的词法分析器

最近在学习编译原理,用图转移算法写了一个IF的词法分析器,本来觉得原理挺简单的,没想到还鼓弄了一天才弄出来,这里把写的代码放这里记录下

通过myfile.txt输入。输入与输出如下

输入:

ifx if iif       if  234

iff     if

输出

代码如下,

  1 #include<stdio.h>
  2 #include<memory.h>
  3 #include<stdlib.h>
  4
  5 enum kind {IF, ID, NUM};
  6
  7 typedef struct{
  8     enum kind k;
  9     char lexeme[10];
 10     int line[2];
 11 }token;
 12
 13 typedef struct ListNode{
 14     token val;
 15     struct ListNode *next;
 16 }node;
 17
 18 void Printnode(node *head);
 19 void Freenode(node *head);
 20
 21 // Buildtoken using link to store tokens
 22 node * Buildtoken(node *cur, char *buf, int linenum)
 23 {
 24     int buf_index = 0;
 25     int lexeme_index = 0;
 26     int status = -1;
 27     //node *head = cur;
 28
 29     cur->val.line[0] = linenum;
 30     while(buf[buf_index] == ‘ ‘)
 31         buf_index++;
 32     cur->val.line[1] = buf_index+1;
 33
 34 status3:
 35     if((‘0‘ <= buf[buf_index]) && (buf[buf_index] <= ‘9‘))
 36         status = 0;
 37
 38     if(((‘A‘ <= buf[buf_index]) && (buf[buf_index] <= ‘Z‘))
 39         || (‘a‘ <= buf[buf_index] &&  buf[buf_index] <= ‘h‘)
 40         || (‘j‘ <= buf[buf_index] && buf[buf_index] <= ‘z‘) )
 41         status = 1;
 42
 43     if(buf[buf_index] == ‘i‘)
 44         status = 2;
 45
 46     switch (status)
 47     {
 48         case 0:
 49             cur->val.k = NUM;
 50             cur->val.lexeme[lexeme_index++] = buf[buf_index++];
 51             while(‘0‘ <= buf[buf_index] && buf[buf_index] <= ‘9‘)
 52             {
 53                  cur->val.lexeme[lexeme_index++] = buf[buf_index];
 54                 buf_index++;
 55             }
 56
 57             if(((‘A‘ <= buf[buf_index]) && (buf[buf_index] <= ‘Z‘))
 58                     || (‘a‘ <= buf[buf_index] &&  buf[buf_index] <= ‘z‘))
 59             {
 60                  cur->val.lexeme[lexeme_index++] = buf[buf_index];
 61                 buf_index++;
 62                 goto status1;
 63             }
 64
 65             break;
 66         case 1:
 67     status1:
 68             cur->val.k = ID;
 69
 70             while(((‘A‘ <= buf[buf_index]) && (buf[buf_index] <= ‘Z‘))
 71                     || (‘a‘ <= buf[buf_index] &&  buf[buf_index] <= ‘z‘))
 72             {
 73                  cur->val.lexeme[lexeme_index++] = buf[buf_index];
 74                 buf_index++;
 75             }
 76             goto status2;
 77             break;
 78         case 2:
 79             cur->val.k = IF;
 80             cur->val.lexeme[lexeme_index++] = buf[buf_index++];
 81             if(buf[buf_index] == ‘f‘)
 82             {
 83                 cur->val.lexeme[lexeme_index++] = buf[buf_index++];
 84             }
 85             if(((‘A‘ <= buf[buf_index]) && (buf[buf_index] <= ‘Z‘))
 86                     || (‘a‘ <= buf[buf_index] &&  buf[buf_index] <= ‘z‘))
 87                 goto status1;
 88             goto status2;
 89             break;
 90         default:
 91     status2:
 92             while(buf[buf_index] == ‘ ‘)
 93             {
 94                 buf_index++;
 95             }
 96             if(buf[buf_index] == ‘\n‘ || buf[buf_index] == EOF)
 97             {
 98                 return cur;
 99             }
100             cur->next = malloc(sizeof(node));
101             cur = cur->next;
102             cur->next = NULL;
103             cur->val.line[0] = linenum;
104             cur->val.line[1] = buf_index + 1;
105             lexeme_index = 0;
106             status = -1;
107         goto status3;
108     }
109     return cur;
110 }
111
112 //Print nodes
113 void Printnode(node *head)
114 {
115     node *cur = head;
116     while(cur != NULL)
117     {
118         switch (cur->val.k)
119         {
120             case IF:
121                 printf("IF (%d, %d)\n", cur->val.line[0], cur->val.line[1]);
122                 break;
123             case ID:
124                 printf("ID(%s)  (%d, %d)\n", cur->val.lexeme,cur->val.line[0], cur->val.line[1]);
125                 break;
126             case NUM:
127                 printf("NUM(%s)  (%d, %d)\n", cur->val.lexeme,cur->val.line[0], cur->val.line[1]);
128                 break;
129             default:
130                 break;
131         }
132         cur = cur->next;
133     }
134 }
135
136 // because link is used by malloc, this function free these nodes
137 void Freenode(node *head)
138 {
139     node *cur = head;
140     node *prenode = cur;
141     while(cur != NULL)
142     {
143         prenode = cur;
144         cur = cur->next;
145         free(prenode);
146     }
147 }
148
149 int main(void)
150 {
151     FILE *pFile;
152     char buf[100];
153     int linenum = 1;
154     node *cur;
155     node* head = malloc(sizeof(node));
156     node *prenode = NULL;
157
158     if(head == NULL)
159     {
160         printf("out of memory\n");
161         exit(1);
162     }
163     cur = head;
164     cur->next = NULL;
165     pFile = fopen("myfile.txt", "r");
166     if(pFile == NULL)
167         perror("Error opening file");
168
169     // read one line each time
170     while(fgets(buf, 100, pFile) != NULL)
171     {
172         cur = Buildtoken(cur, buf, linenum);
173         linenum++;
174         memset(buf, ‘\0‘, 100);
175         cur->next = malloc(sizeof(node));
176         prenode = cur;
177         cur = cur->next;
178     }
179
180     prenode->next = NULL;
181     free(prenode);
182     Printnode(head);
183     Freenode(head);
184
185     fclose(pFile);
186
187     return 0;
188 }
时间: 2024-10-23 16:47:34

一个IF的词法分析器的相关文章

简易词法分析器

最近开始学习编译器,希望能坚持下去,通过做编译器也把c++练好点,今天花了一天做了一个简单的词法分析器,过几天编译原理书到了后,希望能通过看书得到更好的方法. //learn.cpp #include <iostream> #include "learn.h" #include <fstream> using namespace std; static char *st_line; static int st_line_pos; int length; type

编译器实践 二 之 小型的词法分析器

下面是一个简单的词法分析器 #include <stdio.h> #include <string.h> using namespace std ; int main() { char str[150] ; // freopen("C:\\Users\\Lionel\\Desktop\\1.txt","r",stdin) ; int row = 1 , cow = 0 ; while(gets(str)) { char temp[10] ;

java实现的简单词法分析器

一个简单的词法分析器 词法分析(Lexical Analysis) 是编译的第一阶段.词法分析器的主要任务是读入源程序的输入字符.将他们组成词素,生成并输出一个词法单元序列,每个词法单元对应一个词素.这个词法单元序列被输出到语法分析器进行语法分析. 有关原理的介绍参考http://www.cnblogs.com/yanlingyin/archive/2012/04/17/2451717.html 这里就不多说了. 下面直接代码,相关注释在代码中均已经给出,对字符串的处理完全按照自己的思路编写的.

全文索引--两种中文词法分析器比较(chinese_vgram_lexer chinese_lexer)

首先让我们进行一个关于中文词法分析器的比较,测试过程如下: 建表 create table test (str varchar2(100)) ; create table test1(str varchar2(100)) ; 插入数据 insert into test values ('中华人员共和国') ; insert into test1values ('中华人员共和国') ; 创建两个关于中文的分析器 exec ctx_ddl.create_preference('my_lexer','

词法分析作业

实验一.词法分析实验 专业   姓名  学号 一.        实验目的       编制一个词法分析程序 二.        实验内容和要求 输入:源程序字符串 输出:二元组(种码,单词符号本身). 三.        实验方法.步骤及结果测试   1.     源程序名:压缩包文件(rar或zip)中源程序名cifafenxiqi.c 可执行程序名:cifafenxi.exe 2.     原理分析及流程图 主要总体设计问题. (包括存储结构,主要算法,关键函数的实现等) 3.     主

HUSTOJ--SIM介绍

说到SIM,真真的被Dick Grune这老教授折服了,以前一直以为自己的C语言跟编译原理学的蛮好的,现在才察觉,无知真的很可怕.所谓的大学课堂,就好像一本书的绪论.应该没有几个人在看完了一本书的绪论后就对这本书的内容了如指掌了吧!更何况我们所学的是一门发展了几十甚至上百千年的学科. SIM是一个检测计算机程序相似性的实用程序,当然在后期的发展中也有扩展到对文本相似度的判别.其核心的思想其实就是我们常说的LCS(最长公共子序列). 它对于检测一大部分的程序作业抄袭有用.这个软件是一个项目构建工具

词法分析实战

题目: 在这部分中,你将使用图转移算法手工实现一个小型的词法分析器. * 分析器的输入:存储在文本文件中的字符序列,字符取自ASCII字符集.文件中可能包括四种记号:关键字if.符合C语言标准的标识符.空格符.回车符\n. * 分析器的输出:打印出所识别的标识符的种类.及行号.列号信息. 根据题目的要求,定义如下的Token类: enum TokenType{ TT_ID, TT_IF }; class Token { public: Token(){} Token(TokenType _t,

各种实用的 PHP 开源库推荐【转】

转自: https://my.oschina.net/editorial-story/blog/882780 PHP 是一种通用开源脚本语言.语法吸收了 C 语言.Java 和 Perl 的特点,利于学习,使用广泛,主要适用于 Web 开发领域,是大多数后端开发者的首选.PHP 作为最受欢迎的编程语言之一,经常出现在各大语言之战中,但到底谁是最好的编程语言呢?这不是文章要讨论的内容:) 本文从众多 PHP 开源库中选出了几款实用有趣的工具,希望对你的学习工作有帮助. 1.PHP 日志工具 Mon

表达式求值:从“加减”到“带括号的加减乘除”的实践过程

本文乃Siliphen原创,转载请注明出处:http://blog.csdn.net/stevenkylelee ● 为什么想做一个表达式求值的程序 最近有一个需求,策划想设置游戏关卡的某些数值,这个数值不是一个常量,而是根据关卡的某些环境数据套上一个计算表达式算出来的.这个需求无法用excel拖表预计算出,因为关卡的环境数据只有在游戏中才能产生,在excel制表时,这些都是未知的.作为程序员,我可以把计算表达式硬编码在代码中,但这个做法有缺陷,如果策划要修改计算表达式的话,只能通过我修改程序并