导航:首页 > 源码编译 > 编译原理词法解释器

编译原理词法解释器

发布时间:2022-05-24 22:17:57

编译原理中的词法分析器的输入与输出是什么

编译原理中的词法分析器的输入是源程序,输出是识别的记号流。

词法分析器编制一个读单词的程序,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符和分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示)。

(1)编译原理词法解释器扩展阅读

词法分析器的作用:

1、与符号表进行交互,存储和读取符号表中的标识符的信息。

2、读入源程序的输入字符,将他们组成词素,生成并输出一个词法单元序列,每个词法单元序列对应一个于一个词素。

3、过滤掉程序中的注释和空白。

4、将编译器生成的错误消息与源程序的位置联系起。


⑵ 编译器有哪几部分构成.编译原理

1. 词法分析

词法分析器根据词法规则识别出源程序
中的各个记号(token),每个记号代表一类单词(lexeme)。源程序中常见的记号可以归为几大类:关键字、标识符、字面量和特殊符号。词法分析器
的输入是源程序,输出是识别的记号流。词法分析器的任务是把源文件的字符流转换成记号流。本质上它查看连续的字符然后把它们识别为“单词”。

2. 语法分析

语法分析器根据语法规则识别出记号流中的结构(短语、句子),并构造一棵能够正确反映该结构的语法树。

3. 语义分析

语义分析器根据语义规则对语法树中的语法单元进行静态语义检查,如果类型检查和转换等,其目的在于保证语法正确的结构在语义上也是合法的。

4. 中间代码生成

中间代码生成器根据语义分析器的输出生成中间代码。中间代码可以有若干种形式,它们的共同特征是与具体机器无关。最常用的一种中间代码是三地址码,它的一种实现方式是四元式。三地址码的优点是便于阅读、便于优化。

⑶ 编译原理课程设计-词法分析器设计(C语言)

#include"stdio.h"/*定义I/O库所用的某些宏和变量*/

#include"string.h"/*定义字符串库函数*/

#include"conio.h"/*提供有关屏幕窗口操作函数*/

#include"ctype.h"/*分类函数*/

charprog[80]={''},

token[8];/*存放构成单词符号的字符串*/

charch;

intsyn,/*存放单词字符的种别码*/

n,

sum,/*存放整数型单词*/

m,p;/*p是缓冲区prog的指针,m是token的指针*/

char*rwtab[6]={"begin","if","then","while","do","end"};

voidscaner(){

m=0;

sum=0;

for(n=0;n<8;n++)

token[n]='';

ch=prog[p++];

while(ch=='')

ch=prog[p++];

if(isalpha(ch))/*ch为字母字符*/{

while(isalpha(ch)||isdigit(ch))/*ch为字母字符或者数字字符*/{

token[m++]=ch;

ch=prog[p++];}

token[m++]='';

ch=prog[p--];

syn=10;

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

if(strcmp(token,rwtab[n])==0)/*字符串的比较*/{

syn=n+1;

break;}}

else

if(isdigit(ch))/*ch是数字字符*/{

while(isdigit(ch))/*ch是数字字符*/{

sum=sum*10+ch-'0';

ch=prog[p++];}

ch=prog[p--];

syn=11;}

else

switch(ch){

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

if(ch=='>'){

syn=21;

token[m++]=ch;}

elseif(ch=='='){

syn=22;

token[m++]=ch;}

else{

syn=20;

ch=prog[p--];}

break;

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

if(ch=='='){

syn=24;

token[m++]=ch;}

else{

syn=23;

ch=prog[p--];}

break;

case':':m=0;token[m++]=ch;ch=prog[p++];

if(ch=='='){

syn=18;

token[m++]=ch;}

else{

syn=17;

ch=prog[p--];}

break;

case'+':syn=13;token[0]=ch;break;

case'-':syn=14;token[0]=ch;break;

case'*':syn=15;token[0]=ch;break;

case'/':syn=16;token[0]=ch;break;

case'=':syn=25;token[0]=ch;break;

case';':syn=26;token[0]=ch;break;

case'(':syn=27;token[0]=ch;break;

case')':syn=28;token[0]=ch;break;

case'#':syn=0;token[0]=ch;break;

default:syn=-1;}}

main()

{

printf(" Thesignificanceofthefigures: "

"1.figures1to6saidKeyword "

"2. "

"3.figures13to28saidOperators ");

p=0;

printf(" pleaseinputstring: ");

do{

ch=getchar();

prog[p++]=ch;

}while(ch!='#');

p=0;

do{

scaner();

switch(syn){

case11:printf("(%d,%d) ",syn,sum);break;

case-1:printf(" ERROR; ");break;

default:printf("(%d,%s) ",syn,token);

}

}while(syn!=0);

getch();

}

程序测试结果

对源程序beginx:=9:ifx>9thenx:=2*x+1/3;end#的源文件,经过词法分析后输出如下图5-1所示:

具体的你在修改修改吧

⑷ 编译原理词法分析器是干什么用的,怎么用

1、识别出源程序中的各个单词符号,并转换成内部编码形式 2、删除无用的空白字符回车字符以及其他非实质性字符 3、删除注释 4、进行词法检查,报告所发现的错误。

⑸ 编译原理课设实现C/C++语言词法分析器

词法分析很简单的,就是把输入文件的字符串组合成为一个个单词就可以了。
比如 void main(){} ,本来都是一个个字符,你要做的是:把它转换为 "void" , "main" , "(" , ")" , "{" , "}"等,相当于是单词了,原来的只是单个字符。。。
当然真正的词法分析还需要有一定的语义分析和纠错功能,但是估计你暂时是用不到的。。。

⑹ 编译原理中词法分析器

或许……可以通过这个符号的前面的第一个有实际意义的“单词”的属性来判断,因为如果它是加减号,
那么它“前面”的那个单词必然具有可以被它加或减的属性,否则就是正负号。
如果前一个单词属性是标示符或者某种数据类型(比如整型、字符串型),
那么这个符号就是加减号而不是正负号,如果前面一个单词
是关键字或运算符这类不可能承受“加减”操作的这种,这个号就是正负号。
个人觉得这个问题应该没有一针见血或者一劳永逸的办法,就得一点一点分析吧。
PPPS:还有一策就是甭搭理它,交给语义分析办。

⑺ 编译原理的词法分析器的原理......

将文件读入内存中
然后从首字符开始分析,匹配规则一般是采用自动机,以语句
int
a
=
12;为例
首先从字符i开始
每次取一个单词
即从一个非空白字符开始
到下一个空白字符出现为止
为一个单词

看看
该单词是不是关键字
如看看是不是if
是不是int
都不是的话
则将其当做
字符标记
依此类推

⑻ 编译原理 词法分析器中如何得到注释内容

不同的编译器的词法分析器不尽相同,主要看编译器的设计者是怎么设计的:
有的是识别出/*和*/后,将其间的字符作为注释。如VC++,WIN-TC等。
有的是识别出//后,将//之后与换行符前的所有文字当作注释。如VC++等。

java的注释和c语言、c++的注释似乎有点区别,但是也差不多啦!
除了以上两种之外,还有第三种,文档注释:
/** ...... */ 注释若干行,并写入javadoc 文档。
不过我认为这种可以算在第一种之内,当成第一种处理也未尝不可啊!

⑼ 编译原理 词法分析器问题

NFA、DFA以及最简DFA如下图所示:

⑽ 编译原理词法分析器

这个只要多看看编译原理书就明白了,这么说吧,词法分析器就是根据语言的此法规则构造出识别其单词的有限自动机,它呢是一个数学模型,
先给出识别各类单词的状态转换图,
将各类单词的状态转换图的初始状态合并成一个唯一的初状态;
然后化简并调整冲突的状态编号;
最后再将有限自动机变成一个可行的词法分析器。

阅读全文

与编译原理词法解释器相关的资料

热点内容
jtbcphp 浏览:337
编程时遇到源代码未编译如何处理 浏览:431
绿源app怎么查看绑定系统 浏览:357
qq里的压缩文件怎么保存 浏览:349
伤寒论桂林pdf 浏览:684
树洞app怎么搜索好友 浏览:217
冷库压缩机如何注油 浏览:641
无线wifi怎么加密呢 浏览:432
linuxjava配置环境变量 浏览:702
rust服务器怎么下载地图 浏览:831
程序员那么可爱被误会的片段 浏览:39
好玩免费的服务器地址 浏览:344
vb脚本编译 浏览:18
单片机led显示数字 浏览:379
vim编译器是什么 浏览:385
ava程序员面试标准 浏览:791
安卓原生系统状态栏编译美化 浏览:64
java线程是什么意思 浏览:710
如何查看服务器的外网ip地址 浏览:721
命令方块放置方块 浏览:367