导航:首页 > 源码编译 > c编译原理

c编译原理

发布时间:2022-01-23 16:16:44

编译原理课程设计-词法分析器设计(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所示:

具体的你在修改修改吧

Ⅱ 编译原理写出表达式-a-(b*c/(c-d)+(-b)*a)的前缀式和后缀式。

abcde/+*+ 画一个运算树 先算的d/e根为"/",子结点为d,e 然后算c+d/e,根为“+”,左右子结点为e和上面的子树 b*(c+d/e)根为"*",作子树为b,右子树为(c+d/e)的树 最后a为右结点,"+"为根,左子树为刚才得到的树。 该树后序遍历即得。

Ⅲ C语言编译原理是什么

编译共分为四个阶段:预处理阶段、编译阶段、汇编阶段、链接阶段。

1、预处理阶段:

主要工作是将头文件插入到所写的代码中,生成扩展名为“.i”的文件替换原来的扩展名为“.c”的文件,但是原来的文件仍然保留,只是执行过程中的实际文件发生了改变。(这里所说的替换并不是指原来的文件被删除)

2、汇编阶段:

插入汇编语言程序,将代码翻译成汇编语言。编译器首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,编译器把代码翻译成汇编语言,同时将扩展名为“.i”的文件翻译成扩展名为“.s”的文件。

3、编译阶段:

将汇编语言翻译成机器语言指令,并将指令打包封存成可重定位目标程序的格式,将扩展名为“.s”的文件翻译成扩展名为“.o”的二进制文件。

4、链接阶段:

在示例代码中,改代码文件调用了标准库中printf函数。而printf函数的实际存储位置是一个单独编译的目标文件(编译的结果也是扩展名为“.o”的文件),所以此时主函数调用的时候,需要将该文件(即printf函数所在的编译文件)与hello world文件整合到一起,此时链接器就可以大显神通了,将两个文件合并后生成一个可执行目标文件。

Ⅳ [编译原理]令a,b和c是任意正规式,证明以下关系成立

A∣A=A
L(A∣A)=L(A)∪L(A)=L(A),所以有A∣A=A。

A*=ε∣A A*
通过证明两个正规式所表示的语言相同来证明两个正规式相等。 L(ε∣A A*)=L(ε)∪L(A)L(A*)= L(ε)∪L(A)(L(A) )*
=L(ε)∪L(A)((L(A))0∪(L(A))1∪(L(A))2∪(L(A))3∪?)
=L(ε)∪(L(A))1∪(L(A))2∪(L(A))3∪(L(A))4∪?
=(L(A))*=L(A*)
即:L(ε∣A A*)=L(A*),所以有:A*=ε∣A A*

(AB)*A=A(BA)*
利用正规式的分配率和结合律直接推导。
(AB)*A=((AB)0∣(AB)1∣(AB)2∣(AB)3∣?)A
=εA∣(AB)1A∣(AB)2A∣(AB)3A∣?
=Aε∣A (BA)1∣A (BA)2∣A (BA)3∣?

=A(BA)* 即:(AB)*A=A(BA)*

Ⅳ 学C语言就一定要学编译原理吗

C作为入门语言,其原因是C比较接近底层,又有一定的抽象性,虽然将来未必会使用它,但可以更了解计算机原理以及数据结构。可能对于大多数程序员来说没太大用处,但原理和数据结构能以计算机角度来思考程序问题,写出更高效的代码。这算是专业的程序员的一种修为。而且C现在还是主流,作为入门语言是很适合的。C语言是一种计算机程序设计语言,属高级语言范畴。它既具有高级语言的特点,又具有汇编语言的特点。它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序,代码清晰精简,十分灵活。

Ⅵ 学过编译原理的人看c\c++跟没学过的人比起来,有什么长处

一般来讲...没学过C\C++就跟编程文盲差不多...C\C++是基础,在这之上才能看很多.包括数据结构和算法(用汇编实在难以描述),或者学习其他编程语言.
让我难以理解的是,学习编译原理应该需要学习数据结构,但是楼主又没有学过C\C++,又是怎么学会数据结构进而理解编译原理??我很纳闷....楼主有无写过一个简单的编译器?纯汇编是很难写编译器的,在编译器的词法分析,语法分析,语义分析,中间代码等都基本用C\C++写,只有当要生成特定的CPU汇编指令的时候需要用汇编语言.
学习操作系统基本不需要过多编译原理的知识,只需要 汇编+C语言+数据结构和算法基础,基本就可以了.

附加一段:楼主好像对编译原理的理解有所偏差.编译原理主要是讲解编译器的构造,而汇编语言应该属于一种编程语言,和C\C++一样可以应用于很多场合.编译器原理就是如何把高级语言转换为低级语言的过程.
一般操作系统使用 汇编语言+C语言写成.(以下是Intel IA-32平台机器的一般开机过程)在计算机启动时,操作系统从汇编代码开始运行,因为这时处于实模式状态,也没有操作系统,因此首先启动BIOS程序,然后CPU通过编译好的汇编代码从实模式转入保护模式.接着逐步把PC的控制权交给操作系统内核,当内核启动后,由于有了操作系统的支持,此时的机器就可以通过高级语言编译好的代码(比如C语言)来管理PC的所有资源.因此,学习操作系统必须有汇编语言和C语言基础.不然例如进程调度和控制等这种核心问题是不可能看的懂的.

Ⅶ C转义字符及编译原理

.2f的意思就是控制输出的精度,指显示两位小数
不能加strlen是因为这个是字符串的操作,你要加string.h的头文件
(Q)这个用法我没用过,由于现在没用自己的电脑,看不到stdio.h的具体内容,不知道printf的函数实现,不过你可以打开stdio.h这个文件,就可以看到函数的实现,相信就比较好理解了,当然你要保证(q)这样的用法是正确的

Ⅷ c编译器是如何编译程序的

每种平台都有自己的C编译器的,例如linux下有 gcc ,windows下有ms vs 系列。c的源程序经过这些编译器,再与各自平台的连接器就可以生成该平台下对应的二进制执行代码了。
但由于C语言很多时候会涉及很多硬件级调用的,这个对平台依赖性极大。所以移植性这种东西,我只能说,哈哈!

Ⅸ C/C++ 的预编译原理是什么为什么要用预编译

为了防止程序在实际应用当中出现错误

Ⅹ 初学c语言 有必要看编译原理和计算机组成原理吗

这个没有必要 刚开始不需要了解那么深入 如果是计算机专业 到大二左右会上的 是专业课 具体与学习C语言 影响不大

阅读全文

与c编译原理相关的资料

热点内容
h264编码器源码 浏览:664
有什么办法翻录加密视频 浏览:666
java数据结构与算法面试题 浏览:977
解压不了是什么意思 浏览:359
新西兰编程师年薪 浏览:321
程序员为什么大多生闺女 浏览:51
c编程用英文还是中文 浏览:723
一点都不解压的游戏 浏览:203
解压为什么不能用中文文件夹 浏览:615
服务器如何解除备份 浏览:144
安卓手机为什么用一年就变卡 浏览:11
如何用风变编程自动回复 浏览:512
安卓阅读币怎么样 浏览:437
京东app怎么切号 浏览:583
进入传奇服务器后如何修改 浏览:42
m0单片机的cycle怎么知道 浏览:806
linux命令太长 浏览:782
压缩机nb1111y是多少w 浏览:45
打赏视频用什么服务器好 浏览:154
方舟好友服务器怎么加mod 浏览:982