一、实验目的
任选一种有代表性的语法分析方法,如算符优先法、递归下降法、LL(1)、SLR(1)、LR(1)等,通过设计、编制、调试实现一个典型的语法分析程序,对实验一所得扫描器提供的单词序列进行语法检查和结构分析,实现并进一步掌握常用的语法分析方法。
二、基本实验内容与要求
选择对各种常见高级程序设计语言都较为通用的语法结构——算术表达式的一个简化子集——作为分析对象,根据如下描述其语法结构的 BNF 定义G2[<算术表达式>],任选一种学过的语法分析方法,针对运算对象为无符号常数和变量的四则运算,设计并实现一个语法分析程序。
G2[<算术表达式>]: <算术表达式> → <项> | <算术表达式>+<项> | <算术表达式>-<项> <项> → <因式> |<项><因式> | <项>/<因式> <因式> → <运算对象> | (<算术表达式>)
若将语法范畴<算术表达式>、<项>、<因式>和<运算对象>分别用 E、T、F 和 i 代表,则 G2 可写成:
G2[E]:E → T | E+T | E-T T → F | TF | T/F F → i | (E)
输入:由实验一输出的单词串,例如:UCON,PL,UCON,MU,ID ······
输出:若输入源程序中的符号串是给定文法的句子,则输出“RIGHT”,并且给出每一步分析过程;若不是句子,即输入串有错误,则输出“ERROR”,并且显示分析至此所得的中间结果,如分析栈、符号栈中的信息等,以及必要的出错说明信息。
要求:
1、确定语法分析程序的流程图,同时考虑相应的数据结构,编写一个语法分析源程序。
2、将词法、语法分析合在一起构成一个完整的程序,并调试成功。3、供测试的例子应包括符合语法规则的语句,及分析程序能判别的若干错例。对于所输入的字符串,不论对错,都应有明确的信息输出。
采用SLR1分析方法,首先将给定文法的SLR1分析表手工画出,存入到程序中,然后进行语法分析程序的实现。
四、源程序
#include <iostream>
#include <string>
#include <iomanip>
#include <cstring>
#include <fstream>
#include <stdio.h>
#include <cassert>
#include <vector>
//#define _CRT_SECURE_NO_WARNINGS
using namespace std;
/*
begin BEGIN 1
end END 2
if IF 3
then THEN 4
else ELSE 5
while WHILE 6
do DO 7
标识符 ID 8
浮点常数UCON 9
< LT 10
<= LE 11
== EQ 12
<> NE 13
> GT 14
>= GE 15
= IS 16
+ PL 17
- MI 18
* MU 19
/ DI 20
( LP 21 新增加的左括号
) RP 22 新增加的右括号
*/
const char* table1[] = {
" ","begin","end","if","then","else","while","do" };
const char* table2[] = {
" ","BEGIN","END","IF","THEN","ELSE","WHILE","DO","ID","UCON","LT","LE","EQ","NE","GT","GE","IS","PL","MI","MU","DI","LP","RP" };
char TOKEN[20];//用来依次存放一个单词词文中的各个字符。
char str[50];//存放词法分析后的表达式,将输入的表达式转变成只含有i和运算符的表达式
int len = 0;//词法分析后表达式的长度
//action表 char vt[8] = { '(',')','+','-','*','/','i','#' };
string action[16][8] = {
{
"s4","null","null" ,"null" ,"null","null","s5" , "null" },
{
"null","null","s6","s7","null","null","null","acc"},
{
"null","r3","r3","r3","s8","s9","null","r3"} ,
{
"null","r6","r6","r6","r6","r6","null","r6"},
{
"s4","null","null","null","null","null","s5","null"},
{
"null","r8","r8","r8","r8","r8","null","r8"},
{
"s4","null","null","null","null","null","s5","null"},
{
"s4","null","null","null","null","null","s5","null"},
{
"s4","null","null","null","null","null","s5","null"},
{
"s4","null","null","null","null","null","s5","null"},
{
"null","s15","s6","s7","null","null","null","null"} ,
{
"null","r1","r1","r1","s8","s9","null","r1"},
{
"null","r2","r2","r2","s8","s9","null","r2"} ,
{
"null","r4","r4","r4","r4","r4","null","r4"} ,
{
"null","r5","r5","r5","r5","r5","null","r5"} ,
{
"null","r7","r7"