任务描述
基于第二章的词法分析程序,使用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)
注:本次任务各小组选择的语法分析方法及程序设计存在差异,因此通过部分或全部测试集均可通关(直接print测试集的输出,视为本关不通过)。
开始你的任务吧,祝你成功!
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int strlen(char s[]){
int i=0;
while(s[i] != '\0') i++;
if ( s[i-1] == '\n' ){
s[i-1]='\0';
return i-1;
}
return i;
}
void delEndLine(char s[]){
int len=strlen(s);
}
char** word = (char**) malloc(sizeof(char*)*20);
// word
int wordNum=0;
char* getSpile(int l,int r,char s[]){
char* a;
a=(char*) malloc(sizeof(char)*20);
int i=0;
for(int j=l ; j<=r; j++){
a[i++]=s[j];
}
a[i]='\0';
return a;
}
int spile(char s[]){
free(word);
word = (char**) malloc(sizeof(char*)*20);
wordNum = 0;
int len=strlen(s);
int spaceSign=-1;
if(s[0] == ' ') spaceSign=0;
for(int i=1; i<len; i++){
if(s[i] == ' ' && s[i-1] == ' ') spaceSign = i;
if(s[i] ==' ' && spaceSign != i){
// word = (char*) malloc(sizeof(char)*20);
word[wordNum] = getSpile(spaceSign+1,i-1,s);
wordNum++;
//分割','
int lenWordEnd = strlen(word[wordNum-1]);
if(word[wordNum-1][lenWordEnd-1] == ','){
if(lenWordEnd >= 2){
word[wordNum-1][lenWordEnd-1] = '\0';
word[wordNum] = (char*) malloc(sizeof(char)*20);
word[wordNum][0] = ',';
word[wordNum][1] = '\0';
// word[wordNum] = ",";
wordNum++;
}
}
}
if(s[i] == ' ') spaceSign = i;
}
if(spaceSign != len-1){
word[wordNum] = getSpile(spaceSign+1,len-1,s);
wordNum++;
}
int lenWordEnd = strlen(word[wordNum-1]);
if(word[wordNum-1