任务描述
基于第二章的词法分析程序,使用C/C++语言编写PL/0编译程序的语法分析程序。
编程要求
完成上述编程任务,将C/C++语言源程序复制粘贴到右侧代码编辑器,点击“评测”按钮,运行程序,系统会自动进行结果对比。
测试说明
平台会对你编写的代码进行测试:
测试输入:
const a = 10;
var b, c;
procedure p;
if a <= 10 then
begin
c := b + a;
end;
begin
read(b);
while b # 0 do
begin
call p;
write(2 * c);
read(b);
end;
end.
预期输出:
语法正确
测试输入:
const a := 10;
var b, c;
procedure p;
if a <= 10 then
begin
c := b + a;
end;
begin
read(b);
while b # 0 do
begin
call p;
write(2 * c);
read(b);
end;
end.
预期输出:
(语法错误,行号:1)
测试输入:
const a = 10;
var b, c;
//单行注释
/*
* 多行注释
*/
procedure p;
if a <= 10 then
begin
c := b + a
end;
begin
read(b);
while b # 0 do
begin
call p;
write(2 * c);
read(b);
end;
end.
预期输出:
(语法错误,行号:13)
测试输入:
const a = 10;
var b, c;
//单行注释
/*
* 多行注释
*/
procedure p;
if a <= 10 then
begin
c := b + a;
end;
begin
read(b);
while b # 0
begin
call p;
write(2 * c);
read(b);
end;
end.
预期输出:
(语法错误,行号:17)
测试输入:
const a := 10;
var b, c d;
//单行注释
/*
* 多行注释
*/
procedure procedure fun1;
if a <= 10
begin
c = b + a
end;
begin
read(b;
while b # 0
begin
call fun1;
write 2 * c);
read(b);
end;
end.
预期输出:
(语法错误,行号:1)
(语法错误,行号:2)
(语法错误,行号:10)
(语法错误,行号:11)
(语法错误,行号:13)
(语法错误,行号:16)
(语法错误,行号:17)
(语法错误,行号: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"