编译原理PL0语法分析实验1

这篇具有很好参考价值的文章主要介绍了编译原理PL0语法分析实验1。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

编译原理PL0语法分析实验1

1,待分析的简单语言的词法
相同点:都是分析种别码
不同点:词法分析器分析的是字符串中的单词的种别码(单词)
语法分析器分析的是字符串的文法是否正确(句子)
待分析的简单语言的语法

BNF:
(1)<程序>::=begin<语句串>end
(2)<语句串>::=<语句>{;<语句>}
(3)<语句>::=<赋值语句>
(4)<赋值语句>::=ID:=<表达式>
(5)<表达式>::=<项>{+<项>|-<项>}
(6)<项>::=<因子{*<因子>|/<因子>}

语法分析程序的功能
输入一个c语言的字符串,以#号结束,如果是文法正确的句子,那么程序就会输出成功信息;如果是文法错误的句子,那么程序就会输出错误的信息以及提示出错点在哪里
正确的文法:begin BNF文法 end#

【例1】
给定一个字符串,判断语法是否正确:
输入:begin a:=9;x:=2*3;b:=a+x end#
输出:成功!
输入:begin x:=a+b*c end
输出:错误!“end”后出错了
输入:begin x:=a+b*c
输出:错误!缺少“end”
输入:x:=a+b*c end#
输出:错误!缺少begin
程序验证代码(语法分析程序)

#include <studio.h>
#include <string.h>
void scaner();
void sentence();
void statement();
void expression();
void term();
void factor();
char *key[0]={"begin","if","then","while","do","end"},ch[100];
int p=0,kk=0,q,syn;
int main()
{
  printf("输入:\n");
  gets(ch);
  sentence();
  return 0;
}

void scanner()
{
  char token[100] = {};
  q = 0;
  while(ch[p] == ' ') p++;
  if((ch[p] >= 'a' && ch[p] <= 'z')||(ch[p] >= 'A' && ch[p] <= 'Z')
  {
        token[q++] = ch[p];
        p++;
        while((ch[p] >= '0' && ch[p] <= '9')||(ch[p] >= 'a' && ch[p] <= 'z') ||(ch[p] >= 'A' && ch[p] <= 'Z')) 
            token[q++] = ch[p++];

     syn = 10;
     token[q] = '\0';
     for(int n = 0;n < 6;n++)
        {
            if(strcmp(token,key[n]) == 0)
          {
               syn = n + 1;
             break;
          }
        }
    }
   else if(ch[p] >= '0' && ch[p] <= '9')
    {
        token[q++] = ch[p];
     p++;
     while(ch[p] >= '0' && ch[p] <= '9') 
            token[q++] = ch[p++];

     syn = 11;
    }
    else switch(ch[p])
    {
        case '<':
            token[q++] = ch[p++];
          if(ch[p] == '>')
          {
               syn = 21;
            token[q++] = ch[p++];
          }  
          else if(ch[p] == '=')
          {
            syn = 22;
                token[q++] = ch[p++];
          }
          else 
                syn = 23;
          break;
     case '>':
            token[q++] = ch[p++];
          if(ch[p] == '>')
            {
                syn = 24;
                token[q++] = ch[p++];
         }
            else 
                syn = 20;

            break;

        case ':':
            token[q++] = ch[p++];
            if(ch[p] == "="){
                syn = 18;
                token[q++] = ch[p++];
            }
            else 
                syn = 17;
            token[q++] = ch[p++];
            break;
        case '*':
            syn = 13;
            token[q++] = ch[p++];
            break;
        case '/':
            syn = 14;
            token[q++] = ch[p++];
            break;
        case '+':
            syn = 15;
            token[q++] = ch[p++];
            break;
        case '-':
            syn = 16;
            token[q++] = ch[p++];
            break;
        case '=':
            syn = 25;
            token[q++] = ch[p++];
            break;
        case ';':
            syn = 26;
            token[q++] = ch[p++];
            break;
        case '(':
            syn = 27;
            token[q++] = ch[p++];
            break;
        case ')':
            syn = 28;
            token[q++] = ch[p++];
            break;
        case '#':
            syn = 0;
            token[q++] = ch[p++];
            break;
        case '\n':
            syn = -2;
            break;
        default:
            syn = -1;
            break;
    }
}

void sentence()
{
    scaner();
    if(syn == 1)
    {
        statement();
        while(syn == 26) statement();
        if(syn == 6)
        {
            scaner();
            if(syn == 0) printf("成功!\n");
            else printf("错误!“end”后出错。\n");
        }
        else
        {
            printf("错误!缺少“end”。\n");
            kk = 1;
        }
    }
    else
    {
        printf("错误!缺少“begin”。\n");
        kk = 1;
    }
}

void statement()
{
    scaner();
    if(syn == 10)
    {
        scaner();
        if(syn == 18)
        {
            scaner();
            expression();
        }
        else
        {
            printf("错误!“:=”出错。\n");
            kk = 1;
        }
    }
    else    
    {
        printf("错误!句子出错。\n");
        kk = 1;
    }
    return;
}

void expression()
{
    term();
    while((syn == 13)||(syn == 14))
    {
        scaner();
        term();
    }
    return;
}

void term()
{
  factor();
  while((syn == 15)||(syn == 16))
  {
    scaner();
    factor();
  }  
    return;
}

void factor()
{
    if((syn == 10)||(syn == 11)) scaner();
    else if(syn == 27)
    {
        scaner();
        expression();
        if(syn == 28) scaner();
        else
        {
            printf("错误!“(”出错。\n");
            kk = 1;
        }
    }
    else
    {
        printf("错误!\n");
        kk = 1;
    }
    return;
}

//begin a:=9;x:=2*3;b:=a+x end#
//begin x:a+b*c en

————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

 

原文链接:https://blog.csdn.net/qq_44709970/article/details/121804295文章来源地址https://www.toymoban.com/news/detail-861085.html

到了这里,关于编译原理PL0语法分析实验1的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 编译原理2.3习题 语法制导分析[C++]

    图源:文心一言 编译原理习题整理~🥝🥝 作为初学者的我,这些习题主要用于自我巩固。由于是自学,答案难免有误,非常欢迎各位小伙伴指正与讨论!👏💡 第1版:自己的解题,与AI老师的判卷~🧩🧩 编辑: 梅头脑🌸  审核: 文心一言 题源: 龙书《编译原理》 Alfre

    2024年01月25日
    浏览(48)
  • 【编译原理】-- 递归下降语法分析设计原理与实现(C语言实现)

    本实验基于词法分析程序实现,可参考本人前面的文章。 目录 一、目标任务 二、程序功能描述 三、主要数据结构描述 四、程序结构描述 设计方法 First集和Follow集 递归子程序框图 函数定义及函数之间的调用关系 五、程序测试 测试用例1 测试结果1 测试用例2 测试结果2 测试

    2023年04月21日
    浏览(51)
  • 编译原理——语法分析器(C/C++代码实现)

    编写一个简单的LL(1)语法分析器。(注意:此实验是简化版的LL(1)文法,已给出预测分析表,不需要求FIRST和FOLLOW集,直接根据预测分析表编写程序即可) 根据编译原理理论课中学习的算术表达式文法,以及该文法LL(1)分析表,用C语言编写接受算术表达式为输入的语法

    2023年04月26日
    浏览(41)
  • 编译原理:算符优先分析实验

    什么是算符优先分析法 算符优先分析法是一种简单、直观的自下而上分析法 算符优先分析法就是仿照算术表达式的四则运算过程而设计的一种语法分析方法。 这种分析方法首先要规定运算符之间(确切地说终结符之间)的优先关系和结合性质,然后借助这种关系,比较相邻

    2024年02月06日
    浏览(39)
  • 编译原理——SLR(1)语法分析器(C/C++代码实现)

    设计、编制、实现并调试SLR(1)语法分析器,加深对语法分析的理解。 根据编译原理理论课中学习的算术表达式文法以及该文法的LR分析表,用C语言编写接受算术表达式为输入的语法分析器,以控制台(或文本文件,也可以结合词法分析器完成)为输入,控制台(或文件)

    2024年02月11日
    浏览(42)
  • 编译原理语法分析器(C/C++)(LR1文法)

            来写语法分析器了,有可能是老师不一样也有可能是学校不一样,我要做的语法分析器复杂一点,额,现在想来也不复杂(可能)。         这一次的实验是要进行语法分析,是要用LL1或者递归下降分析法或LR分析法(LR0、LR1)设计语法分析程序。这次我也是先去百

    2024年02月07日
    浏览(35)
  • 【编译原理实验】 -- 词法分析程序设计原理与实现(C语言实现)

    目录 目标任务 设计要求 一、程序功能描述 二、正则文法 三、程序结构描述 四、代码  五、程序测试  测试用例1 测试结果1 测试用例2 测试结果2 以下为正则文法所描述的 C 语言子集单词符号的示例,请补充单词符号:++,--, , , += , -= ,*=, /= ,(逻辑与),||(逻辑或),

    2024年02月02日
    浏览(127)
  • 【编译原理】 实验一:词法分析器的自动实现(Lex词法分析)

    相关代码实操移步视频 https://www.bilibili.com/video/BV13x4y1o7FL 1.借助词法分析工具Flex或Lex完成(参考网络资源) 2.输入:高级语言源代码(如helloworld.c) 3.输出:以二元组表示的单词符号序列。 通过设计、编制、调试一个具体的词法分析程序,加深对词法分析原理的理解,并掌握

    2024年02月08日
    浏览(56)
  • 编译原理实验三:算符优先分析算法的设计与实现

    实验三 算符优先分析算法的设计与实现 一、 实验目的 根据算符优先分析法,对表达式进行语法分析,使其能够判断一个表达式是否正确。通过算符优先分析方法的实现,加深对自下而上语法分析方法的理解。 二、 实验要求 1、输入文法。可以是如下算术表达式的文法(你

    2024年02月06日
    浏览(57)
  • 【编译原理】【C语言】实验三:递归下降分析法

    C语言 实验环境:Visual Studio 2019 author:zoxiii   用高级语言实现递归下降分析程序。使用输入串i*(i+i),输出分析栈中所有内容,并给出分析结果。   自顶向下分析就是从文法的开始符触发并寻找出这样一个推导序列:推导出的句子恰好为输入符号串;或者说,能否从根节

    2023年04月21日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包