精华内容
下载资源
问答
  • 编译原理实验

    2014-02-23 13:15:31
    华中科技大学 编译原理C实现源码 保证完全 90+的分数
  • 广工编译原理实验

    2018-06-05 13:47:26
    广工编译原理实验,代码加报告,适用广工编译原理课程
  • 编译原理实验:词法分析

    万次阅读 多人点赞 2018-09-29 21:17:16
    编译原理实验:词法分析1. 实验题目:词法分析实验目的实验内容实验要求输入输出2. 设计思想3.算法流程4. 源程序5. 调试数据 1. 实验题目:词法分析 实验目的 根据PL/0语言的文法规范,编写PL/0语言的词法分析...

    1. 实验题目:词法分析

    实验目的

    1. 根据PL/0语言的文法规范,编写PL/0语言的词法分析程序;或者调研词法分析程序的自动生成工具LEX或FLEX,设计并实现一个能够输出单词序列的词法分析器。
    2. 通过设计调试词法分析程序,实现从源程序中分出各种单词的方法;加深对课堂教学的理解;提高词法分析方法的实践能力。
    3. 掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的法。
    4. 掌握词法分析的实现方法。上机调试编出的词法分析程序。

    实验内容

     已给PL/0语言文法,输出单词符号(关键字、专用符号以及其它标记)。

    实验要求

    1. 把词法分析器设计成一个独立一遍的过程。
    2. 词法分析器的输出形式采用二元式序列,即:(单词种类,单词的值)

    输入输出

    输入:
      const a=10;
      var b,c;
      begin
      read(b);
      c:=a+b;
      write( c);
      end.
    输出:
      (constsym, const)
      (ident , a)
      (eql, =)
      (number, 10)
      (semicolon, ; )
      (varsym, var)
      (ident,b)
      (comma, ,)
      (ident, c)
      (semicolon, ; )
      (beginsym, begin)
      (readsym, read )
      (lparen,( )
      (ident, b)
      (rparen, ))
      (semicolon, ; )
      (ident, c)
      (becomes, := )
      (ident, a)
      (plus, +)
      (ident,b )
      (semicolon, ; )
      (writesym,write)
      (lparen, ( )
      (ident, c)
      (rparen,) )
      (endsym, end )
      (period, .)

    2. 设计思想

    基本字:

    单词(编码) 正规式r
    begin(beginsym) begin
    call(callsym) call
    const(constsym) const
    do(dosys) do
    end(endsym) end
    if(ifsym) if
    odd(oddsym) odd
    procedure(proceduresym) procedure
    read(readsym) read
    var(varsym) var
    while(whilesym) while
    write(writesym) write
    then(thensym) then

    标识符:

    单词(编码) 正规式r
    <标识符>(ident) (字母)(字母 |数字)*

    常数:

    单词(编码) 正规式r
    <常数>(ident) (数字)(数字)*

    运算符:

    单词(编码) 正规式r
    +(plus) +
    -(minus) -
    *(times) *
    /(slash) /
    =(eql) =
    <>(neq) <>
    <(lss) <
    <=(leq) <=
    >(gtr) >
    >=(geq) >=
    :=(becomes) :=

    界符:

    单词(编码) 正规式r
    ( (lparen) (
    ) (rparen) )
    , (comma) ,
    ; (semicolon) ;
    . (period) .

    3.算法流程

    在这里插入图片描述

    1. 词法分析程序打开源文件,读取文件内容,直至遇上文件结束符,然后读取结束。
    2. 接下来就要对源文件从头到尾进行扫描了,从头开始扫描,这个时候扫描程序首先要询问当前的字符是不是空格,若是空格,则继续扫描下一个字符,直至不是空格。然后询问这个字符是不是字母,若是则进行标识符和保留字的识别;若这个字符为数字,则进行数字的判断。否则,依次对这个字符可能的情况进行判断(界符和运算符),若将所有可能都走了一遍还是没有知道它是谁,则认定为错误符号,输出该无法识别error,程序结束。每次成功识别了一个单词后,单词都会存在word1[]数组中,然后字符指针往后移,进行下一个单词的识别。
    3. 主控程序需要负责对每次识别的种别码进行判断,对于不同的单词种别做出不同的反应,直至文件结束。
    4. 本次实验我采用了map这个STL关联容器,主要是考虑到词法分析中的数据映射的关系,因此采用这种结构。map提供一对一的数据处理能力,其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值。这个容器是非常方便使用的,对于查找可以直接使用迭代器进行,利用find()函数,若一直到末尾都未找到,则是不能识别或为标识符。

    4. 源程序

    #include<bits/stdc++.h>
    using namespace std;
    map<string,string> word;//应用map数据结构形成一个string->string的对应
    std::map<string,string>::iterator it;//用来遍历整个对应关系的迭代器
    void map_init(){//对应关系进行初始化
        word["begin"]="beginsym";
        word["call"]="callsym";
        word["const"]="constsym";
        word["do"]="dosym";
        word["end"]="endsym";
        word["if"]="ifsym";
        word["odd"]="oddsym";
        word["procedure"]="proceduresym";
        word["read"]="readsym";
        word["then"]="thensym";
        word["var"]="varsym";
        word["while"]="whilesym";
        word["write"]="writesym";
        word["+"]="plus";
        word["-"]="minus";
        word["*"]="times";
        word["/"]="slash";
        word["="]="eql";
        word["<>"]="neq";
        word["<"]="lss";
        word["<="]="leq";
        word[">"]="gtr";
        word[">="]="geq";
        word[":="]="becomes";
        word["("]="lparen";
        word[")"]="rparen";
        word[","]="comma";
        word[";"]="semicolon";
        word["."]="period";
    }
    int main(){
        map_init();//初始化
        char ch;
        char a;
        string word1;//string变量识别单词
        string str;//string变量进行字符识别
        ifstream infile("F:\\编译原理\\第一次实验\\analysis.txt");//文件输入流
        ofstream outfile("F:\\编译原理\\第一次实验\\result.txt");//文件输出流
        ostringstream buf;
        while(buf&&infile.get(ch)) buf.put(ch);//将文件中的字符读出来
        str= buf.str();//将得到的字符储存到string类型变量中
        int csize=str.length();
        for(int i=0;i<csize;i++){//对整个字符串进行遍历
            while(str[i]==' '||str[i]=='\n') i++;//若最开始为空格或换行符,则将指针的位置往后移
            if(isalpha(str[i])){//对标识符和基本字进行识别,调用库函数isalpha()
                word1=str[i++];
                while(isalpha(str[i])||isdigit(str[i])){
                    word1+=str[i++];
                }
                it=word.find(word1);
                if(it!=word.end()){//判断是不是基本字,若为基本字则进行输出
                    cout<<"("<<word[word1]<<","<<word1<<")"<<endl;
                }
                else{//否则直接输出
                    cout<<"(ident"<<","<<word1<<")"<<endl;
                }
                i--;
            }
            else if(isdigit(str[i])){//判断是不是常数,调用库函数isdigit()
                word1=str[i++];
                while(isdigit(str[i])){
                    word1+=str[i++];
                }
                if(isalpha(str[i])){
                    cout<<"error!"<<endl;
                    break;
                }
                else{
                    cout<<"(number"<<","<<word1<<")"<<endl;
                }
                i--;
            }else if(str[i]=='<'){//对<,<=分别进行判断
                word1=str[i++];
                if(str[i]=='>'){
                    word1+=str[i];
                    cout<<"("<<word[word1]<<","<<word1<<")"<<endl;
                }else if(str[i]=='='){
                    word1+=str[i];
                    cout<<"("<<word[word1]<<","<<word1<<")"<<endl;
                }else if(str[i]!=' '||!isdigit(str[i])||!isalpha(str[i])){
                    cout<<"("<<word[word1]<<","<<word1<<")"<<endl;
                }else{
                    cout<<"error!"<<endl;
                    break;
                }
                i--;
            }else if(str[i]=='>'){//对>,>=分别进行判断
                word1=str[i++];
                if(str[i]=='='){
                    word1+=str[i];
                    cout<<"("<<word[word1]<<","<<word1<<")"<<endl;
                }else if(str[i]!=' '||!isdigit(str[i])||!isalpha(str[i])){
                    cout<<"("<<word[word1]<<","<<word1<<")"<<endl;
                }else{
                    cout<<"error!"<<endl;
                    break;
                }
                i--;
            }else if(str[i]==':'){//对:=进行判断
                word1=str[i++];
                if(str[i]=='='){
                    word1+=str[i];
                    cout<<"("<<word[word1]<<","<<word1<<")"<<endl;
                }else{
                    cout<<"error!"<<endl;
                    break;
                }
                i--;
            }else{//对其他的基本字依次进行判断
                word1=str[i];
                it=word.find(word1);
                if(it!=word.end()){
                    cout<<"("<<word[word1]<<","<<word1<<")"<<endl;
                }else{
                    cout<<"error!"<<endl;
                    break;
                }
            }
        }
        infile.close();
        return 0;
    }
    

    5. 调试数据

    待输入的文件流:
    在这里插入图片描述
    输出数据:
    在这里插入图片描述
    在这里插入图片描述
    说明:如上实验仅符合当时实验要求的相关条件,其他的需求略微进行更改就行,思想是一样的,还是很简单的。输入输出自己按自己需求更改即可。

    展开全文
  • 编译原理实验代码.rar

    2020-03-29 18:08:54
    编译原理实验代码
  • 编译原理实验报告

    2018-04-01 17:20:47
    实验一 词法分析设计 实验二 LL(1)分析法 实验三 逆波兰表达式的产生及计算 江苏科技大学编译原理实验报告 有源码,有截图
  • 中北大学编译原理实验报告(附代码)
  • 编译原理 实验二.doc

    2020-12-25 16:58:00
    编译原理实验 语法制导把表达式翻译成逆波兰式
  • lab1编译原理实验一.zip
  • 编译原理实验指导书.rar
  • 编译原理实验 语法分析 Sample语言 语法分析是编译过程的核心部分,其主要工作就是指出错误 编译原理实验 语法分析 Sample语言 语法分析是编译过程的核心部分,其主要工作就是指出错误
  • 广工编译原理实验报告 实验内容: 1.增加保留字fi,增加运算符+= 2.增加fi条件语句 3.增加+=赋值语句
  • 东北大学计算机编译原理实验报告一、二、三 编译实验报告一之词法分析扫描器 编译实验报告二之语法分析器 编译实验报告三之中间代码四元式生成
  • 编译原理实验编译原理实验编译原理实验编译原理实验编译原理实验编译原理实验编译原理实验此法分析 分析,语言源程序,实验报告
  • 华中科技大学计算机学院编译原理实验1到实验4的源代码,分成4个文件夹,有ReadMe标注,可供实验参考
  • 编译原理实验.rar

    2019-06-10 15:34:45
    压缩文件里包含我们学校九次编译原理实验的.cpp代码,其中一部分是我自己写的,一部分有偷懒,偷懒的那些可能会存在一些小问题,见谅
  • 湖南大学编译原理实验
  • 编译原理实验源码.zip

    2020-12-07 21:15:23
    华中科技大学编译原理实验源码一到四,运行makefile文件即可,不过电脑应该先安装c编译器。 实验一:词法语法分析器的设计与实现; 实验二:符号表管和语义检查; 实验三:中间代码生成和优化; 实验四:目标代码...
  • 山东大学完整编译原理实验代码,上传的是整个vs项目,如果有不兼容等情况可以直接复制里面的代码。注释较多,便于理解。
  • 编译原理实验一1
  • 编译原理实验综合.zip

    2020-11-22 21:49:56
    编译原理实验,包括词法分析,LL1文法,LR1文法三个实验,运行结果完整,词法分析结果展示清晰,LL1有预测分析表,first,fllow集,规约分析步骤界面显示,LR1y有动作表(ACTION)和状态转换(GOTO)以及项目集族构造...
  • 西安电子科技大学编译原理课程实验 编译原理实验-函数绘图语言-Python实现
  • 广州大学编译原理实验报告,实验报告成绩为优,内容完整,供参考。
  • 哈工程编译原理实验报告
  • 山东大学编译原理实验 一. PL/0语言建立一个词法分程序GETSYM(函数) 二. PL/0语言建立一个语法分析程序BLOCK(函数) 三. 建立一个解释执行目标程序的函数

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,804
精华内容 1,121
关键字:

编译原理实验