实验三 第1关:使用C/C++语言编写PL/0编译程序的语法分析程序

本博客介绍了如何使用C/C++语言基于已有的词法分析程序,编写PL/0语言的语法分析程序。任务包括将源代码上传至评测系统,系统会自动对比预期输出与实际结果。
摘要由CSDN通过智能技术生成

任务描述

基于第二章的词法分析程序,使用C/C++语言编写PL/0编译程序的语法分析程序。

编程要求

完成上述编程任务,将C/C++语言源程序复制粘贴到右侧代码编辑器,点击“评测”按钮,运行程序,系统会自动进行结果对比。

测试说明

平台会对你编写的代码进行测试:

测试输入:

  1. const a = 10;
  2. var b, c;
  3. procedure p;
  4. if a <= 10 then
  5. begin
  6. c := b + a;
  7. end;
  8. begin
  9. read(b);
  10. while b # 0 do
  11. begin
  12. call p;
  13. write(2 * c);
  14. read(b);
  15. end;
  16. end.

预期输出:

  1. 语法正确

测试输入:

  1. const a := 10;
  2. var b, c;
  3. procedure p;
  4. if a <= 10 then
  5. begin
  6. c := b + a;
  7. end;
  8. begin
  9. read(b);
  10. while b # 0 do
  11. begin
  12. call p;
  13. write(2 * c);
  14. read(b);
  15. end;
  16. end.

预期输出:

  1. (语法错误,行号:1)

测试输入:

  1. const a = 10;
  2. var b, c;
  3. //单行注释
  4. /*
  5. * 多行注释
  6. */
  7. procedure p;
  8. if a <= 10 then
  9. begin
  10. c := b + a
  11. end;
  12. begin
  13. read(b);
  14. while b # 0 do
  15. begin
  16. call p;
  17. write(2 * c);
  18. read(b);
  19. end;
  20. end.

预期输出:

  1. (语法错误,行号:13)

测试输入:

  1. const a = 10;
  2. var b, c;
  3. //单行注释
  4. /*
  5. * 多行注释
  6. */
  7. procedure p;
  8. if a <= 10 then
  9. begin
  10. c := b + a;
  11. end;
  12. begin
  13. read(b);
  14. while b # 0
  15. begin
  16. call p;
  17. write(2 * c);
  18. read(b);
  19. end;
  20. end.

预期输出:

  1. (语法错误,行号:17)

测试输入:

  1. const a := 10;
  2. var b, c d;
  3. //单行注释
  4. /*
  5. * 多行注释
  6. */
  7. procedure procedure fun1;
  8. if a <= 10
  9. begin
  10. c = b + a
  11. end;
  12. begin
  13. read(b;
  14. while b # 0
  15. begin
  16. call fun1;
  17. write 2 * c);
  18. read(b);
  19. end;
  20. end.

预期输出:

  1. (语法错误,行号:1)
  2. (语法错误,行号:2)
  3. (语法错误,行号:10)
  4. (语法错误,行号:11)
  5. (语法错误,行号:13)
  6. (语法错误,行号:16)
  7. (语法错误,行号:17)
  8. (语法错误,行号:20)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include <iostream>
#include <sstream>
using namespace std;
 
/* ------------ 全局变量声明定义 ------------ */
int lineNumber = 1; // 当前行号
 
char charTable[2000];				// 字符表 —— 存储输入程序的 所有字符,包括空格、换行等
string wordTable[200] = { "\0" };	// 单词表 —— 存储输入程序的 所有单词,包括换行
char word[88] = "\0";				// 存储单个字符,添加到 wordTable 中
 
string ENDsign = "end.";	// 结束标识符
int charIndex = 0;			// 记录当前 charTable 字符个数
int wordIndex = 0;			// 记录当前 wordTable 单词个数
 
int errorNum = 0;			// 语法错误个数
int errorLine = 0;			// 语法错误行
 
string reservedWord[20] = { // 保留字
	"begin","call", "const","do","end","if",
	"odd","procedure", "read","then",
	"var","while"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值