标签:
一. 语法分析介绍
语法分析是编译过程的核心部分,它的主要任务是按照程序语言的语法规则,从由词法分析输出的源程序符号串中识别出各类语法成分,同时进行语法检查,为语义分析和代码生成做准备。执行语法分析任务的程序叫语法分析程序或语法分析器。
二. 所实现的语义分析和代码生成程序能处理什么语句
(1)简单变量的声明语句
(2)表达式语句
(3)if语句.
(4)while语句
(5)for语句
(6)write语句
(7)read语句
(8)do语句.
(9)处理过程调用和返回
三.实验过程
①用VC6.0建立一个Win32 Console Application得空项目,然后输入附录C 语法分析程序的代码(TESTparse)及主程序代码(main)
②在建立一个文件将附录B中的TESTscan()函数加到项目分析中
③编译运行
④对do的修改:
int do_stat()
{
int es=0;
fscanf(fp,"%s%s/n",&token,&token1);
printf("%s%s/n",token,token1);
if(strcmp(token,"(")) return(es=5);
fscanf(fp,"%s%s/n",&token,&token1);
printf("%s%s/n",token,token1);
es=expression();
if(es>0) return(es);
if(strcmp(token,")")) return(es=6);
fscanf(fp,"%s%s/n",&token,&token1);
printf("%s%s/n",token,token1);
es=statement();
if(es>0)return(es);
if(strcmp(token,"while")==0)
{
fscanf(fp,"%s%s/n",&token,&token1);
printf("%s%s/n",token,token1);
es=statement();
if(es>0)return(es);
}
return(es);
}
⑤log_expr修改
char singleword[50]="+-*(){};,:!";
char doubleword[10]="><=&&||";
int log_expr(){
int es=0;
es=bool_expr();
if(es>0) return(es);
if(strcmp(token,"&&")==0 || strcmp(token,"||")==0
)
{
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=bool_expr();
if(es>0) return(es);
}
return(es);
}
四.遇到问题:
Link出错
Linking...
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
Debug/test.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
test.exe - 2 error(s), 0 warning(s)
这个文件中使用了WinMian而不是main作为入口函数。vc这时的默认设置是针对控制台程序的。
解决方法:
1.进入project->setting->c/c++, 在category(第一行)中选择preprocessor,在processor definitions中删除_WINDOWS, 添加_CONSOLE
2.进入project->setting->Link, 在Project options中将/subsystem:windows.改为/subsystem:console
3.保存设置,Rebuild All.
简单来说就是在建立项目时创建成了Win32 Application的,所以建议直接建立Win32 Console Application项目
标签:
原文地址:http://www.cnblogs.com/zzhili/p/4490617.html