首页 > 编程语言 >【编译原理】用C/C++编写一个LL(1)解析器

【编译原理】用C/C++编写一个LL(1)解析器

时间:2023-12-09 14:57:15浏览次数:30  
标签:解析器 simpleexpr stmts LL C++ stmt arithexpr ID arithexprprime

任务描述

本关任务:用C/C++编写一个LL(1)解析器

相关知识

为了完成本关任务,你需要掌握:

  1. LL文法
  2. C/C++ 编程语言基础
  3. C语言的基本结构知识

LL(1)解析器

在创建解析器之前,你应该创建一个下面文法的LL(1)分析表。

C/C++

本实训涉及函数、结构体,标准流输入输出,字符串等操作

实验要求

实验文法定义

program -> compoundstmt
stmt -> ifstmt | whilestmt | assgstmt | compoundstmt
compoundstmt -> { stmts }
stmts -> stmt stmts | E
ifstmt -> if ( boolexpr ) then stmt else stmt
whilestmt -> while ( boolexpr ) stmt
assgstmt -> ID = arithexpr ;
boolexpr -> arithexpr boolop arithexpr
boolop -> < | > | <= | >= | ==
arithexpr -> multexpr arithexprprime
arithexprprime -> + multexpr arithexprprime | - multexpr arithexprprime | E
multexpr -> simpleexpr multexprprime
multexprprime -> * simpleexpr multexprprime | / simpleexpr multexprprime | E
simpleexpr -> ID | NUM | ( arithexpr )

 

起始符

Program

保留字

{ }
if ( ) then else
while ( )
ID =
> < >= <= ==
+ -
* /
ID NUM
E 是'空'

 

分隔方式

同一行的输入字符用一个空格字符分隔,例如: ID = NUM ; 红色标记为空格

错误处理

本实验需要考虑错误处理,如果程序不正确(包含语法错误),它应该打印语法错误消息(与行号一起),并且程序应该修正错误,并继续解析。 例如:

语法错误,第4行,缺少";"

输入

要求:在同一行中每个输入字符用一个空格字符分隔,无其余无关符号。

样例1输入

{
ID = NUM ;
}

 

样例2输入

{
If E1
then
s1
else
If E2
Then
S2
else
S3
}

样例3输入

{
while ( ID == NUM ) 
{ 
ID = NUM 
}
}

 

并没有E1,E2等符号,这只是指代表达式

输出

样例1输出 输出要求:在语法树同一层的叶子节点,在以下格式中有相同的缩进,用tab来控制缩减。如样例所示,相同颜色表示在语法树种他们在同一层。

program
    compoundstmt
        {
        stmts
            stmt
                assgstmt
                    ID
                    =
                    arithexpr
                        multexpr
                            simpleexpr
                                NUM
                            multexprprime
                                E
                        arithexprprime
                            E
                    ;
            stmts
                E
        }

 

样例3输出

语法错误,第4行,缺少";"
program
    compoundstmt
        {
        stmts
            stmt
                whilestmt
                    while
                    (
                    boolexpr
                        arithexpr
                            multexpr
                                simpleexpr
                                    ID
                                multexprprime
                                    E
                            arithexprprime
                                E
                        boolop
                            ==
                        arithexpr
                            multexpr
                                simpleexpr
                                    NUM
                                multexprprime
                                    E
                            arithexprprime
                                E
                    )
                    stmt
                        compoundstmt
                            {
                            stmts
                                stmt
                                    assgstmt
                                        ID
                                        =
                                        arithexpr
                                            multexpr
                                                simpleexpr
                                                    NUM
                                                multexprprime
                                                    E
                                            arithexprprime
                                                E
                                        ;
                                stmts
                                    E
                            }
            stmts
                E
        }

 

写的比较弱智的代码,应该还有蛮多bug的,oj的编译器好像又bug,可能会不输出,在开始输出一个回车,才能输出。

过两天发

 

标签:解析器,simpleexpr,stmts,LL,C++,stmt,arithexpr,ID,arithexprprime
From: https://www.cnblogs.com/hfang/p/17890936.html

相关文章

  • 用 C/C++ 编写一个 C 语言的语法分析器程序
    任务描述本关任务:用C/C++编写一个C语言的语法分析器程序。相关知识为了完成本关任务,你需要掌握:1.DFANFA,2.C/C++编程语言基础。3.C语言的基本结构知识自动机在编译原理课堂上已经教授了大家相关知识。在完成本实训前,一定要先设计相关自动机,再开始相关功能的实现。切勿......
  • 08-Shell计算命令
    1.expr命令expr(evaluateexpressions的缩写),译为“表达式求值”。Shellexpr是一个功能强大,并且比较复杂的命令,它除了可以实现整数计算,还可以结合一些选项对字符串进行处理,例如计算字符串长度、字符串比较、字符串匹配、字符串提取等.1.1计算语法expr算术运算符表达式#......
  • is not eligible for getting processed by all BeanPostProcessors 问题解决
    问题在做Springboot项目时遇到如下报错18.684INFOo.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:350restartedMainBean'org.apache.rocketmq.spring.autoconfigure.RocketMQAutoConfiguration'oftype[org.apache.rocket......
  • 报错:java.lang.IllegalArgumentException
    问题表象开发,测试环境运行正常的接口到现场报错,报错日志关键信息如下:java.lang.IllegalArgumentException:Invalidcharacterfoundintherequesttarget.ThevalidcharactersaredefinedinRFC7230andRFC3986。问题分析及原因由于代码在开发测试环境测试通过,判断大概......
  • C++ Qt开发:Qt的安装与配置
    Qt是一种C++编程框架,用于构建图形用户界面(GUI)应用程序和嵌入式系统。Qt由Qt公司(前身为Nokia)开发,提供了一套跨平台的工具和类库,使开发者能够轻松地创建高效、美观、可扩展的应用程序。其被广泛用于开发桌面应用程序、嵌入式系统、移动应用程序等。无论是初学者还是经验丰富的开发者......
  • javaScript/js 【call,apply,bind】
    在JavaScript中,call、apply和bind都是用于改变函数执行上下文(this的值)的方法。它们在不同的情境下有不同的用途。call方法:call方法允许你调用一个函数,并指定该函数内部的this值,以及将参数以单独的参数传递给函数。functiongreet(name){console.log(`Hello,${name}!Ia......
  • Qt6 c++教程2 Qt Creator简介
    2QtCreator简介QtCreator是Qt自带的集成开发环境(IDE),用于跨平台应用程序开发。在本章中,您将学习QtCreator集成开发环境的基础知识,并了解集成开发环境的用户界面(UI)。我们还将了解如何在QtCreator中创建和管理项目。本Qt模块包括使用QtCreator开发一个简单的Qt应用程序、......
  • C++基础 -1- 标准输入输出
    ———————标准输入输出——————— ......
  • hello world
    防火墙相关概念防火墙定义防火墙技术是通过有机结合各类用于安全管理与筛选的软件和硬件设备,帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障,以保护用户资料与信息安全性的一种技术。用途防火墙技术的功能主要在于及时发现并处理计算机网络运行时可能存在的安全风......
  • 使用8卡3090微调llama2-70B模型
    写在前面很多问题尚未弄清,还在进一步调整目前已知我用8卡的3090采用deepspeedZeRO3进行运行,下面是deepspeed3的配置1{2"fp16":{3"enabled":"auto",4"loss_scale":0,5"loss_scale_window":1000,6......