语义分析

实验四、语法分析实验

一、        实验目的

(1)        编制一个语义分析程序

(2)        语义分析程序是在语法分析程序的基础上进行编写的,主要任务是根据语法分析来插入中间代码、语义规则以及生成四元式。

(3)        通过语义分析的练习,能够进一步了解编译原理。

(4)        通过了解语义分析程序的设计原则、语义规则的描述技术、识别机制及语义分析程序的自动构造原理。

二、        实验内容和要求

(1)        根据语法分析程序进行改写语义分析程序

(2)        根据语言的语义规则,插入中间代码、语义规则以及生成四元式等

(3)        并在分析过程中进行语义检查,四元式作为输出或以某种形式的语法树作报告错误

三、        实验方法、步骤及结果测试

1、实验方法、步骤:

完成静态语义审查和处理

a)         上下文相关性审查

b)        类型匹配审查

c)         类型转换

d)        如:s:=2*3.1416*r*(h+r);

i.              赋值语句的语义:计算赋值符号右边表达式的值,送到赋值号左边的变量中。

ii.              检查赋值号左右两边的类型是否匹配

iii.              根据赋值语句的语义,将它翻译成四元式中间代码

2、原理分析:我是在语法分析程序的基础上进行修改的,是根据语法分析来插入中间代码、制定语义规则以及生成四元式。

void S(){
    char y=str[t-1];int x;
    if(syn==10){
        scaner();
        if(syn==18){
            scaner(); x=E();printf("\n(‘:=‘,%d, ,%c)\n",x,y);
        }
    }
}
int E(){
    int x;printf("E ");
    x=T();return E1(x);
}
int E1(int x){
    int y;printf("E1 ");
    if (syn==13) {
        scaner();
        y=T();gen4(‘+‘,x,y);return E1(x+y);
    }else if (syn==14) {
        scaner();y=T();gen4(‘-‘,x,y);return E1(x-y);
    }else {
        if (syn==28 || syn==25)return(x);
        else  error();
    }
}
int T(){
    int x;printf("T ");
    x=F();return T1(x);
}
int T1(int x){
    int y;printf("T1 ");
    if (syn==15) {
        scaner();y=F();gen4(‘*‘,x,y);return T1(x*y);
    }else if (syn==16) {
        scaner();y=F();gen4(‘/‘,x,y);return T1(x/y);
    }
    else {
        if (syn==28 ||syn==25 || syn==13||syn==14)return (x);
        else error();
    }
}
int F(){
    int y; printf("F ");
    if (syn==27) {
        scaner();y=E();
        if(syn==28) {scaner();return (y);
        }else error();
    }else if (syn==11 || syn==10){ y=sum; scaner();return (y);
    }
}

四、实验总结

由于时间的关系,这次实验我暂且做了语义分析的算术表达式与赋值语句,虽然做的不多,

但也算把算术表达式做的不错,是有优先级的,我做的实验是以’#’为结束语,输出的四元式

是用(‘运算符’,操作数1,操作数2,运算结果);还有就是赋值语句是S:=E;这次实验,

我学会了语法分析和语义分析程序,利用自上而下的递归下降分析法来分析语法,然后进行

赋予语义规则,再生产中间代码,最后输出四元式。

#include <stdio.h>
//#include <string.h>
#define M 100
#define N 20
char str[M], wrong[N];
char ch;
int syn,t,m,n,sum,s=100;
char *keyword[6]= {"begin","if","then","while","do","end"};
void scaner();
void error();
void gen4(char ch,int x,int y);
void S();
int E();
int T();
int E1(int x);
int F();
int T1(int x);
main()
{
    char c;
    t=0;
    printf("Please input the arithmetic expressions: ");
    do{
         ch=getchar();
         str[t++]=ch;
    }while (ch!=‘#‘);
    t=0;
    do{
      scaner();
      switch(syn)
              {
                 case 11: printf("\n(%d,%d)",syn,sum); break;
                 case -1: printf("\n(%s,mistake)",wrong);break;
                 default: printf("\n(%d,%s)",syn, wrong);
              }
    }while (syn!=0);
    getchar();
    printf("\nWheter or not choice output grammer(y|n):");
    scanf("%c",&c);
    if(c==‘Y‘||c==‘y‘){
        t=0;
        scaner();
        S();
         E();
         if (syn==25)
                printf("\nGrammer correct\n");
         else     printf("\nGrammer mistake\n");
    }
}
void scaner()
{
        for (n=0;n<20;n++) wrong[n]=NULL;
        m=0;
        sum=0;
        ch=str[t++];
        while (ch==‘ ‘) {ch=str[t++];}
        if (ch>=‘a‘&& ch<=‘z‘)
           {while (ch>=‘a‘&& ch<=‘z‘||ch>=‘0‘ && ch<=‘9‘)
                  {
                   wrong[m++]=ch;
                   ch=str[t++];
                  }
            syn=10;t--;
            for (n=0;n<6;n++)
                if(strcmp(wrong,keyword[n])==0) {syn=n+1;break;}
           }
 else
            if(ch>=‘0‘ && ch<=‘9‘)
            {while (ch>=‘0‘ && ch<=‘9‘) {sum=sum*10+(ch-‘0‘); ch=str[t++];}
             syn=11;t--;
            }
          else
                switch(ch)
                {
                  case ‘<‘: wrong[m++]=ch;
                            ch=str[t++];
                            if (ch==‘>‘) {syn=21;wrong[m++]=ch;}
                            else if (ch==‘=‘) {syn=22;wrong[m++]=ch;}
                                 else {syn=20;t--;}
                            break;

                  case ‘>‘: m=0; wrong[m++]=ch;
                            ch=str[t++];
                            if (ch==‘=‘){syn=24;wrong[m++]=ch;}
                            else {syn=23;t--;}
                            break;
                  case ‘:‘: m=0; wrong[m++]=ch;
                            ch=str[t++];
                            if (ch==‘=‘){syn=18;wrong[m++]=ch;}
                            else {syn=17;t--;}
                            break;
                  case ‘+‘: syn=13;wrong[0]=ch;break;
                  case ‘-‘: syn=14;wrong[0]=ch;break;
                  case ‘*‘: syn=15;wrong[0]=ch;break;
                  case ‘/‘: syn=16;wrong[0]=ch;break;
                  case ‘(‘: syn=27;wrong[0]=ch;break;
                  case ‘)‘: syn=28;wrong[0]=ch;break;
                  case ‘=‘: syn=25;wrong[0]=ch;break;
                  case ‘;‘: syn=26;wrong[0]=ch;break;
                  case ‘#‘: syn=0;wrong[0]=ch;break;
                  default: syn=-1;wrong[0]=ch;
                }
}
void S()
{
    char y=str[t-1];int x;
    if(syn==10)
    {
        scaner();
        if(syn==18)
        {
            scaner();
            x=E();
              printf("\n(‘:=‘,%d, ,%c)\n",x,y);
        }
    }
}
int E()
{
    int x;
    printf("E ");
    x=T();return E1(x);
}
int E1(int x)
{
    int y;
    printf("E1 ");
    if (syn==13) {
        scaner();
        y=T();gen4(‘+‘,x,y);return E1(x+y);
    }else if (syn==14) {
        scaner();
        y=T();gen4(‘-‘,x,y);return E1(x-y);
    }
    else {
        if (syn==28 || syn==0)return(x);
        else  error();
    }
}
int T()
{
    int x;
    printf("T ");
    x=F();return T1(x);
}
int T1(int x)
{
    int y;
    printf("T1 ");
    if (syn==15) {
        scaner();

        y=F();gen4(‘*‘,x,y);return T1(x*y);

    }else if (syn==16) {
        scaner();

        y=F();gen4(‘/‘,x,y);return T1(x/y);
    }
    else {
        if (syn==28 ||syn==0 || syn==13||syn==14)return (x);
        else error();
    }
}
int F()
{
    int y;
    printf("F ");
    if (syn==27) {
        scaner();
        y=E();
        //gen4(‘+‘,x,y);return E1(x+y);
        if(syn==28) {scaner();return (y);
        }
        else error();
    }
    else if (syn==11 || syn==10){ y=sum; scaner();return (y);
    }
}
void error()
{
    printf("\n(%d,%s)mistake\n",syn, wrong);
}
void gen4(char ch,int x,int y)
{
    int z;
    float f;
    switch(ch){
    case ‘+‘:z=x+y;printf("\n(‘%c‘,%d,%d,%d)\n",ch,x,y,z);break;
    case ‘-‘:z=x-y;printf("\n(‘%c‘,%d,%d,%d)\n",ch,x,y,z);break;
    case ‘*‘:z=x*y;printf("\n(‘%c‘,%d,%d,%d)\n",ch,x,y,z);break;
    case ‘/‘:f=(float)x/y;printf("\n(‘%c‘,%d,%d,%0.1f)\n",ch,x,y,f);break;
    default:printf("mistakes!");
    }

}
时间: 2024-08-01 10:44:39

语义分析的相关文章

python实现算术表达式的词法语法语义分析(编译原理应用)

本学期编译原理的一个大作业,我的选题是算术表达式的词法语法语义分析,当时由于学得比较渣,只用了递归下降的方法进行了分析. 首先,用户输入算术表达式,其中算术表达式可以包含基本运算符,括号,数字,以及用户自定义变量. 词法分析,检查单词变量是否正确:语法分析,检查算术表达式语法是否正确并输出生成语法树:语义分析,输出四元表达式. 最终效果图: 例如输入: 词法分析结果: 语法分析结果: 语义分析结果: 算术表达式的组成语法如下: 无符号整数 = 〈数字〉{〈数字〉} 〈标识符〉= 〈字母〉{〈字母

中文挖掘智能学习已经成为大数据语义分析的趋势

自学习是指通过机器学习,自动抽取新的语言知识,以适应新的网络语言变化,做到因时而变. 智能学习也有人称之为"软计算",是们受自然(生物界)规律的启迪,根据其原理,模仿求解问题的算法.从自然界得到启迪,模仿其结构进行发明创造,这就是仿生学.这是我们向自然界学习的一个方面.另一方面,我们还可以利用仿生原理进行设计(包括设计算法),这就是智能学习(计算)的思想.这方面的内容很多,如人工神经网络技术.遗传算法和群集智能技术等. 1.人工神经网络算法 "人工神经网络"(ART

atitit.自己动手开发编译器and解释器(2) ------语法分析,语义分析,代码生成--attilax总结

atitit.自己动手开发编译器and解释器(2) ------语法分析,语义分析,代码生成--attilax总结 1. 建立AST 抽象语法树 Abstract Syntax Tree,AST) 1 2. 建立AST 语法树----递归下降(recursive descent)法 2 3. 语法分析概念 2 3.1. 上下文无关语言,非终结符(nonterminal symbol),终结符(terminal symbol).注 2 3.2. 最左推导.当然也有最右推导 3 3.3. 分支预测的

LSA潜在语义分析

在Wiki上看到的LSA的详细介绍,感觉挺好的,遂翻译过来,有翻译不对之处还望指教. 原文地址:http://en.wikipedia.org/wiki/Latent_semantic_analysis 前言 浅层语义分析(LSA)是一种自然语言处理中用到的方法,其通过"矢量语义空间"来提取文档与词中的"概念",进而分析文档与词之间的关系.LSA的基本假设是,如果两个词多次出现在同一文档中,则这两个词在语义上具有相似性.LSA使用大量的文本上构建一个矩阵,这个矩阵的

语义分析的一些方法

语义分析的一些方法 作者:火光摇曳 语义分析的一些方法(上篇) 语义分析的一些方法(中篇) 语义分析的一些方法(下篇) 语义分析,本文指运用各种机器学习方法,挖掘与学习文本.图片等的深层次概念.wikipedia上的解释:In machine learning, semantic analysis of a corpus is the task of building structures that approximate concepts from a large set of documen

scikit-learn:通过Non-negative matrix factorization (NMF or NNMF)实现LSA(隐含语义分析)

之前写过两篇文章.各自是 1)矩阵分解的综述:scikit-learn:2.5.矩阵因子分解问题 2)关于TruncatedSVD的简介:scikit-learn:通过TruncatedSVD实现LSA(隐含语义分析) 今天发现NMF也是一个非常好非常有用的模型,就简介一下.它也属于scikit-learn:2.5.矩阵因子分解问题的一部分. NMF是还有一种压缩方法,前提是如果数据矩阵是非负的. 在数据矩阵不包括负值的情况下. NMF能够取代PCA及他的变形(NMF can be plugge

TopicModel - LSA(隐性语义分析)的早期方法SVD

http://blog.csdn.net/pipisorry/article/details/42560331 LSA and SVD LSA(隐性语义分析)的目的是要从文本中发现隐含的语义维度-即"Topic"或者"Concept".我们知道,在文档的空间向量模型(VSM)中,文档被表示成由特征词出现概率组成的多维向量,这种方法的好处是可以将query和文档转化成同一空间下的向量计算相似度,可以对不同词项赋予不同的权重,在文本检索.分类.聚类问题中都得到了广泛应用

潜在语义分析Latent semantic analysis note(LSA)原理及代码实现

文章参考:http://blog.sina.com.cn/s/blog_62a9902f0101cjl3.html Latent Semantic Analysis (LSA)也被叫做Latent Semantic Indexing(LSI),从字面上的意思理解就是通过分析文档去发现这些文档中潜在的意思和概念.假设每个词仅表示一个概念,并且每个概念仅仅被一个词所描述,LSA将非常简单(从词到概念存在一个简单的映射关系) 不幸的是,这个问题并没有如此简单,因为存在不同的词表示同一个意思(同义词),

2016.3.3(Spark框架预览,Scala部分应用函数、闭包、高阶函数,关于语义分析的一些心得)

一.Spark框架预览 主要有Core.GraphX.MLlib.Spark Streaming.Spark SQL等几部分. GraphX是进行图计算与图挖掘,其中主流的图计算框架现在有:Pregal.HAMA.Giraph(这几部分采用超步即同步的方式),而GraphLab与Spark GraphX采用异步的方式进行.它与Spark SQL进行协作时,一般是用SQL语句来进行ETL(Extract-Transform-Load数据仓库技术)然后交给GraphX处理. Spark SQL的前身