当前位置:首页 » 编程软件 » 词法编译器

词法编译器

发布时间: 2022-01-11 03:12:06

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

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

❷ 想知道编译器和链接器的对C++的具体实现,但是不想知道编译器词法分析,语法分析等原理,应该看什么资料

第一个问题看inside C++ object model,也就是jjhou翻译的《深入理解C++对象模型》。可以了解到C++类的内存布局,以及虚函数等的实现,当然自己根据这些,在不同的编译器上写实现,进行观察,得到实际的数据结论是最好的。
第二个问题,你所写的应该是和VC相关的,win平台下的,可以看一些关于win PE文件的介绍文章,具体搜索PE格式你可以得到一大堆的资料

❸ 想做一个编译器前端,非常简单的那种,包括词法分析,语法分析,语义,代码生成,只要能识别像a=10;这样的

编译器之类的程序,写起来不是很容易的,如果你感兴趣的话,可以看看GCC,LCC之类开源代码,里面就有你想要的东西

给你发个链接吧,GCC 3.3.5的源码
http://ftp.gnu.org/gnu/gcc/gcc-3.3.5/gcc-3.3.5.tar.gz

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

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

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

(4)词法编译器扩展阅读

词法分析器的作用:

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

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

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

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


❺ 编译器可是没有思路.或许是我连编译器的本质还没搞懂吧.分为七个部分,词法分析,语法分析等..对吗

一般都是把源码转为elf,a.out,coff,omf之类格式的文件.再用连接器(或者链接器,反正就是linker).连接成程序(就是exe或dll之类的).
也有些是生成汇编代码,再调用汇编器汇编成elf,a.out,coff,omf之类.再连接.
也有些是直接生成exe,dll的.
vc也是先编译成win32格式(也说是COFF格式)的,再连接成exe,dll.

如果你想做编译器,可以去看<<编译原理>>之类的书.
也可以去下载一些开源的编译器代码来学习.
我也一直在学习编译器的.已经有段时间了.但是还是不太清楚.
编译原理看了大半也晕乎乎的,不知道说什么.

❻ 求一个尽量完整的编译器:词法分析器+语法分析器

在一个模式被匹配之前,词法分析器往往需要超前扫描该词素后面的若干个字符,使用将字符退回输入流的方法,需要移动大量字符的时间,由于 词法分析器是编译期间唯一需要逐一扫描源程序字符的过程,因此它的效率将极大的影响编译器的性能,因此人们发明了双缓冲区的技术。
双缓冲区技术原理如下:
把一个缓冲区分成前后两个部分,每部分能够容纳N(1024/4096)个字符,每次系统读命令读入N个字符到前半部分或者后半部分,如果剩余的不足N个字符,则在最后增加一个不同于其他任何字符的字符,如eof/#,用于标识源文件的结束。缓冲区包括两个指针beginning和forward,在两个指针之间的字符串就是当前的词素。一开始两个指针都指向第一个字符,然后forward向后扫描,直至发现一个匹配的词素为止。如果forward跨过中间标记,则往后半部分读入N个字符。如果forward指针移过最后位置,则向前半部分读入N个字符,且forward指针重新指向开始继续处理过程。为了处理方便在两个部分的最后都增加一个文件结束标识eof。示意图如下:
______________________________________________________________________
|............for......while.... ........................................ |....int i .................................................. ...................| |_______________________________eof|_______________eof________________eof|
| |
beginning forward

下面是双缓冲区的一个c实现:

#include <stdio.h>
#include <string.h>

#define MAXWORD 1000

struct bibuffer
{
char* buffer[2048]; //缓冲区空间
char* beginning,forward; //前向和后向指针
int count; //前向指针记数
} bbuf;

void parse(char c)
{
if(c=' ')
{
memcpy(word[i],beginning,(size_t)(forward-beginning));
i++;
}
else forward++;
}

int main(int argc,char* argv)
{
File* fp;
char* word[MAXWORD];
int i=0;
buffer=new char[2048];
fp=open("test.c","r");
read(fp,buffer,1023);
buffer[1023]='#';
read(fp,buffer+1024,1023);
buffer[2047]='#';
bbuf->buffer=buffer;
bbuf->beginning=bbuf->forward=bbuf->buffer;
bbuf->count=0;
while(1)
{
forward=forward+1;
if(count==1023)
{
read(fp,buffer+1024,1023);
forward++;
//这个函数的具体代码就要和具体的词法分析规则而定,这里假设只识别空格分割的单词
parse(*forward);
}
else if(count>=2048)
{
read(fp,buffer,1023);
forward=bbuf->buffer;
//这个函数的具体代码就要和具体的词法分析规则而定,这里假设只识别空格分割的单词
parse(*forward);
}
else if(count!=1023&&count<2048&&(*forward)='#')
{
break; //词法分析结束
}
}
}

❼ 词法分析器是什么

词法分析器即词法分析程序又称为扫描器,其功能在于依次扫视字符串形式源程序中的各个字符,逐个识别出其中的单词,并将其转换为内部编码形式的单词符号串作确为输出。通常,可采用二元式

(class,value)

来表示一个单词符号的内部编码,其中:class为一整数码,用于表示该单词的类别;value则是该单词之值(如变量名在符号表中序号,常数的二进制表示,以及运算符和分隔符的编码等等)。

概括地说,扫描器在其工作过程中,一般应完成下列的任务:

(1)识别出源程序中的各个单词符号,并将其转换为内部编码形式;

(2)删除无用的空白字符、回车字符以及其它非实质性字符;

(3)删除注释;

(4)进行词法检查,报告所发现的错误。

此外,视编译工作流程的组织,一些编译程序在进行词法分析时,还要完成将所识别出的标识符登录到符号表的工作。

词法分析工作在词法规则的控制下进行。用来描述程序设计语言词法的手段通常有三种,即正规文法、有限自动机和正规式。

❽ 一般设计编译器要将词法分析和语法分析分开的原因是什么

  1. 简单性——词法分析技术不如语法分析技术技术复杂,分开之后词法分析过程更简单。(这里还有一些意思差不多的话)

  2. 效率——词法分析占用的时间是整个编译时间的一大部分,所以将它们分开有利于优化词法分析,而提高编译效率

  3. 可移植性——词法分析通常平台相关,语法分析器可以是平台无关的。分开了对移植有利。


(引自《程序设计语言概念》(第9版) Sebesta着)

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

具体的你在修改修改吧

❿ 词法分析器是编译器中扫描什么的部分

词法分析器是编译器中扫描字符和单词的部分。

通常,可采用二元式来表示一个单词符号的内部编码,其中:class为一整数码,用于表示该单词的类别;value则是该单词之值(如变量名在符号表中序号,常数的二进制表示,以及运算符和分隔符的编码等等)。

在分析时

一是把词法分析器当成语法分析的一部分,另一种是把词法分析器当成编译程序的独立部分。在前一种情况下,词法分析器不断地被语法分析器调用,每调用一次词法分析器将从源程序的字符序列拼出一个单词,并将其Token值返回给语法分析器。后一种情况则不同,词法分析器不是被语法分析器不断地调用,而是一次扫描全部单词完成编译器的独立一遍任务。

热点内容
王思聪为什么配服务器 发布:2024-12-23 13:19:48 浏览:373
安卓型号代表什么 发布:2024-12-23 13:13:29 浏览:779
改密码哪里加问题 发布:2024-12-23 13:11:43 浏览:864
安卓手机多开哪个不卡 发布:2024-12-23 13:10:16 浏览:588
源码反码补码 发布:2024-12-23 13:09:25 浏览:259
方向算法 发布:2024-12-23 13:09:16 浏览:42
为什么安卓充电线充不上电了 发布:2024-12-23 13:06:14 浏览:223
配置管理由什么组成 发布:2024-12-23 12:57:47 浏览:560
运动版雅阁有哪些配置 发布:2024-12-23 12:57:45 浏览:277
ofp脚本 发布:2024-12-23 12:57:35 浏览:49