修改后的基于LL(1)文法的语法分析程序

C++C++实现LL1语法分析 编译原理:语法分析使用方法:LL(1) 分析方法语法分析需求文件:1. 预测分析表2. 消除了左递归以及提取了左公因子的文法3. 原文件。 #include #include #include #include#include #include#include using namespace std;// 定义文法结构体struct 阅读详情

       对前一个程序做了修改,使用了C++标准库,去掉了自己编写的类,简洁了一点。

/*
 * 文件名称: 语法分析.h
 * 摘    要: 对任意输入LL(1)文法的分析表及字符串,本程序能自动判断所给字符串是
 *           否为该文法的句子,并能给出分析过程。
 * 当前版本: 1.2
 * 作    者: happyjyr
 * 完成日期: 2004.6.8
 * 修改日期: 2004.7.24
 *
*/

#include<iostream>
#include<stdio.h>
#include <string>
#include <stack>

using namespace std;

void showstack(stack< char > st)
{
 int i,j;
 char ch[100];
 j=st.size();
 for(i=0;i<j;i++)
 {
        ch[i]=st.top();
  st.pop();
 }
    for(i=j-1;i>=0;i--)
 {
  cout<<ch[i];
  st.push(ch[i]);
 }
}
bool find(char c,char array[])                     //查找函数,返回布尔值
{
 int i;
    bool flag=false;
 for(i=0;i<100;i++)
 {
  if(c==array[i])
   flag=true;
 }
 return flag;
}
int location(char c,char array[])                  //定位函数,指出字符所在位置
{
 int i;
 for(i=0;i<100;i++)
 {
  if(c==array[i])
   return i;
 }
}
void error()
{
   cout<<"                    出错!"<<endl;
}
void analyse(char Vn[],char Vt[],string M[100][100])
{
   int i,j,m,p,q,length,t,h;
   char w,X;
   string str;
opt0:
   cin>>str;
   for(i=0;i<str.size();i++)
   {
    if(!find(str[i],Vt))
    {  cout<<"输入字符串有误!请重新输入!"<<endl;
    goto opt0;
    break;}
   }
   stack <char> st;
   st.push('#');                                 
   st.push(Vn[0]);                  //#与识别符号入栈
   j=0;
   h=1;
   w=str[0];
   cout<<"步骤            "<<"分析栈                "<<"剩余输入串           "<<" 所用产生式"<<endl;
opt1:
   cout<<h<<"                ";                    //显示步骤
   h++;
   showstack(st);                                   //显示分析栈中内容
   cout<<"                      ";
    for(t=j;t<str.size();t++)
 {
  cout<<str[t];                              //显示剩余字符串
 }
   X=st.top();                             //上托栈顶符号放入X
   st.pop();
    if(find(X,Vt)&& X!='#')
   {
    if(X==w)                                    //分析栈的栈顶元素和剩余输入串的第一个元素相比较
    {    
     cout<<"                   "<<X<<"匹配"<<endl;
    j++;
     w=str[j];
     goto opt1;
    }
    else
     error();
 }
   else
   {
    if(X=='#')
    {
         if(X==w)
   {
    cout<<"                    "<<"接受!"<<endl<<endl;      
   }
       else
    error();
    }
       else 
    {
       p=location(X,Vn);
          q=location(w,Vt);
    string S1("NULL"),S2("null");
         if(M[p][q]==S1 || M[p][q]==S2)                                             //查找二维数组中的产生式
          error();
          else
    {  
          string str0=M[p][q]; 
        cout<<"                  "<<X<<"-->"<<str0<<endl;       //显示对应的产生式
    if(str0=="$")
     goto opt1;
    else
    {length=str0.size();                                //逆序进栈
            for(m=length-1;m>=0;m--)
      {
           st.push(str0[m]);
      }
           goto opt1;
    }
    }
    }
   }
}
main()
{  
 int i,k,n,r;
    char Vn[100],Vt[100],select;
    string M[100][100];
    cout<<"* 文件名称: 语法分析"<<endl;
    cout<<"* 摘    要: 对任意输入LL(1)文法的分析表及字符串,本程序能自动判断所给字符串是"<<endl;
    cout<<"*           否为该文法的句子,并能给出分析过程。"<<endl;
    cout<<"*--------------------------------------------------------------------*"<<endl;
    cout<<endl<<endl;
 opt2: 
 cout<<"请输入非终结符个数:";
 cin>>n;
 cout<<"请输入各终结符(#号表示结束)Vt[i]:";
 for(i=0;i<100;i++)
 {
  cin>>Vt[i];
  if(Vt[i]=='#')
  {
   r=i;
   break;
  }
 }
    for (i=0;i<n;i++)
 {
  cout<<"请输入非终结符Vn["<<i<<"]:";
  cin>>Vn[i];
        cout<<"请输入此非终结符对应各终结符的产生式右部(null或NULL表示出错;$表示空串):";
  for(k=0;k<=r;k++)
  {
   cin>>M[i][k];
  }
 }
opt3:
    cout<<"请输入要分析的字符串,且以#结束:";
    analyse(Vn, Vt, M);
    cout<<"             ************************请选择***********************"<<endl;
    cout<<"                                  1: 输入字符串"                  <<endl;
    cout<<"                                  2: 输入新分析表"                <<endl;
    cout<<"                                  0: 退  出"                      <<endl;
opt4:
    cin>>select;
    switch(select)
 {
        case '1': {goto opt3;break;}
        case '2': {goto opt2;}
        case '0': {break;}
        default:  {cout<<"输入错误!请重新选择:"<<endl;
             goto opt4;
          break;}
 }
    return 0;
}

 

编译原理笔记13:自上而下语法分析(3)构造预测分析表、LL(1) 文法 编译原理 阅读详情

相关推荐

LL(1)语法分析C++实现

目录 实验题目 流程图 实验步骤 1、给出LL(1)文法 2、FIRST集和FOLLOW集 3、构造分析表 代码步骤 1、分析器代码表示 2、运行函数 实验结果 实验题目 (1)E→E+T | E-T | T (2)T→T*F | T/F | F (3)F→P^F | P (4)P→(E) | i 此文法实际上可以表示加、减、乘、除、乘方运算法则,即有理运算法则。我们采用LL(1)分析法对以上文法进行分析。 流程图 实验步骤 1、给出LL(1)文法 原来的文法

qq_41547603的博客 5442

LL(1)文法自动生成语法分析程序的设计

任意输入LL(1)文法,自动构造LL(1)分析表并生成相应的语法分析程序,实现LL(1)分析过程;能对输入串进行语法分析,判断其是否符合文法

LL语法分析器和LR语法分析器的比较

最近正在读久负盛名的“龙书”,

misskanagi的技术小屋 1万+

LL(1)语法分析代码及报告

LL(1)语法分析代码及报告 编译原理 目 录 1 课题综述 1 1.1 课题来源 1 1.2 课题意义 1 1.3 预期的目标 1 1.4 面对的问题 2 1.5 需解决的关键技术 2 2 系统分析 2 2.1 涉及的基础知识 2 2.2 解决问题的基本思路 4 2.3 总体方案 5 2.4 功能模块框图 6 3 系统设计 6 3.1 算法描述 6 3.2 实现方法 8 3.3 流程图 9 4 代码编写 10 4.1 建立预测分析表 10 4.2 输入字符串进行分析 11 5 程序调试 14 6 测试与运行 14 6.1 运行环境 14 6.2 运行界面及结果 14 总 结 17 致 谢 18 参 考 文 献 19

编译原理:LL(1)文法判别(最简单最详细的介绍)

对于这两个产生式,D的右边均没有字符串,因此D的FOLLOW集合即B的FOLLOW集合和C的FOLLOW集合的并集。所以,求解一个产生式的SELECT集问题就转换为求一个字符串的FISRT集合和一个非终结符的FOLLOW集合的过程,因此只需要如何求解FIRST集合和FOLLOW集合即可。这里,由于S右边没有字符串,因此将该产生式左部D的FOLLOW集中的所有元素放入非终结符S的FOLLOW集合中。所以,D的FOLLOW集合就是S的FOLLOW集合,即FOLLOW(S)=FOLLOW(S)∪{#},求解得。

hanmo22357的博客 1万+

编译原理—LL(1)文法

LL(1)文法

weixin_47365232的博客 1万+

语法分析LL(1)分析

本篇介绍的LL(1)分析,这是一种自上而下分析的方法 关于语法描述的概念 自上而下分析 从文法的开始符号出发,向下推导。推出句子 根据输入串,从文法开始符号(根结点)出发,自上而下地为输入串建立语法树 eg: 有语法:S → xAy  A → ** | * 从左向右扫描输入串,取到 x 进行匹配时,分析文法开始符号 S 的产生式,只有一个 S → xAy, 那么只能将 S 推导为句型 xAy...

kafmws的博客 1万+

编译原理之LL(1)语法分析实验(附完整C/C++代码与测试)

编译原理实验之LL1语法分析实验,使用C语言实现,附带详细注释并测试结果

人生处处是围城,一切都是最好的安排! 2万+

编译原理LL1文法分析

一、实验目的: 根据某一文法编制调试LL1)分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对预测分析LL1)分析法的理解。 二、实验说明 1LL1)分析法的功能 LL1)分析法的功能是利用LL1)控制程序根据显示栈栈顶内容、向前看符号以及LL1)分析表,对输入符号串自上而下的分析过程。 2、LL1)分析法的前提 改造文法:消除二义性、消除左递归、提取左因子,判断是否为LL1文法, 3、LL1)分析法实验设计思想及算法 三、实验要求...

archerll的博客 8113

LL(1)文法与左递归

没有超群的记忆力和过目不忘的能力,担心自己忘了,就写下来好啦。 考虑如下文法, S -&gt; SA | A A - &gt;a 如何说明该文法LL(1)的? 我们首先要明确,LL(1)文法的一种性质,它描述的是这样一种文法, Predictive parsers, that is, recursive-descent parsers needing no b...

大葱的田地🌱 6777

java实现LL(1)文法分析,if语句识别,赋值语句识别

实验要求: 1.[实验项目] 实现LL(1)分析中控制程序(表驱动程序);完成以下描述赋值语句的LL(1)文法LL(1)分析过程。 G[A]:A→V=E E→TE′ E′→ATE′|ε T→FT′ T′→MFT′|ε F→ (E)|i A→+|- M→*|/ V→i 2.[设计说明] 终结符号i 为用户定义的简单变量,即标识符的定义。 3.[设计要求] (1)输入串应是词法分析的输出二元式序列,...

weixin_41705703的博客 4066

编译原理-语法分析详解

一文带你读懂语法分析(编译原理)一、前言二、前置知识三、自顶向下的语法分析1、自顶向下的分析会遇到的问题a. 二义性问题b. 回溯问题c. 左递归引起的无穷推导问题2、解决以上问题a. 二义性问题 一、前言   最近刚考完编译原理,抽出一点时间,来把学的知识总结一下,以便之后的回顾。在这篇博客里可能会稍作全面地讲解语法分析(学生角度),涉及到FIRST集和FOLLOW集的求取、自顶向下的语法分析和自底向上的语法分析。其中自顶向下的语法分析会包含预测分析法和递归下降法以及LL文法的介绍;自底向上的语法分析则会

qq_44753451的博客 1万+

编译原理实验三:语法分析程序

在进行语法分析之前需要先定义四则混合运算的语法规则,如下图,该语法规则可实现四则混合运算,包括+、-、*、/以及括号内的运算。

Kong08242022的博客 3080

编译原理(八)——LL(1)语法分析

一、LL(1)语法分析原理 LL(1)文法定义中的条件是为了满足选择规则时的唯一性,在我们选择规则的时候只能选择其中的一条规则进行推导,依据这样的思想构造的语法分析程序叫做LL(1语法分析程序 替换就是直接使用右部代替左部,而待判断字符串不变 匹配需要分析栈和字符串同时改变 整个语法分析器的结构: stack就是所谓的栈,栈顶是X1,分析的对象是输入流,这是我们用到的两个分析对象:VT是终极符集合(Terminal),非终极符集合。 二、LL(1)分析表的构造 终极符VT里还要增加一个#,竖着写非终

很注重数学和408 4510

【编译原理】第4章 LL(1)文法及其分析程序

4 LL(1)文法及其分析程序 目录一、自顶向下分析的问题二、LL(1)文法FIRST集、FOLLOW集和SELECT集LL(1)文法定义LL(1)分析程序实现三、非LL(1)文法的改造 语法分析任务:在词法分析识别出单词符号串的基础上,分析并判定程序的语法结构是否符合语法规则 分析算法分类(语法分析方法): 自上而下分析法:从文法的开始符号出发,反复使用各种产生式,寻找与输入符号匹配的最...

小羊咩咩的博客 6888

编译原理学习笔记(十八)~LL1文法

定义         文法G被称为是LL(1)文法,当且仅当为它构造的预测分析表中不含多重定义的条目。 第一个L代表从左到右扫描输入序列, 第二个L表示产生最左推导, 1表示在确定每一步 动作时向前看一个终结符。 具体怎么理解呢?         举个简单的例子吧,通过自上而下语法分析,我们可以利用FIRST()和FOLLOW()集合构造出预测分

海到无边天作岸 山登绝顶我为峰 6665

编译原理(1)----LL(1)文法(首符号集,后跟符号集,选择符号集)

编译原理(1)----LL(1)文法(首符号集,后跟符号集,选择符号集)

weixin_69884785的博客 3871

【编译原理】LL(1)文法

编译原理课程笔记,自上而下的语法分析LL(1)分析法,FIRST集和FOLLOW集的求法

m0_61819793的博客 6050
上一篇: 爱似流星
下一篇: 写在最后的暑假的最后时刻
happyjyr
博客等级 码龄22年 7粉丝 53原创
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值