词法分析

词法分析
词法分析

词法分析

一、实验目的

设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。

二、实验要求

2.1 待分析的简单的词法

(1)关键字:int real if then else while

(2)运算符和界符

+ - / * = == < <= > >= !=

( ) { } ;

(3)数字:

digit 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

intnumber(无符号整形)exponent fraction realnumber fraction

(4)标识符:以字母开始,不能是关键字

ID = letter (letter | digit)* NUM = digit digit*

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

2.2 各种单词符号对应的类型,值,行号,列号:

单词符号(token) 类型(type) 种别码(syn)

int 关键字 1

real 关键字 2

if 关键字 3

then 关键字 4

else 关键字 5

while 关键字 6

lettet(letter|digit)* 标识符10

dight dight* 数字11

+ 运算符13

- 运算符14

/ 运算符15

* 运算符16

= 运算符17

== 运算符18

< 运算符19

<= 运算符20

> 运算符21

>= 运算符22

!= 运算符23

( 界符24

) 界符25

{ 界符26

} 界符27

; 界符28

# 界符 0

2.3 词法分析程序的功能:

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

输出:四元组(type,token,row,line )构成的序列。 其中:token 为存放的单词自身字符串;

type 为类型 syn 为种别码

例如:对源程序int x=9;real (x>9) if x==2*x+1/3; end #的源文件,经过词法分析后输出如下序列:(类型:关键字 值:int 行号:1 列号:1…………)

6

4

2 空格/换行

字母/数字字母

非字母数字

3*

数字

数字

非数字

5*

标识符(需进一步判断是否为关键字)

数字

1#

#,结束

+

非=7*

8

+=+9

-

非=10*

11

-=

-=

=

(12...)

13

)

(词法分析状态转换图(终结状态右上角*表示多读一个符号)

三、词法分析程序的算法思想:

算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 3.1 主程序示意图:

主程序示意图如图3-1所示。其中初始包括以下两个方面: ⑴ 关键字表的初值。

关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下:

char *rwtab[6]={"int","real","if","then","else","while"};

图3-1

(2)程序中需要用到的主要变量为row,token 和sum 3.2 扫描子程序的算法思想:

首先设置3个变量:①token 用来存放构成单词符号的字符串;②sum 用来存放整型单词;③syn 是种别码,同时也是检查的依据。扫描子程序主要部分流程如图3-2所示。

置初值 调用扫描子程序 输出单词四元组 输入串结束

结束 变量初始化 忽略空格

是 是

字母

数字 其他

运算符、 符号

界符等符号

图 3-2

四、词法分析程序的C++语言程序源代码:

#include"conio.h" //包含getch 函数的头文件 #include"stdlib.h" //包含exit 函数的头文件 #include #include

char prog[80],token[8],ch; int syn, p,m,n,sum; int line=1; int row=1;

char *rwtab[6]={"int","real","if","then","else","while"}; void scaner(); void main(){ p=0; printf("\n 请输入字符串(以'#'结束):\n"); do{ scanf("%c",&ch); prog[p++]=ch;

是否文件结束? 返回

拼数

syn=11

返回 对不同符号给出相应的是syn 值 报错 拼字符串 是否关键字? syn 为对应关键字的

单词行号

syn=10

}while(ch!='#');

p=0;

do{

scaner();

switch(syn){

case 1:

case 2:

case 3:

case 4:

case 5:

case 6:printf("( 类型:关键字值:%-10s 行号:%5d 列号:%5d )\n",token,line,(row-m+1));

break;

case 10:printf("( 类型:标识符值:%-10s 行号:%5d 列号:%5d )\n",token,line,(row-m+1));

break;

case 11:printf("( 类型:数字值:%-10s 行号:%5d 列号:%5d )\n",token,line,(row-m+1));

break;

case 13:

case 14:

case 15:

case 16:

case 17:

case 18:

case 19:

case 20:

case 21:

case 22:

case 23:printf("( 类型:操作符值:%-10s 行号:%5d 列号:%5d )\n",token,line,(row-m+1));

break;

case 24:

case 25:

case 26:

case 27:

case 28:printf("( 类型:界符值:%-10s 行号:%5d 列号:%5d )\n",token,line,(row-m+1));

break;

case 30:line=line+1;

break;

case -1:printf("你输入了一个错误的字符串\n");

getch();

exit(0);default: printf("( 类型:界符值:%-10s 行号:%5d 列

号:%5d )\n",token,line,(row-m+1));

break;

}

}while(syn!=0);

getch();

}

void scaner()

{ sum=0;

for(m=0;m<8;m++)token[m++]=NULL;

ch=prog[p++];

m=0;

while((ch==' ')||(ch=='\n')){

if(ch=='\n'){

line++;

row=1;

}

if(ch==' '){

row++;

}

ch=prog[p++];

}

if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))

{ while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9'))) {token[m++]=ch;

ch=prog[p++];row++;

}

p--;

syn=10;

for(n=0;n<6;n++){

if(strcmp(token,rwtab[n])==0)

{ syn=n+1;//关键字

break;

}

}

}

else if((ch>='0')&&(ch<='9'))//判断首字符是否是数字

{ while((ch>='0')&&(ch<='9'))

{ sum=sum*10+ch-'0';//转换成整型

token[m++]=ch;

ch=prog[p++];row++;

if(ch=='.')

{ token[m++]=ch;

ch=prog[p++];row++;

}

else if(ch=='e')

{

token[m++]=ch;

ch=prog[p++];row++;

if((ch=='+')||(ch=='-')){

token[m++]=ch;

ch=prog[p++];row++;

}

}

}

p--;

syn=11;

}

else switch(ch){

case'<':token[m++]=ch;

ch=prog[p++];

if(ch=='=')

{ syn=20;

token[m++]=ch;row+=2;

}

else

{ syn=19;

p--;row++;

}

break;

case '>':token[m++]=ch;

ch=prog[p++];

if(ch=='=')

{ syn=22;

token[m++]=ch;row+=2;

}

else

{ syn=21;

p--; row++;

}

break;

case '!':token[m++]=ch;

ch=prog[p++];

if(ch=='=')

{ syn=23;

token[m++]=ch;row+=2;

}

else

{ syn=31;

p--;row++;

}

break;

case '=':token[m++]=ch;

ch=prog[p++];

if(ch=='=')

{ syn=17;

token[m++]=ch;row+=2;

}

else

{ syn=18;

p--;row++;

}

break;

case '+': syn=13;

token[m++]=ch;row++;

break;

case '-':syn=14;

token[m++]=ch;row++; break;

case '*': syn=16;

token[m++]=ch;row++;

break;

case '/':

token[m++]=ch;

ch=prog[p++];

if(ch=='/')

{

syn=30;

token[m++]=ch;

ch=prog[p++];

while(ch!='\n')

{

ch=prog[p++];

}

break;

}

else

{ syn=15;

p--;row++;

}

break;

case '(': syn=24;

token[m++]=ch;row++;

break;

case ')': syn=25;

token[m++]=ch;row++;

break;

case '{': syn=26;

token[m++]=ch;row++;

break;

case '}': syn=27;

token[m++]=ch;row++;

break;

case ';': syn=28;

token[m++]=ch;row++;

break;

case '\"': syn=30;

token[m++]=ch;row++;

break;

case '#': syn=0;

token[m++]=ch;row++;

break;

default: syn=-1;

break;

}

token[m++]='\0';

}

五、结果分析:

实验1-3-《编译原理》词法分析程序设计方案

实验1-3 《编译原理》S语言词法分析程序设计方案 一、实验目的 了解词法分析程序的两种设计方法之一:根据状态转换图直接编程的方式; 二、实验内容 1.根据状态转换图直接编程 编写一个词法分析程序,它从左到右逐个字符的对源程序进行扫描,产生一个个的单词的二元式,形成二元式(记号)流文件输出。在此,词法分析程序作为单独的一遍,如下图所示。 具体任务有: (1)组织源程序的输入 (2)拼出单词并查找其类别编号,形成二元式输出,得到单词流文件 (3)删除注释、空格和无用符号 (4)发现并定位词法错误,需要输出错误的位置在源程序中的第几行。将错误信息输出到屏幕上。 (5)对于普通标识符和常量,分别建立标识符表和常量表(使用线性表存储),当遇到一个标识符或常量时,查找标识符表或常量表,若存在,则返回位置,否则返回0并且填写符号表或常量表。 标识符表结构:变量名,类型(整型、实型、字符型),分配的数据区地址 注:词法分析阶段只填写变量名,其它部分在语法分析、语义分析、代码生成等阶段逐步填入。 常量表结构:常量名,常量值 三、实验要求 1.能对任何S语言源程序进行分析 在运行词法分析程序时,应该用问答形式输入要被分析的S源语言程序的文件名,然后对该程序完成词法分析任务。 2.能检查并处理某些词法分析错误 词法分析程序能给出的错误信息包括:总的出错个数,每个错误所在的行号,错误的编号及错误信息。 本实验要求处理以下两种错误(编号分别为1,2): 1:非法字符:单词表中不存在的字符处理为非法字符,处理方式是删除该字符,给出错误信息,“某某字符非法”。 2:源程序文件结束而注释未结束。注释格式为:/* …… */ 四、保留字和特殊符号表

词法分析报告程序设计与实现

实验一词法分析程序设计与实现 一、实验目的及内容 调试并完成一个词法分析程序,加深对词法分析原理的理解。 二、实验原理(状态转换图) 1、C语言子集 (1)关键字: begin if then while do end 所有关键字都是小写。 (2)运算符和界符: := + – * / < <= <> > >= = ; ( ) # (3)其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义:ID=letter(letter| digit)* NUM=digit digit * (4)空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM,运算符、界符和关键字,词法分析阶段通常被忽略。 2、各种单词符号对应的种别码

3、词法分析程序的功能 输入:所给文法的源程序字符串。 输出:二元组(syn,token或sum)构成的序列。 其中:syn为单词种别码; token为存放的单词自身字符串; sum为整型常数。 二、软件平台及工具 PC机以及VISUAL C++6.0软件。 三、实验方法、步骤(或:程序代码或操作过程)(1)程序代码: #include #include #include char prog[80],token[8]; char ch; int syn,p,m=0,n,row,sum=0; char *rwtab[6]={"begin","if","then","while","do","end"}; void scaner() { for(n=0;n<8;n++) token[n]=NULL; ch=prog[p++]; while(ch==' ') { ch=prog[p]; p++; }

中文汉语语法

中文汉语语法 一、语素 语素和语素分类语素是最小的语音语义结合体,是最小的语言单位。语素按音节分类可以分成:单音节 语素,双音节语素,多音节语素。 ①单音节语素如土、人、水、风、子、民、大、海等。 ②双音节语素组成该语素的两个音节合起来才有意思,分开来没有与该语素有关的意义,双音节语素主要包括联绵字、外来词和专用名词。 A.双声,声母相同的联绵字:如琵琶、乒乓、澎湃、鞑靼、尴尬、荆棘、蜘蛛、踯躅、踌躇、仿佛、瓜葛、忐忑、淘汰、饕餮、倜傥、含糊、慷慨、叮当、蹊跷、玲珑、犹豫等。 B.叠韵,韵母相同的联绵字:如从容、葱茏、葫芦、糊涂、匍匐、灿烂、蜿蜒、苍茫、朦胧、苍莽、邋遢、罗嗦、怂恿、螳螂、桫椤、倥侗、蜻蜓、轰隆、当啷、惝恍、魍魉、缥缈、飘渺、耷拉等。 C.非双声叠韵联绵字:如蜈蚣、蓊郁、珊瑚、疙瘩、蚯蚓、惺忪、铃铛、奚落、褡裢、茉莉、蚂螂、窟窿、伉俪、蝴蝶、笊篱、蹦达、蟪蛄、狡狯、狡猾、蛤蚧、蛤蜊、牡丹、磅礴、提溜等。 D.外来词,由汉语以外的其他语种音译过来的词语。如干部、涤纶、甲克(夹克)、的士、巴士、尼龙、吉普、坦克、芭蕾、哒爹等。 E.专用名词,主要是地名、人和事物名称。如纽约、巴黎、北京、苏轼、李白、孔子、萝卜、菠菜、番茄、红薯等。 ③多音节语素 主要是拟声词、专用名词和音译外来词。如:喜马拉雅、珠穆朗玛、安迪斯、法兰克福、奥林匹克、白兰地、凡士林、噼里啪啦、淅淅沥沥、马克思主义、中华人民共和国。 二、词 词是由语素组成的最小的造句单位。有两种分类方式,1、按构成方式分单纯词和合成词;2、按词性分为实词和虚词。 从构成方式来看,可以分成: ①单纯词:由一个语素组成的词,自由的单音节语素和所有的双音节、多音节语素都可以组成单纯词。如:山、水、天、地、人、有、土、红、凑;仿佛、苍茫、蜈蚣、琉璃、参差、蹉跎;敌敌畏、阿司匹林、萨克斯、麦克风等。 ②合成词:由两个或两个以上的语素组成的词。 从词性来看,可以分成:实词共6个有实际意义的词,包括: (1)名词:表示人或事物名称的词。 有人物名词:如学生、群众、老头、妇女、同志、叔叔、维吾尔族、酒鬼等; 有事物名词:如笔、杉木、蜗牛、猎豹、奥托、棒球、战斗机、冥王星、思想、中学、物理、过程等; 有时间名词:如上午、过去、将来、午夜、三更、甲戊、世纪等; 有方位名词:如东南、上面、前方、内部、中间等。 (2)动词:表示动作行为及发展变化的词。 有行为动词:如跑、唱、喝、敲、吆喝、盯、踢、闻、听、摸; 有发展动词:如生长、枯萎、发芽、结果、产卵; 有心理动词:如喜欢、恨、气愤、觉得、思考、厌恶; 有存现动词:如消失、显现、有、丢失、幻灭; 有使令动词:如使、让、令、禁止、勒令;

词法分析小结

词法分析小结 词法分析是编译器工作的第一阶段,它的工作就是从输入(源代码)中取得token,以作为parser(语法分析)的输入,一般在词法分析阶段都会把一些无用的空白字符(whitespace,即空格、tab和换行)以及注释剔除,以降低下一步分析的复杂度,词法分析器一般会提供一个gettoken()这样的方法,parser可以在做语法分析时调用词法分析器的这个方法来得到下一个token,所以词法分析器并不是一次性遍历所有源代码,而是采取这种on-demand的方式:只在parser需要时才工作,并且每次只取一个token。 token和lexeme 首先,token不等于lexeme。token和lexeme的关系就类似于面向对象语言中“类”和“实例”(或“对象”)之间的关系,这个用中文不知该如何解释才好,比如语言中的变量a和b,它们都属于同一种token:identifier,而a的lexeme是”a”,b则是”b”,而每个关键字都是一种token。token可以附带有一个值属性,例如变量a,当调用词法分析器的gettoken()时,会返回一个identifier类型的token,这个token带有一个属性“a”,属性可以是多样的,例如表示数字的token

可以带有一个表示数字值的属性,它是整型的。 如下代码: intage=23; intcount=50; 可以依次提取出8个token:int(值为”int”),id(值为”age”),assign(值为”=”),number(值为整型数值23),int(值为”int”),id(值为”count”),assign(值为”=”),number(值为50) 正则表达式 正则表达式可以用来描述字符串模式,例如我们可以用digit+来表示number的token,其中digit表示单个数字(这里说正则表达式并不完全和实现的正则引擎所识别的正则表达式等价,这里只是为了描述问题而已)。 然而像c语言的的多行注释,用正则表达式来描述就比较麻烦,此时更倾向于直接用有穷自动机(finiteautomaton)来描述,因为用它来描述非常直观且很容易。

词法分析器实验报告

词法分析器实验报告 词法分析器设计 一、实验目的: 对C语言的一个子集设计并实现一个简单的词法分析器,掌握利用状 态转换图设计词法分析器的基本方法。利用该词法分析器完成对源程 序字符串的词法分析。输出形式是源程序的单词符号二元式的代码, 并保存到文件中。 二、实验内容: 1. 设计原理 词法分析的任务:从左至右逐个字符地对源程序进行扫描,产生一个个单词符号。 理论基础:有限自动机、正规文法、正规式 词法分析器(Lexical Analyzer) 又称扫描器(Scanner):执行词法分析的程序 2. 词法分析器的功能和输出形式 功能:输入源程序、输出单词符号 程序语言的单词符号一般分为以下五种:关键字、标识符、常数、运算符,界符 3. 输出的单词符号的表示形式: 单词种别用整数编码,关键字一字一种,标识符统归为一种,常数一种,各种符号各一种。 4. 词法分析器的结构 单词符号 5. 状态转换图实现

三、程序设计 1.总体模块设计 /*用来存储目标文件名*/ string file_name; /*提取文本文件中的信息。*/ string GetText(); /*获得一个单词符号,从位置i开始查找。并且有一个引用参数j,用来返回这个单词最后一个字符在str的位置。*/ string GetWord(string str,int i,int& j); /*这个函数用来除去字符串中连续的空格和换行 int DeleteNull(string str,int i); /*判断i当前所指的字符是否为一个分界符,是的话返回真,反之假*/ bool IsBoundary(string str,int i); /*判断i当前所指的字符是否为一个运算符,是的话返回真,反之假*/ bool IsOperation(string str,int i);

编译原理词法分析报告

1、实验目的 1、为初等函数运算语言构造词法分析器。 2、掌握生成词法分析器的方法,加深对词法分析原理的理解。 3、掌握设计、编制并调试词法分析程序的思想和方法 2、实验内容 一、根据下面的要求设计初等函数运算语言的词法模式,并用正则式表达出来 1、初等函数运算语言的常量为实数类型,其定义方式为实数的最一般书写方式,如: 123.321。具体要求:不支持整数部分大于。时首数字为0;不支持小数点后结尾为 0;不支持科学记数法;不支持仅为整数时有小数点;支持负数符号,不支持正数 符号。 2、初等函数运算语言的变量采用与C语言的标识符定义一样的方式:首字符为字母或 下划线;其他的为字母、数字及下划线的混合串;区分大小写;变量长度不超过32 个字符。 3、初等函数运算语言需要处理的函数仅为表一中所列举的内容。函数的格式及参数内 容也如表一所示。 4、初等函数运算语言支持四则运算,其计算的符号与C语言相同,为:+-*/。 5、初等函数运算语言的合法的分隔符包括:空格、制表符、、分行符圆括号(左、右)、 分号。其中空格、制表符、分行符可以出现在任何两个不同的单词中间;圆括号(左、右)用于表达式中,用于改变运算的优先级,以及标识函数的参数;分号用于标识一个语句的结束。 6、初等函数运算语言支持的常量还包括:PI,Eo其中,PI为圆周率,E为自然常数。 二、将正则式转化为最小DFA,给出该DFA的形式化表示和图形表示。 三、根据DFA给出状态转换表。 四、给出初等函数运算语言的记号表,即词法分析中,语言中的记号将分为多少类,每一类型的编码、类型、属性等内容是什么。 五、编写词法分析器,将输入的字符串转化成为记号流,便于后续的语法分析工作。要求词法分析器中能够识别词法错误。

基于多知识源的中文词法分析系统

第30卷第1期计算机学报v01.30No.12007年1月CHINESEJOURNAL0FCOMPUTERSJan.2007 基于多知识源的中文词法分析系统 姜维王晓龙关毅赵健 (哈尔滨工业大学计算机科学与技术学院哈尔滨150001) 摘要汉语词法分析是中文自然语言处理的首要任务.文中深入研究中文分词、词性标注、命名实体识别所面临的问题及相互之间的协作关系,并阐述了一个基于混合语言模型构建的实用汉语词法分析系统.该系统采用了多种语言模型,有针对性地处理词法分析所面临的各个问题.其中分词系统参加了2005年第二届国际汉语分词评测,在微软亚洲研究院、北京大学语料库开放测试中,分别获得F量度为97.2%与96.7%.而在北京大学标注的《人民日报》语料库的开放评测中,词性标注获得96.1%的精确率,命名实体识别获得的F量度值为88.6%. 关键词词法分析;汉语分词;词性标注;命名实体识别;语言模型 中图法分类号TP391 ResearchonChineseLexicalAnalysisSystemby FusingMultipleKnowledgeSources JIANGWeiWANGXiao—LongGUANYiZHAOJian (Sc^oozo,Com户“ferSciPncBn咒d:I。≥c^720fogy,Har6f雄j知s£it“抛o,T奢c^竹。zogy,H口r6in150001) AbstractChineselexicalanalysisisthefoundationtaskformostChinesenaturallanguagepro—ces8ing,Inthispaper,wordsegmentation,POStagging,namedentityrecognitionandtheirrela—tion-arewelldiscussed.IⅥoreover,apragmaticlexicalanalysissystembasedonmixedlanguagemodelsispresented,whichadoptsmanymodels,suchas以一gram,hiddenIⅥarkovmodel,maxi—mumentropymodel,supportvectormachineandconditionalrandomfields,theyhavegoodper~formanceinthespecialsub—tasks.TheWordSegmenterparticipatedintheSecondInternationalChineseWordSegmentationBakeoffin2005,andachieved97.2%and96.7%intermsofF~measureinMSRandPKUopentestrespectively.WhilethePOSta套gingandnamedentityrecog~nitionmodulesachieved96.1%inprecisionand88.6%inF—measurerespectivelyinopentestwiththecorpusthatcamefromsiX-monthcorporaofChinesePeoples’Daily. KeywordslexicalanaIysis;Chinesewordsegmentation;part—of—speechtagging;namedentityrecognition;languagemodel 引 词法分析主要包括分词、词性标注与命名实体识别三项子任务,它是句法分析与语义分析的基础,其性能将直接影响到后续应用,如机器翻译、信息抽取、问答系统的性能.本文以国家自然科学基金重点项目“问答式信息检索的理论与方法”为背景,全面 收稿日期:2005—11一15;修改稿收到日期:2006一06一06.本课题得到国家自然科学基金重点项目“问答式信息检索的理论与方法”(60435020)及国家自然科学基金(60504021)资助.姜维,男,1978年生,博士研究生,研究方向为自然语言处理、词法分析、信息抽取.Bmail:jwSeaBreeze@hit.edu.cn.王晓龙,男,1955年生,教授,博士生导师,主要研究领域为人工智能、自然语言处理.关毅,男,1970年生,博士,副教授,研究方向为问答系统、web挖掘.赵健,男,1975年生,博士,研究方向为中文命名实体识别、信息抽取.吉目  万方数据

编译原理 简单样本语言的词法分析器

昆明理工大学信息工程与自动化学院学生实验报告 (2012 —2013 学年第 1 学期) 课程名称:编译原理开课实验室:信自楼44 年月日 一、实验目的及内容 设计、编制、调试一个词法分析子程序-识别单词,加深对词法分析原理的理解。 二、实验原理及基本技术路线图(方框原理图或程序流程图) 对给定的程序通过词法分析器弄够识别一个个单词符号,并以二元式(单词种别码,单词符号的属性值)显示。而本程序则是通过对给定路径的文件的分析后以单词符号和文字提示显示。 三、所用仪器、材料(设备名称、型号、规格等或使用软件) W INDOWS下的VISUAL C++6.0; 四、实验方法、步骤(或:程序代码或操作过程) #include #include using namespace std;

#define MAX 22 char ch =' '; string key[15]={"begin","end","if","then","else","while","write","read", "do", "call","const","char","until","procedure","repeat"}; int Iskey(string c){ //关键字判断 int i; for(i=0;i='a'))||((c<='Z')&&(c>='A'))) return 1; else return 0; } int IsDigit(char c){ //判断是否为数字 if(c>='0'&&c<='9') return 1; else return 0; } void analyse(FILE *fpin){ string arr=""; while((ch=fgetc(fpin))!=EOF) { arr=""; if(ch==' '||ch=='\t'||ch=='\n'){} else if(IsLetter(ch)){ while(IsLetter(ch)||IsDigit(ch)) { if((ch<='Z')&&(ch>='A')) ch=ch+32; arr=arr+ch; ch=fgetc(fpin); } fseek(fpin,-1L,SEEK_CUR); if (Iskey(arr)){cout<

编译原理 实验2 词法分析器

编译原理实验2 词法分析器 一、实验目的 1. 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。 2. 掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 3. 编制一个读单词的程序,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符和分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示) 二、词法分析的基础知识 1. 词法分析器的功能和输出格式 词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符号常常表示成以下的二元式(单词种别码,单词符号的属性值)。在本实验中,采用的是一类符号一种别码的方式。 标识符的BNF表示: <标识符>-> <字母><字母数字串> ) <字母数字串>-><字母><字母数字串>|<数字><字母数字串>|ε 无符号整数的BNF表示: <无符号整数>-> <数字><数字串> <数字串>-> <数字><数字串> |ε 运算符的BNF表示: <加法运算符>-> + <减法运算符>-> - <大于关系运算符>-> > <大于等于关系运算符>-> >= 2. 超前搜索 ; 词法分析时,常常会用到超前搜索方法。如当前待分析字符串为“a > i”,当前字符为“>”,此时,分析器到底是将其分析为大于关系运算符还是大于等于关系运算符呢显然,只有知道下一个字符是什么才能下结论。于是分析器读入下一个字符“+”,这时可知应将“>”解释为大于运算符。但此时,超前读了一个字符“i”,所以要回退一个字符,词法分析器才能正常运行。在分析标识符,无符号整数等时也有类似情况。 三、程序要求 1. 程序输入示例: 如源程序为C语言,输入如下一段: main() { int a, b; a = 10; b = a+20; } ; 2. 程序输出示例:

词法分析器的实现与设计

题目:词法分析器的设计与实现 一、引言................................ 错误!未定义书签。 二、词法分析器的设计 (3) 2.1词的内部定义 (3) 2.2词法分析器的任务及功能 (3) 3 2.2.2 功能: (4) 2.3单词符号对应的种别码: (4) 三、词法分析器的实现 (5) 3.1主程序示意图: (5) 3.2函数定义说明 (6) 3.3程序设计实现及功能说明 (6) 错误!未定义书签。 7 7 四、词法分析程序的C语言源代码: (7) 五、结果分析: (12) 摘要:词法分析是中文信息处理中的一项基础性工作。词法分析结果的好坏将直接影响中文信息处理上层应用的效果。通过权威的评测和实际应用表明,IRLAS是一个高精度、高质量的、高可靠性的词法分析系统。众所周知,切分歧义和未登录词识别是中文分词中的两大难点。理解词法分析在编译程序中的作用,加深对有穷自动机模型的理解,掌握词法分析程序的实

现方法和技术,用c语言对一个简单语言的子集编制一个一遍扫描的编译程序,以加深对编译原理的理解,掌握编译程序的实现方法和技术。Abstract:lexical analysis is a basic task in Chinese information processing. The results of lexical analysis will directly affect the effectiveness of the application of Chinese information processing. The evaluation and practical application show that IRLAS is a high precision, high quality and high reliability lexical analysis system. It is well known that segmentation ambiguity and unknown word recognition are the two major difficulties in Chinese word segmentation. The understanding of lexical analyse the program at compile, deepen of finite automata model for understanding, master lexical analysis program implementation method and technology, using C language subset of a simple language compilation of a scanned again compiler, to deepen to compile the principle solution, master compiler implementation method and technology. 关键词:词法分析器?扫描器?单词符号?预处理 Keywords: lexical analyzer word symbol pretreatment scanner 一、引言 运用C语言设计词法分析器,由指定文件读入预分析的源程序,经过词法分析器的分析,将结果写入指定文件。本程序是在Visual?Studio环境下,使用C语言作为开发工具。基于实验任务

实验一词法分析实验报告

实验一词法分析 一、实验目的 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示) 二、实验要求 使用一符一种的分法 关键字、运算符和分界符可以每一个均为一种 标识符和常数仍然一类一种 三、实验内容 功能描述: 1、待分析的简单语言的词法 (1)关键字: begin if then while do end (2)运算符和界符: := + –* / < <= <> > >= = ; ( ) # (3)其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义: ID=letter(letter| digit)* NUM=digit digit * (4)空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM,运算符、界符和关键字,词法分析阶段通常被忽略。 2、各种单词符号对应的种别码 图 1

程序结构描述: 图 2 四、实验结果 输入begin x:=9: if x>9 then x:=2*x+1/3; end # 后经词法分析输出如下序列:(begin 1)(x 10)(:17)(= 18)(9 11)(;26)(if 2)……如图3所示:

图3 输入private x:=9;if x>0 then x:=2*x+1/3; end#后经词法分析输出如下序列:(private 10)(x 10)(:17)(= 18)(9 11)(;26)(if 2)……如图4所示: 图4 显然,private是关键字,却被识别成了标示符,这是因为图1中没有定义private关键字的种别码,所以把private当成了标示符。 输入private x:=9;if x>0 then x:=2*x+1/3; @ end#后经词法分析输出如下序列:(private 10)(x 10)(:17)(= 18)(9 11)(;26)(if 2)……如图5所示

中文语法的基本知识

中文语法的基本知识 一.语素和语素分类: 语素是最小的语音语义结合体,是最小的语言单位。语素按音节分类可以分成: ①单音节语素:如土、人、水、风、子、民、大、海等。 ②双音节语素,组成该语素的两个音节合起来才有意思,分开来没有与该语素有关的意义,双音节语素主要包括联绵字、外来词和专用名词。 A.双声,声母相同的联绵字:如琵琶、乒乓、湃、鞑靼、尴尬、荆棘、蜘蛛、踯躅、踌躇、仿佛、瓜葛、忐忑、淘汰、饕餮、倜傥、含糊、慷慨、叮当、蹊跷、玲珑、犹豫等。 B.叠韵,韵母相同的联绵字:如从容、葱茏、葫芦、糊涂、匍匐、灿烂、蜿蜒、苍茫、朦胧、苍莽、邋遢、罗嗦、怂恿、螳螂、桫椤、倥侗、蜻蜓、轰隆、当啷、惝恍、魍魉、缥缈、飘渺、耷拉等。 C.非双声叠韵联绵字:如蜈蚣、蓊郁、珊瑚、疙瘩、蚯蚓、惺忪、铃铛、奚落、褡裢、茉莉、蚂螂、窟窿、伉俪、蝴蝶、笊篱、蹦达、蟪蛄、狡狯、狡猾、蛤蚧、蛤蜊、牡丹、磅礴、提溜等。

D.外来词,由汉语以外的其他语种音译过来的词语。如干部、涤纶、甲克(夹克)、的士、巴士、尼龙、吉普、坦克、芭蕾、哒爹等。 E.专用名词,主要是地名、人和事物名称。如纽约、巴黎、北京、苏轼、李白、孔子、萝卜、菠菜、番茄、红薯等。 ③多音节语素,主要是拟声词、专用名词和音译外来词。如:喜马拉雅、珠穆朗玛、安迪斯、法兰克福、奥林匹克、白兰地、凡士林、噼里啪啦、淅淅沥沥、马克思主义、中华人民共和国 词 二.词和词的分类。 词是由语素组成的最小的造句单位。 (“单位”是名词类。) 从构成方式来看,可以分成: ①单纯词:由一个语素组成的词,自由的单音节语素和所有的双音节、多音节语素都可以组成单纯词。如:山、水、天、地、人、有、土、红、凑;仿佛、苍茫、蜈蚣、琉璃、参差、蹉跎;敌敌畏、阿司匹林、萨克斯、麦克风等。 ②合成词:由两个或两个以上的语素组成的词。

词法分析器的设计与实现

《编译原理》课程实验报告 实验题目:某种简单程序语言的词法分析器的设 计与实现 专业:计算机科学与技术 班级:11060341 学号:11060341 姓名:

实验目的: 设计一个词法分析程序,理解词法分析器实现的原理,掌握程序设计语言中的各类单词的词法分析方法,加深对词法分析原理的理解。 实验任务: 词法分析是从左向右扫描每行源程序的符号,拼成单词,换成统一的二元式(单词种别,单词符号的属性值)表示。对给定的程序通过词法分析器识别一个个单词符号,并以二元式(单词种别,单词符号的属性值)显示,本程序则是通过对给定程序段分析后以单词符号和文字提示显示) 实验流程:

程序清单: #include #include #include using namespace std; int k=0; struct word { char name[10]; int kind; } word[1000]; char key[35][10]= {"scanf","short","int","long","float","double","char","struct","union", "printf","typedef","const","unsigned","signed","extern","register","static", "volatile","void","if","else","switch","case","for","do","while","goto", "continue","break","default","sizeof","return","include","bool" }; bool cmp(char a[]) { int i; for(int k=0; k<35; k++) { if(strcmp(a,key[k])==0) return 1; } return 0; } int main() { #ifdef LOCAL freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif int p,q,flag; char a[1000],b[10],ch; while(gets(a)) { p=0; int len=strlen(a); while(p

词法分析实验报告

词法分析器 一、实验目的: 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。 二、实验要求 如源程序为C语言。输入如下一段:Array main() { int a,b; a = 10; b = a + 20; }# 要求输出如右图。 要求: 1、将单词分为五种 识别关键字:main、if、int、for、while、do、return、break、continue; 单词种别码为1。 标识符;单词种别码为2。 常数为无符号整形数;单词种别码为3。 运算符包括:+、-、*、/、=、>、<、>=、<=、!= ; 单词种别码为4。 分隔符包括:,、;、{、}、(、);单词种别码为5。 2、使用一符一种的分法 关键字、运算符和分界符可以每一个均为一种 标识符和常数仍然一类一种 三、实验内容 1、功能描述 改程序是一个实现词法分析的功能,能识别5种单词,其他单词报错。 2、程序结构描述 int IsKey(char *Word)关键字匹配函数,查询是否为关键字,若是,返回值为1,否则为0。 int IsAlpha(char c) 查看是否为字母,若是,返回值为1,否则为0。 int IsNum(char c) 查看是否为数字,若是,返回值为1,否则为0。 void scanner(FILE *fp) 扫描函数,扫描程序中的字符串并调用上述三种函数检查是否是字母、 数字,是否是关键字,并输出。 fseek(fp,-1,1)回退一个字符。 fgetc(fp)从数据流中区下一个字符。 fopen 文件打开函数,返回指向文件第一个字符的指针 四、实验结果 测试内容为 main() {

(完整版)汉语语法基础知识

汉语语法基础知识 词类和词性 (一)知识概述 词类是指词在语法上的分类,也就是把汉语里的所有词,根据它们的词汇意义和语法特点进行分类,这样得出的结果就是词类。现代汉语教学系统把词分为十二类: 实词可以分为: 1、名词:表示人或事物名称的词叫名词。 (1)表示人:老师、学生、作家、工人、鲁迅 (2)具体事物:天、地、花、草、天空、海洋 (3)抽象概念:方法、科学、法律、事业 (4)处所:北京、青岛、黄河、长江、三味书屋 (5)方位:东、西、南、北、上、下、前、后、左、右、里、外、内、中、间、旁、以前、以南、之下、之后、东边、西面、里头。 (6)时间:早晨、正午、晚上、半夜、上午、白天、夏天、立秋、今天、星期二 2、动词:表示动作行为、发展变化、心理活动等意义的词叫动词。 (1) 动作行为:穿、跳、走、纪念、朗诵。 (2) 存在变化:有、增加、缩小、扩大、发生。 (3) 心理活动:想、懊悔、喜欢、担心。 (4) 可能意愿:应该、应当、能够、愿意、必须、敢、肯、会、能、要、可以。 (5) 趋向:上、下、来、去、上去、下去、进来、进去、起来、上来。 (6) 判断:是、就是、正是 (7) 使令:使、让、派、请、叫、要求、命令、推举、允许、鼓动、鼓励。 3、形容词:表示事物的形状、性质或状态的词叫形容词。 (1)形状:大、小、高、圆、长、短、高大、肥胖。 (2)性质:好、坏、镇定、勇敢、乐观、伟大、优秀 (3)状态:愉快、慌张、急躁、迅速、朦胧、桔红 4、数词:表示数目的词叫数词。 (1)基数(确数)一、二、千、万、亿 (2)序数:第一、三叔、三年级、六楼、初五、老三。 (3)分数:三分之一、九成 (4)倍数:三倍、十倍、翻一番 (5)概数:十几概数、十余人、三十多岁、两三个、成千上万、很多人 5、量词:表示事物单位或行为、动作单位的词叫量词。 无量(表示人或事物单位的词) (1)个体:个、位、尺、只、台、条 (2)集体:批、帮、群、套、双、副、对、类 (3)不定量:些、点 (4)度量衡:丈、尺、里、亩 动量(表示动作行为的单位)次、回、下、趟、遍、阵、场、遭、焉 动量词也可以借用跟动作有关的事物的名词。如:画一笔、切一刀、工作一星期、学习一下午、踢一脚、送一车 说明:在现代汉语中,数词本身只表示抽象的数的概念,在计算事物或动作的数量时,数词的后面必须加上量词。数词跟量词连用就是数量词。 6、代词:具有指示、代替作用的词叫代词。代词可分为人称代词、指示代词、疑问代词。 ⑴人称代词:代替人或事物的名称的代词。

编译原理实验报告一 简单样本语言的词法分析器

理工大学信息工程与自动化学院学生实验报告 (2012 —2013学年第一学期) 一、实验目的及容 编译技术是理论与实践并重的课程,而其实验课要综合运用所学的多门课程的容,用来完成一个小型编译程序。从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。 调试并完成一个词法分析程序,加深对词法分析原理的理解。 二、实验原理及基本技术路线图(框原理图或程序流程图) 1、待分析的简单语言的词法 (1)关键字: begin if then while do end 所有关键字都是小写。 (2)运算符和界符: := + –* / < <= <> > >= = ; ( ) #

(3)其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义:ID=letter(letter| digit)* NUM=digit digit * (4)空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM,运算符、界符和关键字,词法分析阶段通常被忽略。 2、各种单词符号对应的种别码 3、词法分析程序的功能 输入:所给文法的源程序字符串。 输出:二元组(syn,token或sum)构成的序列。 其中:syn为单词种别码; token为存放的单词自身字符串; sum为整型常数。 二、所用仪器、材料(设备名称、型号、规格等或使用软件)

1台PC以及VISUAL C++6.0软件。 三、实验法、步骤(或:程序代码或操作过程) (1)程序代码: #include #include #include char prog[80],token[8]; char ch; int syn,p,m=0,n,row,sum=0; char *rwtab[6]={"begin","if","then","while","do","end"}; void scaner() { for(n=0;n<8;n++) token[n]=NULL; ch=prog[p++]; while(ch==' ') { ch=prog[p]; p++; } if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) { m=0; while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) { token[m++]=ch; ch=prog[p++]; } token[m++]='\0'; p--; syn=10; for(n=0;n<6;n++)

词法分析器的设计与实现

目录 一.设计题目 (2) 二.设计要求 (2) 1. 词法分析器的定义 (2) 2. 设计要求 (2) 3. 本程序自行规定: (3) 三.设计作用与目的 (4) 1. 设计作用 (4) 2. 设计目的 (4) 四.运行环境及工具软件 (4) 五.系统设计 (5) 1. 系统总体设计 (5) (1)词法分析器的设计 (5) (2)总体设计框图 (6) (3)总程序流程图 (6) 2. 各子模块设计 (8) (1)字符的识别 (8) (2)关键字的识别 (8) (3)数字的识别 (8) (4)界符的识别 (10) (5)运算处理 (10) 3.相关函数分析 (11) 4. 源程序设计 (12) 六.实验调试结果 (29) 1. 调试工具 (29) 2. 调试步骤 (29) 3. 调试结果 (29) 七.设计中的问题及解决方法 (31) 八.设计心得 (32) 九.参考文献 (34)

词法分析器的设计与实现 一.设计题目 词法分析器的设计与实现 二.设计要求 1. 词法分析器的定义 词法分析顾名思义就是分词。它以程序设计语言编制的源程序作为输入,以单词序列作为输出。分词过程可以通过编制程序自动完成,我们通常称这个分词程序为词法分析器。词法分析器分析的源程序可以是现有的各类程序设计语言源程序也可以是人为给定的模型语言的源程序。本文中的源程序为后者。从词的角度来看,它涉及的内容较为简单,只包括几个较为常用的词类,词类的构成上也适当的作了一些简化。对词进行分析时,我们是按类型进行分析的。不同类型的词在后续的分析中所起的作用不同,相应的操作也各有不同,但同种类型中的词虽然单词的构成不同但从宏观上看它们的操作大体一致。模型语言中的单词可以分为“关键字”、“标识符”、“常数”、“分隔符”、“运算符”几类。一般,关键字在程序设计语言中人为给定 2. 设计要求 对给定的程序通过词法分析器能够识别一个个单词符号,并以二元式(单词种别码,单词符号的属性值)显示。而本程序则是通过对给定路径的文件的分析后以单词符号和文字提示显示。另外,如果是算术表达式,则需要通过栈、运算符的优先级比较处理等从而计算出最终结果并显示。通过此次课程设计要求掌握从源程序文件中读取有效字符的方法,掌握词法分析的实现方法并上机调试编出的词法分析程序。 在处理表达式前,首先设置两个栈:一是运算符栈,用于在表达式处理过程中存放运算符。在开始时,运算符栈中先压入一个表达式结束符“#”。二是操作数栈,用于在表达式处理过程中存放操作数。然后从左到右依次读出表达式中的各个符号(运算符或操作数),每读出一个符号按以下原则进行处理:

东南大学编译原理词法分析器实验报告

词法分析设计 1. 实验目的 通过本实验的编程实践,了解词法分析的任务,掌握词法分析程序设计的原理和构造方法,对编译的基本概念、原理和方法有完整的和清楚的理解,并能正确地、熟练地运用。 2. 实验内容 用C++语言实现对C++语言子集的源程序进行词法分析。通过输入源程序从左到右对字符串进行扫描和分解,依次输出各个单词的内部编码及单词符号自身值;若遇到错误则显示“Error”,然后跳过错误部分继续显示;同时进行标识符登记符号表的管理。 3. 实验原理 本次实验采用NFA->DFA->DFA0的过程: 对待分析的简单的词法(关键词/id/num/运算符/空白符等)先分别建立自己的FA,然后将他们用产生式连接起来并设置一个唯一的开始符,终结符不合并。 待分析的简单的词法 (1)关键字: "asm","auto","bool","break","case","catch","char","class","

const","const_cast"等 (2)界符(查表) ";",",","(",")","[","]","{","}" (3)运算符 "*","/","%","+","-","<<","=",">>","&","^","|","++","--"," +=","-=","*=","/=","%=","&=","^=","|=" relop: (4)其他单词是标识符(ID)和整型常数(SUM),通过正规式定义。 id/keywords: digit: (5)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。

相关文档
最新文档