编译原理 语法分析器

当一个文法满足LL(1)条件时,我们就可以为它构造一个不带回溯的自上而下分析程序,这个分析程序是由一组递归过程组成的,每个过程对应文法的一个非终结符。这样的一个分析程序成为递归下降分析器。

例:一个支持 +,*,(,) 的简单文法为(用$表示空字符):

E -> TE‘

E -> +TE‘ | $

T -> FT‘

T‘ -> *FT‘ | $

F -> (E) | i

《编译原理》 第三版(陈火旺)P74:

#include "iostream"
#include "cstdio"
#include "cstring"

using namespace std;

char a[100];
int len;
int p;
char sym;
bool ok;

void E();
void E2();
void T();
void T2();
void F();

void init()
{
    len = strlen(a);
    ok=true;
    p=0;
}
void getNext()
{
    sym = a[p++];
}

int main()
{
    freopen("in.txt","r",stdin);

    while(cin>>a)
    {
        init();
        getNext();
        E();
        cout<<a<<endl;
        if(ok)cout<<"Success"<<endl;
        else cout<<"Error"<<endl;
    }

    return 0;
}

void E()
{
    T();
    E2();
}

void E2()
{
    if(sym==‘+‘)
    {
        getNext();
        T();
        E2();
    }
}

void T()
{
    F();
    T2();
}

void T2()
{
    if(sym==‘*‘)
    {
        getNext();
        F();
        T2();
    }
}

void F()
{
    if( sym==‘i‘ )
    {
        getNext();
    }
    else
    {
        if(sym==‘(‘)
        {
            getNext();
            E();
            if(sym==‘)‘)
            {
                getNext();
            }
            else
            {
                ok = false;
                return;
            }
        }
        else
        {
            ok = false;
            return;
        }
    }

}

  

时间: 2024-10-29 19:10:08

编译原理 语法分析器的相关文章

读龙书学编译原理 语法翻译(3)...

接着上节讲, 我们来看如何在分析中插入合适的代码来生成语法树... 对于抽象语法树的总结 : 下面是作业 : [抽象语法树] 在这个题目中,你将完整的实现抽象语法树(包括数据结构的定义.语法树的生成等).首先,请下载我们提供的代码包: http://staff.ustc.edu.cn/~bjhua/mooc/ast.zip 代码的运行方式是: 首先生成语法分析器: $ bison exp.y 然后生成编译器: $ gcc main.c exp.tab.c ast.c 最后使用编译器编译某个源文件

编译原理--语法制导翻译器(一)

本章重点在前端,特别是词法分析,语法分析和中间代码生成 首先建立一个将中缀算术表达式转换成后缀表达式的语法制导翻译器,然后我们扩展这个翻译器,将某些程序片段转换为如图所示三地址代码 { int i; int j; float[100] a; float v; float x; while(true){ do i = i + 1; while(a[i] < v); do j = j + 1; while(a[j] > v); if(i >= j) break; x = a[i]; a[i]

读龙书学编译原理 语法翻译(1)...

完成了语法分析, 那么这一阶段最后要讨论的就是如何生成抽象语法树了...这一阶段称之为语法翻译 : 那么我们来看看翻译的基本思想 : 其实现如下 : 下面是具体实例 :

必要的软件架构师——编译原理&amp;#183;语法

最近软测试.我观看进程的视频! 发现里面有很多内容已经在自我不错的接触过程.而占80%比例! 但其中的一部分.我很奇怪的一部分.研究,在这里,将我研究的内容整理分享给大家! 编译原理: 首先,我第一眼看到他的时候.认为这是个特神奇的科学知识! 里面应该有非常多难点.可是.我的愿望达到了,前两次看书都有点云里雾里的感觉.可是随着接触的深入,视频,书籍,网络三方面的共同攻击下,这个神奇的东西,变得不神奇了. 编程语言的发展.我们只是多介绍.想了解的,能够去看这个站点"编程语言发展历史".我

编译原理基础概念介绍

关于编译原理 语法树 句柄 简单短语 短语 的区分,通过两个例子来理解概念以及方法: 例子1——语法树 S -> a|b|(T)  T -> TdS|S Vt={a,b,d,(,)}.Vn={S,T},S是开始符 句型(Sd(T)db)是S的一个推导,其中___是句柄;____是最左素短语:____是该句型的直接短语,_____是短语.     素短语的概念:它是一个递归的定义,至少含有一个终结符,并且除它自身之外不再含任何更小的素短语,所谓最左素短语就是处于句型最左边的素短语的短语.而一个算

编译原理课程设计——语法分析器

实验目的 了解掌握算符优先分析的基本方法.内容:学会科学思考并解决问题,提高程序设计能力. 实验内容与要求 用算符优先分析方法设计一个分析解释程序,对输入的赋值语句.输出语句.清除语句进行词法分析.语法分析.表达式求值并存储于指定变量中:若存在错误,提示错误相关信息. 文法表示 S -> v=E | E? | clear E -> E+T | E–T | T T -> T*F | T/F | F F -> (E) | v | c 问题分析 由于要求用算符优先分析方法来进行程序的语法

编译原理 - 实验三 - 递归下降语法分析器的调试及扩展

一. 语法分析介绍 语法分析是编译过程的核心部分,它的主要任务是按照程序语言的语法规则,从由词法分析输出的源程序符号串中识别出各类语法成分,同时进行语法检查,为语义分析和代码生成做准备.执行语法分析任务的程序叫语法分析程序或语法分析器. 二. 所实现的语义分析和代码生成程序能处理什么语句 (1)简单变量的声明语句 (2)表达式语句 (3)if语句. (4)while语句 (5)for语句 (6)write语句 (7)read语句 (8)do语句. (9)处理过程调用和返回 三.实验过程 ①用VC

编译原理实验二:LL(1)语法分析器

一.实验要求 不得不想吐槽一下编译原理的实验代码量实在是太大了,是编译原理撑起了我大学四年的代码量... 这次实验比上次要复杂得多,涵盖的功能也更多了,我觉得这次实验主要的难点有两个(其实都是难点...): 1. 提取左公因子或消除左递归(实现了消除左递归) 2. 递归求First集和Follow集 其它的只要按照课本上的步骤顺序写下来就好(但是代码量超多...),下面我贴出实验的一些关键代码和算法思想. 二.基于预测分析表法的语法分析 2.1 代码结构 2.1.1  Grammar类    功

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

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