ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

编译器实现之旅——第十七章 终章

2021-02-19 17:05:01  阅读:245  来源: 互联网

标签:第十七章 idx numArray int rhs nowIdx 编译器 终章 minIdx


经过漫长的旅途,我们的编译期实现之旅终于到达了终点。感慨之余,就让我们最后一次共同回顾与展望这段遥远的旅程吧。

1. 回顾与展望

在编译器实现之旅的最初几章中,我们手写了一个针对CMM语言的词法分析器。实际上,我们使用的是一种被称为“手工编码的词法分析器”的实现方案。词法分析器实际上是具有通过程序进行自动生成的能力的,这部分内容主要包括正则表达式,有穷自动机及其相关算法等。

接着,我们手写了一个CMM语言的语法分析器。这里,我们使用的是一种被称为“递归下降的语法分析器”的实现方案。语法分析器的实现方案非常多,且同样具有通过程序进行自动生成的能力,这部分内容主要包括LR分析及其相关算法等。

此外,我们在实现语法分析器时也刻意的略过了形式化的消除左递归,以及形式化的获取First集合的方法;此外,我们还忽略了诸如提取左因子,Follow集合等内容。

在接下来的后端旅程中,我们看到了符号表、虚拟机、代码生成器等等这些名词究竟是什么样的一些东西。我想,最令人惊讶的便是:我们仅仅使用了如此简单的一台虚拟机和一套指令集,就实现了一门其实也并不是很简单的语言。此间往事与回味,就待读者慢慢思考与感悟了...

2. 测试程序

最后,我们给出两个适用于CMM编译器的测试程序。

第一个程序用于计算两数的最大公约数:

/*
    A program to perform Euclid's
    Algorithm to compute greatest common divisor.
*/

/*//////////////////////////////////////////////////////////////////////////////
// Calc Greatest Common Divisor
//////////////////////////////////////////////////////////////////////////////*/

int CalcGreatestCommonDivisor(int lhs, int rhs)
{
    if (rhs == 0)
    {
        return lhs;
    }
    else return CalcGreatestCommonDivisor(rhs, lhs - lhs / rhs * rhs);
}


/*//////////////////////////////////////////////////////////////////////////////
// Main Program Define
//////////////////////////////////////////////////////////////////////////////*/

void main(void)
{
    int lhs;
    int rhs;

    lhs = input();
    rhs = input();

    output(CalcGreatestCommonDivisor(lhs, rhs));
}

第二个程序实现了一个选择排序算法:

/*
    A program to perform selection sort on a 10
    element array.
*/

/*//////////////////////////////////////////////////////////////////////////////
// Global Variable Define
//////////////////////////////////////////////////////////////////////////////*/

int globalNumArray[10];


/*//////////////////////////////////////////////////////////////////////////////
// Get Min Index
//////////////////////////////////////////////////////////////////////////////*/

int getMinIdx(int numArray[], int beginIdx, int endIdx)
{
    int minIdx;
    int minNum;
    int nowIdx;

    minIdx = beginIdx;
    minNum = numArray[beginIdx];
    nowIdx = beginIdx + 1;

    while (nowIdx < endIdx)
    {
        if (numArray[nowIdx] < minNum)
        {
            minIdx = nowIdx;
            minNum = numArray[nowIdx];
        }

        nowIdx = nowIdx + 1;
    }

    return minIdx;
}


/*//////////////////////////////////////////////////////////////////////////////
// Sort Num List
//////////////////////////////////////////////////////////////////////////////*/

void sortNumList(int numArray[], int beginIdx, int endIdx)
{
    int nowIdx;
    int minIdx;
    int tmpNum;

    nowIdx = beginIdx;

    while (nowIdx < endIdx - 1)
    {
        minIdx = getMinIdx(numArray, nowIdx, endIdx);
        tmpNum = numArray[minIdx];
        numArray[minIdx] = numArray[nowIdx];
        numArray[nowIdx] = tmpNum;
        nowIdx = nowIdx + 1;
    }
}


/*//////////////////////////////////////////////////////////////////////////////
// Main Program Define
//////////////////////////////////////////////////////////////////////////////*/

void main(void)
{
    int idx;

    idx = 0;

    while (idx < 10)
    {
        globalNumArray[idx] = input();
        idx = idx + 1;
    }

    sortNumList(globalNumArray, 0, 10);

    idx = 0;

    while (idx < 10)
    {
        output(globalNumArray[idx]);
        idx = idx + 1;
    }
}

注:本文实现的CMM编译器的完整源代码可于本文作者的Github站点查看:https://github.com/yingyulou/CMM

标签:第十七章,idx,numArray,int,rhs,nowIdx,编译器,终章,minIdx
来源: https://www.cnblogs.com/yingyulou/p/14416631.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有