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

该博客介绍了如何使用C/C++编写PL/0编译程序的语法分析部分,详细说明了编程要求和测试用例,包括正确和错误的输入示例,帮助读者理解语法分析在编译过程中的作用。
摘要由CSDN通过智能技术生成

任务描述
基于第二章的词法分析程序,使用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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值