语法分析!!!

2024-06-09 01:44
文章标签 语法分析

本文主要是介绍语法分析!!!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、实验题目

根据给定文法编写调试预测分析程序,对任意输入串用预测分析法进行语法分析。

二、实验目的

加深对预测分析法的理解。

三、实验内容

在这里插入图片描述

四、实验代码

#include <iostream> 
#include <stdio.h> 
#include <string> 
#include <stack> 
using namespace std; 
char Vn[] = { 'E','e','T','t','F' }; //定义文法的非终结符,小写字母e表示E’
char Vt[] = { 'i','+','*','(',')','#' };//定义文法的终结符 
int LENVt = sizeof(Vt); 
void showstack(stack<char> st) //从栈底开始显示栈中的内容 
{ 
int i, j; 
char ch[100]; 
j = st.size(); 
for (i = 0; i < j; i++) 
{ 
ch[i] = st.top(); //依次获取栈顶元素并赋值给ch数组 
st.pop(); //栈顶元素出栈 
} 
for (i = j - 1; i >= 0; i--) 
{ 
cout << ch[i]; //逆序打印ch数组里的的元素 
st.push(ch[i]);//元素逆序入栈 
} 
} 
int find(char c, char array[], int n)//在array数组中查找字符c 
{ 
int i; 
int flag = 0; 
for (i = 0; i < n; i++) 
{ 
if (c == array[i]) 
flag = 1; 
} 
return flag; 
} 
int location(char c, char array[])//在array数组中查找字符c,若查找成功返回字 
//符c的下标 
{ 
int i; 
for (i = 0; c != array[i]; i++); 
return i; 
} 
void error()//打印程序出错信息 
{ 
cout << " error!" << endl; 
}
void analyse(char Vn[], char Vt[], string M[5][6], string str) 
{ 
int i, j, p, q, h, flag = 1; 
char a, X; 
stack<char> st; 
st.push('#');//‘#’入栈。 
st.push(Vn[0]);//Vn[0]入栈 
j = 0; 
//j指向输入串的指针 
h = 1; 
a = str[j]; 
cout << "步骤 " << "分析栈 " << "剩余输入串 " << "所用产生式" << endl; 
while (flag == 1) 
{ 
cout << h << " ";//显示步骤 
h++; 
showstack(st); //显示分析栈中内容 
cout << " "; 
for (i = j; i < str.size(); i++) 
cout << str[i]; //显示剩余字符串 
X = st.top(); 
if (find(X, Vt, LENVt) == 1) 
if (X == a) //分析栈的栈顶元素和剩余输入串的第一个元素相较 
if (X != '#') 
{ 
cout << " " << X << "匹配" << endl; 
st.pop(); 
a = str[++j]; 
//读入输入串的下一个字符 
} 
else 
{ 
cout << " " << "接受!" << endl << endl; 
flag = 0; 
} 
else 
{ 
error(); 
break; 
} 
else{ 
for (p = 0; p < sizeof(Vn); p++){
if(X == Vn[p]){
break;
}
}
//实现下标的转化(非终结符转换为行下标) 
for(q = 0; q < LENVt; q++){
if(a == Vt[q]){
break;
}
}
//实现下标的转化(终结符转换为列下标) 
string S1("NULL"), S2("null"); 
if (M[p][q] == S1 || M[p][q] == S2) 
//查找二维数组中的产生式 
{ 
error(); 
break; //对应项为空,则出错 
} 
else 
{ 
string str0 = M[p][q]; 
cout << " " << X << "-->" << str0 << endl; //显示相应生式 
st.pop(); 
if (str0 != "$") //$代表“空”字符 
for (i = str0.size() - 1; i >= 0; i--){ 
st.push(str0[i]);
}
//产生式右端逆序进栈 
} 
} 
} 
} 
int main() 
{ 
string M[5][6] = { "Te","NULL","NULL","Te","NULL","NULL", 
"NULL","+Te","NULL","NULL","$","$", 
"Ft","NULL","NULL","Ft","NULL","NULL", 
"NULL","$","*Ft","NULL","$","$", 
"i","NULL","NULL","(E)","NULL","NULL" 
};//预测分析表 
string str; 
int errflag, i; 
cout << "文法:E->E+T|T T->T*F|F F->(E)|i" << endl; 
cout << "请输入分析串(以#结束):" << endl; 
do 
{ 
errflag = 0; 
cin >> str; 
for (i = 0; i < str.size(); i++)if (!find(str[i], Vt, LENVt)) 
{ 
cout << "输入串中包含非终结符" << str[i] << "(输入错误)!" << endl; 
errflag = 1; 
} 
} while (errflag == 1); 
analyse(Vn, Vt, M, str); 
return 0; 
}

五、实验结果

正确识别:

在这里插入图片描述

错误识别:

在这里插入图片描述

这篇关于语法分析!!!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1043908

相关文章

Java | Leetcode Java题解之第385题迷你语法分析器

题目: 题解: class Solution {public NestedInteger deserialize(String s) {if (s.charAt(0) != '[') {return new NestedInteger(Integer.parseInt(s));}Deque<NestedInteger> stack = new ArrayDeque<NestedIntege

Golang | Leetcode Golang题解之第385题迷你语法分析器

题目: 题解: func deserialize(s string) *NestedInteger {index := 0var dfs func() *NestedIntegerdfs = func() *NestedInteger {ni := &NestedInteger{}if s[index] == '[' {index++for s[index] != ']' {ni.Add(

Python | Leetcode Python题解之第385题迷你语法分析器

题目: 题解: class Solution:def deserialize(self, s: str) -> NestedInteger:index = 0def dfs() -> NestedInteger:nonlocal indexif s[index] == '[':index += 1ni = NestedInteger()while s[index] != ']':ni.ad

梧桐数据库(WuTongDB):语法分析工具 PLY 详解

PLY (Python Lex-Yacc) 详解 PLY 是一个纯 Python 实现的词法分析器和语法分析器生成器,灵感来自经典的 Lex 和 Yacc 工具。它特别适合 Python 开发者,用于构建解析器、编译器、解释器和其他语言处理工具。 主要功能与特点 纯 Python 实现 PLY 是完全用 Python 编写的,这意味着它没有依赖于外部库,且非常适合 Python 环境下的项

梧桐数据库(WuTongDB):语法分析工具 ANTLR 详解

ANTLR (ANother Tool for Language Recognition) 详解 ANTLR 是一个广泛使用的语法分析工具,主要用于创建编译器、解释器、数据转换器和其他与语言相关的应用程序。它最初由 Terence Parr 开发,现在被广泛应用于各种编程语言和 DSL(领域特定语言)的开发中。ANTLR 通过生成解析器来处理语言的语法结构,支持自定义语言语法并自动生成相应的解析

【PL理论深化】(2) 语法分析 (Syntax) | 编程语言的语法结构:文法 | 语义结构 (Sematics)

💬 写在前面:编程语言是由归纳法生成的程序的集合。定义属于该语言的程序的形式的规则,即编写程序的规则,称为编程语言的 语法分析 (syntax) 而定义属于该语言的程序的意义的规则称为 语义结构(semantics)。这两者都是归纳定义的。 目录 0x00 语法分析(syntax analysis) 0x01 编程语言的语法结构:文法(grammar) 0x02 语义结构(Seman

预测分析法进行语法分析(编译原理)

预测分析法是一种表驱动的方法,它由下推栈,预测分析表和控制程序组成。实际上是一种下推自动机的实现模型。预测分析法的关键为预测分析表的构建,即文法中各非终结符first集和follow集的求得。预测分析法从开始符号开始,根据当前句型的最左边的非终结符和分析串中的当前符号,查预测分析表确定下一步推导所要选择的产生式,最终得到输入串的最左推导,完成输入串的语法检查。 其中主要建立first集,foll

开源软件:buttonrpc (C++语法分析)

开源软件:buttonrpc (C++语法分析) 本文采用知识共享署名 4.0 国际许可协议进行许可,转载时请注明原文链接,图片在使用时请保留全部内容,可适当缩放并在引用处附上图片所在的文章链接。 C++ 语法分析 templatetypenamestd::bindstd::is_same<R, void>::valuestd::enable_ifstd::decaystd::rev

自下而上语法分析、自上而下语法分析和递归下降法、预测分析法、LL(1)和LR是什么关系

自下而上语法分析、自上而下语法分析、递归下降法、预测分析法、LL(1)和LR都是与语法分析(语法解析)相关的概念和技术。它们在编译原理中扮演着重要的角色,用于将源代码的字符流转换为语法树(或抽象语法树,AST),以便进一步的编译和优化。以下是这些概念之间的关系和各自的特点: 自上而下语法分析(Top-Down Parsing) 自上而下语法分析从开始符号开始,根据文法规则推导输入字符串。主要方

编译原理-语法分析(实验 C语言)

语法分析 1. 实验目的 编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析 2. 实验要求 利用C语言编制递归下降分析程序,并对简单语言进行语法分析 2.1 待分析的简单语言的语法 用扩充的BNF表示如下: <程序> ::= begin<语句串> end<语句串> ::= <语句> {;<语句>}<语句> ::= <赋值语句><赋值表达式> ::= I