【编译原理课程设计】词法分析程序设计

【实验目的】

(1)理解词法分析在编译程序中的作用

(2)加深对有穷自动机模型的理解

(3)掌握词法分析程序的实现方法和技术

【实验内容】

对一个简单语言的子集编制一个一遍扫描的词法分析程序。

【实验要求】

(1)待分析的简单语言的词法

1) 关键字

begin  if  then  while  do  end

2) 运算符和界符

:=  +  -  *  /  <  <=  >  >=  <>  =  ;  (  )  #

3) 其他单词是标识符(ID)和整形常数(NUM),通过以下正规式定义:

ID=letter(letter|digit)*

NUM=digitdigit*

4) 空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM、运算符、界符和关键字,词法分析阶段通常被忽略。

(2)各种单词符号对应的种别编码


单词符号


种别码


单词符号


种别码


begin


1


:


17


if


2


:=


18


then


3


<


20


while


4


<>


21


do


5


<=


22


end


6


>


23


letter(letter|digit)*


10


>=


24


digitdigit*


11


=


25


+


13


;


26


-


14


(


27


*


15


)


28


/


16


#


0

(3)词法分析程序的功能

输入:所给文法的源程序字符串

输出:二元组(syn,token或sum)构成的序列。

syn为单词种别码;

token为存放的单词自身字符串;

Sum 为整形常数。

例如:对源程序begin x:=9;if x>0 then x:=2*x+1/3;end# 经词法分析后输出如下序列:(1,begin)(10,’x’) (18,:=) (11,9) (26,;) (2,if)……

直接上代码

  1 #include<iostream>
  2 using namespace std;
  3 bool is_digit(char ch);
  4 bool is_letter(char ch);
  5 char example[10000]; //缓冲区
  6 char token[10]; //标识符
  7 int syn, sum;
  8 const char* keyword[10] = { "begin","if","then","while","do","end" }; //关键字
  9 int example_p;//缓冲区指针
 10 int token_p;//标识符指针
 11 char ch;
 12
 13 //扫描
 14 void scan() {
 15
 16     memset(token, 0, sizeof(token)); //数组清零
 17     token_p = 0;
 18     while (ch ==‘ ‘) {
 19         example_p++;
 20         ch = example[example_p];
 21     }
 22
 23     //字符是数字
 24     if (is_digit(ch)) {
 25         sum = 0;
 26         //检索数字
 27         while (is_digit(ch)) {
 28             //得到结果
 29             sum = sum * 10 + ch - ‘0‘;  //将字符转换成数字
 30             example_p++;
 31             ch = example[example_p];
 32             syn = 11;
 33         }
 34
 35     }
 36     //字符是字母
 37     else if (is_letter(ch)) {
 38         //检索标识符、关键字
 39         while (is_digit(ch) || is_letter(ch)) {
 40             token[token_p] = ch;
 41             token_p++;
 42             example_p++;
 43             ch = example[example_p];
 44         }
 45
 46
 47         token[token_p] = ‘\0‘;
 48         token_p++;
 49         syn = 10;
 50         //比对标识符和关键字
 51         for (int i = 0;i < 6;i++) {
 52             if (strcmp(token, keyword[i]) == 0) {
 53                 syn = i + 1;
 54                 break;
 55             }
 56         }
 57     }
 58     //其他情况
 59     else {
 60         switch (ch){
 61         case ‘#‘:
 62             syn = 0;
 63             token[0] = ch;
 64             break;
 65         case ‘+‘:
 66             syn = 13;
 67             token[0] = ch;
 68             example_p++;
 69             ch = example[example_p];
 70             break;
 71         case ‘-‘:
 72             syn = 14;
 73             token[0] = ch;
 74             example_p++;
 75             ch = example[example_p];
 76             break;
 77         case ‘*‘:
 78             syn = 15;
 79             token[0] = ch;
 80             example_p++;
 81             ch = example[example_p];
 82             break;
 83         case ‘/‘:
 84             syn = 16;
 85             token[0] = ch;
 86             example_p++;
 87             ch = example[example_p];
 88             break;
 89
 90         case ‘:‘:
 91             syn = 17;
 92             token_p = 0;
 93             token[token_p] = ch;
 94             token_p++;
 95             example_p++;
 96             ch = example[example_p];
 97             if (ch == ‘=‘) {
 98                 token[token_p] = ch;
 99                 token_p++;
100                 syn = 18;
101                 example_p++;
102                 ch = example[example_p];
103             }
104             break;
105
106         case ‘<‘:
107             syn = 20;
108             token_p = 0;
109             token[token_p] = ch;
110             token_p++;
111             example_p++;
112             ch = example[example_p];
113             if (ch == ‘>‘) {
114                 token[token_p] = ch;
115                 token_p++;
116                 syn = 21;
117                 example_p++;
118                 ch = example[example_p];
119             }
120             if (ch == ‘=‘) {
121                 token[token_p] = ch;
122                 token_p++;
123                 syn = 22;
124                 example_p++;
125                 ch = example[example_p];
126             }
127             break;
128         case ‘>‘:
129             syn = 23;
130             token_p = 0;
131             token[token_p] = ch;
132             token_p++;
133             example_p++;
134             ch = example[example_p];
135             if (ch == ‘=‘) {
136                 token[token_p] = ch;
137                 token_p++;
138                 syn = 24;
139                 example_p++;
140                 ch = example[example_p];
141             }
142             break;
143         case ‘=‘:
144             syn = 25;
145             token[0] = ch;
146             example_p++;
147             ch = example[example_p];
148             break;
149         case ‘;‘:
150             syn = 26;
151             token[0] = ch;
152             example_p++;
153             ch = example[example_p];
154             break;
155         case ‘(‘:
156             syn = 27;
157             token[0] = ch;
158             example_p++;
159             ch = example[example_p];
160             break;
161         case ‘)‘:
162             syn = 28;
163             token[0] = ch;
164             example_p++;
165             ch = example[example_p];
166             break;
167
168         }
169
170     }
171
172
173
174 }
175 //字符是数字
176 bool is_digit(char ch) {
177     if (ch >= ‘0‘&&ch <= ‘9‘)
178         return true;
179     else
180         return false;
181 }
182 //字符是字母
183 bool is_letter(char ch) {
184     if((ch>=‘a‘&&ch<=‘z‘)||(ch>=‘A‘&&ch<=‘Z‘))
185         return true;
186     else
187         return false;
188 }
189 int main() {
190     example_p = 0;
191     char str;
192     do {
193         str = getchar();
194         example[example_p] = str;
195         example_p++;
196     } while (str != ‘#‘);
197
198     example_p = 0;
199     ch = example[example_p];
200
201
202     do {
203         scan();
204         switch (syn) {
205         case 11:
206             cout <<"("<< syn << "," << sum <<")"<< endl;
207             break;
208         default:
209             cout <<"("<< syn << "," << token<<")"<<endl;
210         }
211     } while (syn != 0);
212
213
214     system("pause");
215
216     return 0;
217 }

原文地址:https://www.cnblogs.com/h-jang/p/12150319.html

时间: 2024-11-07 14:41:03

【编译原理课程设计】词法分析程序设计的相关文章

编译原理课程设计——语法分析器

实验目的 了解掌握算符优先分析的基本方法.内容:学会科学思考并解决问题,提高程序设计能力. 实验内容与要求 用算符优先分析方法设计一个分析解释程序,对输入的赋值语句.输出语句.清除语句进行词法分析.语法分析.表达式求值并存储于指定变量中:若存在错误,提示错误相关信息. 文法表示 S -> v=E | E? | clear E -> E+T | E–T | T T -> T*F | T/F | F F -> (E) | v | c 问题分析 由于要求用算符优先分析方法来进行程序的语法

哈工大软件学院编译原理实验1——词法分析

这次实验被"过来人"们定位非常easy,实验内容例如以下: ----------------------------------------------------------------------------------- 对例如以下工作进行展开描写叙述 (1) 给出语言的词法规则描写叙述 · 标识符.keyword.整常数.字符常数.浮点常数 · 单界符:+,-,×,;,- · 双界符:/*,:=,>=,<=,!=,- · 凝视 (2) 针对这样的单词的状态转换图和程

编译原理课程作业1 消除无用产生式

前言: 一年前在知乎上看到一个回答,答主说自己学了两天Python,用十几个小时做完了全部的编译原理课程作业,当时吓傻了我,现在看来,虽然两天学会比不上,但Python做课程作业的速度简直是快,课程作业1里我还傻傻的用list的extend和append,加上set函数,到第二次作业里我才发现, 没有什么结构体是一个list不能解决的,如果有,那就再套一个list 课程作业题: 消除无用产生式 # -*- coding: utf-8 -*- class Solution: def __init_

词法分析器——哈工大编译原理课程(一)

词法分析器——哈工大编译原理课程(一) 程序输入:从code.txt文件中读取内容 程序输出:识别出的单词序列,格式为:(种别码,属性值) ①对于关键字和运算符.分隔符来说,输出格式为(种别码,0),因为每个种别码能唯一地标识出是哪个单词 ②对于标识符来说,输出格式为(id的种别码即36,在哈希桶中的位置) ③对于常量(整数.浮点数.字符串)来说,输出格式为(种别码,在数组中的位置) 1 #include<stdio.h> 2 #include<stdlib.h> 3 #inclu

Java 实现《编译原理》简单词法分析功能

Java 实现<编译原理>简单词法分析功能 简易词法分析功能 要求及功能 (1)读取一个 txt 程序文件(最后的 # 作为结束标志,不可省去) { int a, b; a = 10; if(a>=1){ b = a + 20; } } (2)词法识别分析表 单词类别|单词自身值|内部编码 -|-|- 关键字| int.for.while.do.return.break.continue| 1 标识符| 除关键字外的以字母开头,后跟字母.数字的字符序列| 2 常数| 无符号整型数| 3

哈工大2015秋 编译原理课程实验1:词法分析

经过一年的C#的历练,确实算是挺喜欢C#的了,这次的编译原理尤为用心.既已提交作业,便拿出来共享一下,或许某学弟学妹能看到呢[偷笑]. 图1 项目资源管理器截图 工程: | Class.cs 主要是Record ErrorRecord Data类的定义,存储词法分析的结果 | Form1.cs WinForm窗体 | Program.cs 自动生成的主程序 | test.cs 主要参与运算的类,通过字符的判断将分析结果及错误提示存储到Data类 运行截图: 图2 运行截图 保存文件: 图3 项目

0909关于编译原理课程的认识

1.编译原理学什么?编译原理是学习编译技术的基本理论和实现技术,包括语言文法的基本知识.词法分析.语法分析.语义分析及中间代码.目标代码生成等内容: 2.为什么学编译原理?可以使我们学生既掌握编译理论和方法方面的基本知识,而且也获得设计.实现.分析.和移植编译程序方面的初步能力: 3怎么学编译原理?首先要巩固先前所学习的c,数据结构等课程,以及即将要学习的离散数学,多提疑问,多参考有关书籍,借助互联网等工具与人交流. 4.思考:在没有学习本书理论之前,如果让你写一个编译器,你是什么思路?    

编译原理小作业词法分析程序

词法分析程序所参照的编码如70页表3.3 (<编译技术>张莉等著.--北京:高等教育出版社,2016.9.ISBN: 978-7-04-046317-0) 用Java语言实现如下: 1 import java.io.IOException; 2 import java.util.Arrays; 3 import java.util.HashMap; 4 import java.util.Map; 5 6 class Code{ 7 public static final int BEGINSY

编译原理实验之词法分析

能识别小数,科学记数法表示的数. 不多解释,代码先上: #include <cstdio> #include <iostream> #include <string> #include <cstring> #include <algorithm> #include <cctype> #include <fstream> #include <map> #include <cstdlib> #inclu