zoukankan      html  css  js  c++  java
  • 第四章 自上而下分析

    第四章 词法分析——自上而下分析

    4.1语法分析器功能

           语法分析是编译过程的核心部分。

    它的任务是在词法分析识别出单词符号串的基础上,分析并判定程序的语法结构是否符合语法规则。

          

    自上而下分析面临的问题:

           1.文法的左递归问题

           2.回溯的不确定性,浪费时间

           3.虚假匹配的问题

           4.不能准确地确定输入串中出错的位置

           5.效率低

    解决方案:

    1. 文法的左递归问题:

    例如文法:p => p a,在没有识别任何输入符号的情况下,就会产生无限匹配p的情况造成死循环。

    1. 回溯的不确定性,要求我们将已经完成工作推倒从来。

    每次遇到错误匹配,就要回溯到最后一次正确的位置。

    1. 虚假匹配的问题
    2. 不能准确地确定输入串中出错的位置

    函数只能判断匹配是否出错,不能判断具体出错的位置。

    1. 效率低

    上述方案实际上是穷举法,效率极低。

    4.3  LL(1) 分析法

           1.通过替换消除左递归,间接左递归的情况:经过若干表达式带入之后会递归到本身

    2.

    一、求FIRST集

    1、右部首个字符是终结符则加入左部字符的FIRST集中,比如对形如U->a…的产生式(其中a是终结符),把a收入到FIRST(U)中。

    2、右部首个字符是非终结符,若此非终结符能推出空字符,则把它的FIRST集传送到左部字符的FIRST集中,*

      若此非终结符后是终结符,则把此终结符加入到左部字符的FIRST集中,同时推导结束;

      若此非终结符后是非终结符,则回到(*)。

      若此非终结符不能推出空字符,则把它的FIRST集传送到左部字符的FIRST集中,同时推导结束。

    二、求FOLLOW集

    1、FOLLOW集合是从开始符号S开始推导,把#加入FOLLOW(S)中。

    2、左部是S的产生式,右部末尾是非终结符,则把#加入此非终结符的FOLLOW集中。

    3、右部中若某非终结符的后面是终结符,则把此终结符加入到非终结符的FOLLOW集中。

    4、右部中若某非终结符的后面是非终结符,

    若后非终结符能推出空字符,则把后非终结符的FIRST集(去掉空字符)传送到前非终结符的FOLLOW集中,同时把左部非终结符的FOLLOW集传送到后非终结符的FOLLOW集中。

    若后非终结符不能推出空字符,则把后非终结符的FIRST集传送到前非终结符的FOLLOW集中。

     

    习题:

      

     

  • 相关阅读:
    一个JavaScript反射使用的例子
    JQuery中的each()的使用
    WebHome < Visualization < Virtual Test Facility
    UsageHdf < Amroc < Virtual Test Facility
    批量去除输出数据文件名前面的"output“
    官网EI数据库更新
    NASA CEA 安装指南
    FORTRAN学习网站
    Ubuntu下批量使用Tecplot的preplot命令对数据进行处理
    FORTRAN和C语言数组循环顺序
  • 原文地址:https://www.cnblogs.com/wuwangchuxin0924/p/8961597.html
Copyright © 2011-2022 走看看