词法编译器
❶ 编译原理词法分析器是干什么用的,怎么用
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)进行词法检查,报告所发现的错误。
此外,视编译工作流程的组织,一些编译程序在进行词法分析时,还要完成将所识别出的标识符登录到符号表的工作。
词法分析工作在词法规则的控制下进行。用来描述程序设计语言词法的手段通常有三种,即正规文法、有限自动机和正规式。
❽ 一般设计编译器要将词法分析和语法分析分开的原因是什么
简单性——词法分析技术不如语法分析技术技术复杂,分开之后词法分析过程更简单。(这里还有一些意思差不多的话)
效率——词法分析占用的时间是整个编译时间的一大部分,所以将它们分开有利于优化词法分析,而提高编译效率
可移植性——词法分析通常平台相关,语法分析器可以是平台无关的。分开了对移植有利。
(引自《程序设计语言概念》(第9版) Sebesta着)
❾ 编译原理课程设计-词法分析器设计(C语言)
#include"stdio.h"/*定义I/O库所用的某些宏和变量*/
#include"string.h"/*定义字符串库函数*/
#include"conio.h"/*提供有关屏幕窗口操作函数*/
#include"ctype.h"/*分类函数*/
charprog[80]={'