语法分析预测分析方法


    实验21 语法分析—预测分析方法
    实验目
    预测分析方法编制分析程序实现词法分析程序提供单词序列语法检查结构分析解预测分析法递子程序法区联系培养动手实践力
    二实验容
    预测分析法分析段程序代码果符合文法定义程序输出否输出否
    预测分析递子程序顶分析方法里出回溯左公子文法左递左公子BNF:
    <程序>→<程序首部><分程序>
    <程序首部>→PROGRAM 标识符
    <分程序>→<常量说明部分><变量说明部分><程说明部分><复合语句>
    <常量说明部分>→CONST<常量定义><常量定义缀>|ε
    <常量定义>→标识符符号整数
    <常量定义缀>→ <常量定义><常量定义缀>|ε
    <变量说明部分>→VAR<变量定义><变量定义缀>|ε
    <变量定义>→标识符<标识符缀><类型>
    <标识符缀>→标识符<标识符缀>|ε
    <变量定义缀>→<变量定义><变量定义缀>|ε
    <类型>→INTEGER|LONG
    <程说明部分>→<程首部><分程序><程说明部分缀>|ε
    <程首部>→PROCEDURE 标识符<参数部分>
    <参数部分>→(标识符<类型>)|ε
    <程说明部分缀>→<程首部><分程序><程说明部分缀>|ε
    <语句>→<赋值调语句>|<条件语句>|<型循环语句>|<读语句>|<写语句>|<复合语句>
    <赋值调语句>→标识符<缀>
    <缀>→<表达式>|(<表达式>)|ε
    <条件语句>→IF<条件>THEN<语句>
    <型循环语句>→WHILE<条件>DO<语句>
    <读语句>→READ (标识符<标识符缀>)
    <写语句>→WRITE (表达式<表达式缀>)
    <表达式缀>→ <表达式><表达式缀>|ε
    <复合语句>→BEGIN <语句><语句缀>END
    <语句缀>→ <语句><语句缀>|ε
    <条件>→ <表达式><关系运算符><表达式>|ODD<表达式>
    <表达式>→+<项><项缀>|<项><项缀>|<项><项缀>
    <项缀>→<加型运算符><项><项缀>|ε
    <项>→<子><子缀>
    <子缀>→<型运算符><子><子缀>|ε
    <子>→标识符|符号整数|(<表达式>)
    <加型运算符>→+|
    <型运算符>→*|
    <关系运算符>→|<>|<|<|>|>
    非终结符终结符起存入栈非终结符码128开始标记表:
    表1 终结符种码表
    种码
    单词
    种码
    单词
    种码
    单词
    种码
    单词
    1
    PROGRAM
    2
    CONST
    3
    VAR
    4
    INTEGER
    5
    LONG
    6
    PROCEDURE
    7
    IF
    8
    THEN
    9
    WHILE
    10
    DO
    11
    READ
    12
    WRITE
    13
    BEGIN
    14
    END
    15
    ODD
    16
    +
    17

    18
    *
    19

    20

    21
    <>
    22
    <
    23
    <
    24
    >
    25
    >
    26

    27

    28

    29

    30

    31
    (
    32
    )
    33
    符号整数
    34
    标识符
    35
    #


    表2 非终结符函数名表
    非终结符
    函数名
    非终结符
    函数名
    <程序>
    program
    <程序首部>
    proghead
    <分程序>
    block
    <常量说明部分>
    consexpl
    <常量定义>
    consdefi
    <变量说明部分>
    varexpl
    <常量定义缀>
    conssuff
    <变量定义>
    vardefi
    <变量定义缀>
    varssuff
    <程说明部分>
    procdefi
    <类型>
    typeil
    <程首部>
    procedh
    <程说明部分缀>
    procsuff
    <赋值调语句>
    assipro
    <语句>
    sentence
    <缀>
    suffix
    <条件语句>
    ifsent
    <读语句>
    read
    <型循环语句>
    whilesent
    <标识符缀>
    idsuff
    <写语句>
    Write
    <复合语句>
    compsent
    <表达式缀>
    Exprsuff
    <语句缀>
    sentsuff
    <条件>
    Conditio
    <项缀>
    termsuff
    <表达式>
    Express
    <项>
    term
    <子缀>
    Factsuff
    <参数部分>
    argument
    <子>
    Factor
    <加型运算符>
    addoper
    <型运算符>
    Muloper
    <关系运算符>
    respoper

    三完整源程序代码
    #include
    #include
    #include
    #include
    #include
    #define lenth1 15
    #define lenth2 18

    *规表*
    int rule[][6]{
    {0} 空
    {129130260} 程序首部分程序
    {134280} program 标识符
    {1311341381500}常量说明部分变量说明部分程说明部分复合语句
    {2132133280} const 常量定义常量定义缀
    {0}
    {3420330} 标识符 符号整数
    {271321330} 常量定义常量定义缀
    {31351360} var 变量定义变量定义缀
    {3414729137280}标识符标识符缀:类型
    {27341470} 标识符标识符缀
    {1351360} 变量定义变量定义缀
    {40} integer
    {50} long
    {139130281400}程首部分程序程说明部分缀
    {634158280} procedure 标识符参数部分
    {1420} 赋值调语句
    {1440} 条件语句
    {1450} 型循环语句
    {1460} 读语句
    {1480} 写语句
    {1500} 符合语句
    {341430} 标识符缀
    {301530} :表达式
    {715281410} if 条件then 语句
    {9152101410} while 条件do 语句
    {113134147320}read (标识符标识符缀)
    {1231153149320}write (表达式表达式缀)
    {271531490} 表达式表达式缀
    {13141151140} begin 语句语句缀end
    {281411510} 语句语句缀
    {1531611530} 表达式关系运算符表达式
    {151530} odd 表达式
    {161551540} + 项项缀
    {171551540} 项项缀
    {1551540} 项项缀
    {1591551540} 加型运算符项项缀
    {1571560} 子子缀
    {1601571560} 型运算符子子缀
    {340} 标识符
    {330} 符号整数
    {31153320} (表达式)
    {26330} 符号整数
    {160} +
    {170}
    {180} *
    {190}
    {200}
    {210} <>
    {220} <
    {230} <
    {240} >
    {250} >
    {313429137320} 标识符:类型)
    }

    *预测分析表非零元素*
    int pretable[][3]{{12811}{12912}{13023}{13033}
    {13063}{130343}{13073}{13093}{130113}{130123}
    {130133}{130263}{130283}{13124}{13135}{13165}
    {131345}{13175}{13195}{131115}{131125}{131135}
    {131265}{131285}{132346}{133277}{133285}{13438}
    {13465}{134345}{13475}{13495}{134115}{134125}
    {134135}{134265}{134285}{135349}{13665}{136135}
    {1363411}{136285}{137412}{137513}{138614}{138345}
    {13875}{13895}{138115}{138125}{138135}{138265}
    {138285}{139615}{140614}{140345}{14075}{14095}
    {140115}{140125}{140135}{140265}{140285}{1413416}
    {141717}{141918}{1411119}{1411220}{1411321}{141145}
    {141265}{141285}{1423422}{1433023}{1433141}{143285}
    {143285}{143145}{143265}{143145}{144724}{145925}
    {1461126}{1472710}{147295}{147325}{1481227}{1492728}
    {149325}{1501329}{150265}{150285}{1512830}{151145}
    {151265}{1512830}{1523431}{1521631}{1521731}{1523431}
    {1523331}{1523131}{1521532}{1533435}{1531633}{1531734}
    {1533435}{1533335}{1533135}{1541636}{1541736}{15485}
    {154105}{154145}{154205}{154215}{154225}{154235}
    {154245}{154255}{154265}{154275}{154285}{154325}
    {1553437}{1553337}{1553137}{1561838}{1561938}
    {15685}{156105}{156145}{156165}{156175}
    {156205}{156215}{156225}{156235}{156245}
    {156255}{156265}{156275}{156285}{156325}
    {1573439}{1573340}{1573141}{1583153}{158285}
    {1591643}{1591744}{1601845}{1601946}{1612047}
    {1612148}{1612249}{1612350}{1612451}{1612552}{000}}

    struct st
    {
    char name[21]
    int code
    }sym

    struct
    {
    char name[21]
    int type
    int addr
    }indent[1000] *标识符表*

    int table[34][35]
    FILE *f1 *f1输入文件指针*
    int line1row1val
    int lenth0

    void getsym()
    char getchr()
    void error(int n)

    void main(int argcchar *argv[])
    {
    if ((f1fopen(C\\Documents and Settings\\Administrator\\桌面\\编译\\测试txtr))NULL)
    {
    printf(cannot open the file\n)
    exit(0)
    }
    int stack[2000]
    int ijxtop1flag1
    i0

    while(pretable[i][0])*非零元素置预测分析表*
    {
    table[pretable[i][0]128][pretable[i][1]]pretable[i][2]
    i++
    }

    *#号识符号程序入栈*
    补充执行语句
    stack[++top]35

    stack[++top]128

    补充执行语句
    getsym()

    while(flag)
    {
    xstack[top] *取栈顶符号*
    if(x>128) *x非终结符*
    {
    if(table[x128][symcode])*果该预测分析表元素空计算规长度规反序入栈*
    {
    i0
    while(rule[table[x128][symcode]][i])
    {
    i++
    }
    for(ji1j>0j)
    {
    stack[++top]rule[table[x128][symcode]][j]
    }
    }
    else error(100)
    }
    else if(x<35) *x终结符#*
    {
    if(xsymcode) *栈顶元素输入元素匹配*
    {
    if(x35)补充判断条件
    *栈顶元素输入元素匹配时判断否#结束否继续*
    flag0
    else
    getsym()
    }
    else
    error(101)
    }
    else
    error(102) *栈顶元素输入元素匹配时出错*
    }
    fclose(f1)
    printf(the program is right\n)
    system(pause)
    }

    void getsym()
    {
    static char a[lenth1][10]{programconstvarintegerlongprocedureifthenwhiledoreadwritebeginendodd}d[lenth2][3]{+*<><<>>()}str[21]ch' '
    int in
    while(isspace(ch))
    chgetchr()
    if(isalpha(ch))
    {
    n0
    while(isalpha(ch)||isalnum(ch))
    {
    if(isalpha(ch))
    chtolower(ch)
    if(n<20)
    str[n++]ch
    chgetchr()
    }
    str[n]'\0'
    for(i0i if(strcmp(stra[i]))
    break
    if(i {
    strcpy(symnamea[i])
    symcodei+1
    }
    else*否标识符检查标识符表中否已登记该标识符没登记填表*
    {
    for(i0i if(strcmp(strindent[i]name))
    break
    if(ilenth)
    strcmp(indent[i]namestr)
    strcpy(symnameindent[i]name)
    补充执行语句
    symcode34
    }
    }
    else if(isalnum(ch))
    {
    val0n0
    while(isalnum(ch))
    {
    valval*10+ch'0'
    symname[n++]ch
    chgetchr()
    }
    symname[n]'\0'
    symcode33
    }
    else
    {
    if(ch'+'||ch''||ch'*'||ch''||ch''||ch''||ch''||ch''||ch'('||ch')')
    {
    str[0]ch
    str[1]'\0'
    chgetchr()
    for(i0i {
    if(strcmp(strd[i]))补充判断条件
    {
    strcpy(symnamestr)
    symcodei+16
    }
    }
    }
    else
    {
    n0
    if(ch'>'||ch'')
    {
    str[n++]ch
    if((chgetchr())'')
    {
    str[n++]chchgetchr()
    }
    }
    else
    {
    if(ch'<')
    {
    str[n++]chchgetchr()
    if(ch''||ch'>')
    {
    str[n++]chchgetchr()
    }
    }
    else if(ch1)
    {
    strcpy(symname)
    symcode35
    return
    }
    else
    {
    error(1)
    }
    }
    str[n]'\0'
    for(i0i {
    if(strcmp(strd[i]))
    {
    strcpy(symnamestr)
    symcodei+16
    }
    }
    }
    }
    }

    char getchr()
    {
    char chfgetc(f1)
    if(ch'\n')
    {
    row1
    line++
    }
    else
    if(ch' '&&ch'\t')
    row++
    return(ch)
    }

    void error(int n)
    {
    printf(There are d error\n n)
    exit(0)
    }

    四结果运行
    (1)输入:program a
    begin
    end#
    输出:the program is right







    (2)输入:program test2
    const a34b90
    输出:There are 100 error


    (3)输入:program test3
    procedure test
    const s3
    输出:There are 100 error

    (4)输入:program test
    if a>b then a6
    end#
    输出:There are 100 error























    (5)输入:program s
    begin
    if sym'+' then
    begin
    s'
    advance
    end
    else error
    输出:There are 100 error

    五两种方法较分析
    谓递降法指文法非终结符号根相应产生式候选式结构编写子程序 (函数)识该非终结符号表示语法范畴
    预测分析方法求文法必须LL(1)文法相较递降分析方法说更难
    计算机班
    文档香网(httpswwwxiangdangnet)户传

    《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
    该内容是文档的文本内容,更好的格式请下载文档

    下载文档到电脑,查找使用更方便

    文档的实际排版效果,会与网站的显示效果略有不同!!

    需要 2 香币 [ 分享文档获得香币 ]

    下载文档

    相关文档

    编译原理语法分析实验报告

    编译原理语法分析实验报告软工班一、 实验内容二、 实验目的三、 实验要求四、 程序流程图l 主函数;l scanner();l irparser()函数l yucu() /*语句串分析*/l...

    2年前   
    937    0

    物流预测方法汇编

    (事实上,需求预测必须将短期需求预测或生产进度安排与长期战略性需求预测有机结合起来,才会真正地起作用。短期预测是根据存储单位(SKU)水平做出的,它与销售、客户关系,以及依据预订库存或安排运输...

    11年前   
    682    0

    词法分析与语法分析程序设计

    l 实验三 词法分析与语法分析程序设计一.实验目的基本掌握计算机语言的词法分析程序和语法分析程序的设计方法。二.实验要求、内容及步骤实验要求:1.根据以下的正规式,画出状态图;标识符:<字母...

    1年前   
    277    0

    编译原理实验3-4预测分析表方法

    实验3-4 预测分析表方法班级:_ _ 学号:_ _ 姓名:_ _ 得分:_ _一、实验目的理解预测分析表方法的实现原理。二、实验内容: ...

    1年前   
    315    0

    2018年建筑能耗预测项目管理方法研究分析博士开题报告

    建筑能耗预测项目管理方法研究分析博士开题报告  博士开题报告——我国建筑能耗预测项目管理方法研究分析  1研究背景及意义  1.1研究背景  西方发达国家在其发展过程中无节制地使用能源,直到2...

    6年前   
    527    0

    6.项目分析预测

    项 目 分 析 预 测 规划 设计单位 环境 单体设计 房型 建材 周边商配 合计 10% 0% 5% 10% 25% 4% 3% 会所 小区配套 人气 ...

    10年前   
    10288    0

    市场调查、预测、分析

    市场调查、预测、分析  某地场调查、预测、分析:某地场调查、预测、分析也叫“某地场调查报告“,是指某地场对购买欲望和动机、对商品(或企业)的意见和要求及对商品价格浮动的文字材料。  格式:1....

    9年前   
    876    0

    44 人力资源规划内容与预测方法

    人力资源规划内容与预测方法   (一) 预测未来的组织结构     一个组织或企业经常随着外部环境的变化而变化,如全球市场的变化,跨国境应的需要,生产技术的突破,生产设备的更新,生产程序的...

    14年前   
    11029    0

    关于工作分析的方法

    关于工作分析的方法 1、工作分析的作用工作分析是重要的管理基础工作,阐明工作的任务、职责、及任职条件等内容,作为人员聘任、职位评价、绩效评估、职级设计以及薪资结构设计的基础。帮助改进公司...

    9年前   
    766    0

    关于工作分析的方法

    关于工作分析的方法 1、工作分析的作用 工作分析是重要的管理基础工作,阐明工作的任务、职责、及任职条件等内容,作为人员聘任、职位评价、绩效评估、职级设计以及薪资结构设计的基础。...

    13年前   
    18957    0

    煤炭产业形势分析及预测

    **县2009年煤炭产业形势分析及预测 县委、政府: 2008年全县61个煤矿(不含斑煤司2个矿)生产原煤157.6万吨。2009年我县大部份煤矿安全生产许可证到期(47个,占77%),目...

    11年前   
    10466    0

    地方税收情况预测分析

    2012年地方税收情况预测分析  2012年市地税局给予我局下达的税收任务是8800万元,市政府下达的任务是9850万元,开发区管委会的奋斗目标是10300万元。截止到7月22日,我局累计完...

    11年前   
    10259    0

    产品产销状况预测分析表

    产品产销状况预测分析表 日期 月预计 月预计 月预计 月预计 客户名称 产品种类 期末 初期 生产量 交货量 期末 初期 生产量 交货量 ...

    10年前   
    21676    0

    初二数学期中热身预测卷分析

    一、选择题(共10小题,每小题3分,满分30分)1.在中国有很多吉祥的图案深受大家喜爱,人们会用这些图案来装饰生活,祈求平安.比如下列图案分别表示“福”、“禄”、“寿”、“喜”,其中既是轴对称图...

    4年前   
    674    0

    全球光通讯市场预测与分析

    全球光通讯市场预测与分析一、光器件光纤市场报告1、 光器件    我们都知道光器件厂商度过了非常艰难的2002年。随着产品出货量降到不足2000年的五分之一,一些光器件大厂例如杰尔系统公司和北...

    9年前   
    486    0

    基于微博的信息热度评价与预测分析

    微博已成为时下非常热门的社交媒体平台,是一个庞大的关于信息分享和话题交流的平台,在人们线上社交活动中发挥着不可替代的作用,由于网络信息鱼龙混杂,所以本文通过了解微博的热度机制进而研究

    4年前   
    1071    0

    煤矿安全预测分析

     4月份安全预测分析 一、本月安全分析:本月安全情况较好车流一般,共接发列车29列,发运煤炭8568吨,到达2车122吨截止4月26日18时累计安全天数2637天。 1、      本月对...

    11年前   
    10260    0

    主成分分析方法与因子分析方法的比较研究

    主成分分析和因子分析是多元统计中较为关键和常用的两种方法,二者皆是从变量的方差-协方差结构着手,尽可能多的保存原始变量的信息。在此基础上用少量的新变量解释那些原始变量的统计分析方法。本篇论文对主...

    3年前   
    730    0

    「实例」工作分析与职务设计方法

    工作分析与职务设计 一、概述  (一)工作分析的定义    工作分析,是指根据工作内容,分析工作的性质、繁简难易、责任重轻,执行工作应具备的学识技能与经验,进而制定担任工作所需...

    13年前   
    19733    0

    第二讲:非分析方法

    · 分类法 · 排列法 · 点数法 · 配对比较法 · 点数加权法 · 工资市场调查 分类法 分类法是排列法的改革,又称归级法。它是在岗位分析基础上,采用...

    15年前   
    21161    0

    文档贡献者

    文***品

    贡献于2023-05-31

    下载需要 2 香币 [香币充值 ]
    亲,您也可以通过 分享原创文档 来获得香币奖励!
    下载文档

    该用户的其他文档