编译原理练习一(处理c源码)

原创 2018年04月17日 10:17:42

题目描述:编写一个程序,将C源码中的所有注释字母大写,注释之外的所有保留字大写,所有标识符小写

我使用的是js编程,先画出有限状态机的转换,再用双重switch,case处理自动转换机的状态,(双重循环嵌套的switch,case是

解决此类问题的一个模式,虽不是代码最简,但保证了简单清晰的结构)

首先是状态转换图:


按照状态图,写出代码如下:

const fs = require("fs");
var data="";
const redline = require("readline");
data = fs.readFileSync("test2.txt");
var tem = data.toString();
 var keys = ["auto","break","case","switch","char","const","continue","default","do","while",
"double","else","if","enum","extern","float","for","goto","int","long","register","return","short",
"signed","sizeof","static","struct","typedef","unino","unsigned","void","volatile"]; //关键字的定义
var charArray = "qwertyuiopasdfghjklzxcvbnm"
    +"QWERTYUIOPASDFGHJKLZXCVBNM";
var digitArray = [0,1,2,3,4,5,6,7,8,9];
    //对每一行的数据进行判断
    //用循环case处理
    var t1 = judge(tem);
    //console.log(t1);
fs.writeFileSync("test3.txt",t1.join(""));
console.log("写入完成");

function judge(str) {
        var m=0;
        var n=0;
        var tokens=[];
        for (m=0;m<str.length;) {
            var  state=1;
        while((state===1||state===2||state===3||state===4||state===6||state===9)
        && (m<str.length)){
            switch (state){
                case 1:
                    if(str.charAt(m) === '/'){
                        n=m;
                        m=m+1;
                        state=2;
                        break;
                    }else if ((charArray.indexOf(str.charAt(m))!==-1)||(str.charAt(m) === '_')){
                        n=m;
                        m=m+1;
                        state=9;
                        break;
                    } else{
                        n=m;
                        m=m+1;
                        state=11;
                        break;
                    }
                case 2:
                    if(str.charAt(m) === '/'){
                        m=m+1;
                        state=6;
                        break;
                    }else if (str.charAt(m) === '*'){
                        m=m+1;
                        state=3;
                        break;
                    } else{
                        m=m+1;
                        state=8;
                        break;
                    }
                case 3:
                    if(str.charAt(m) === '*'){
                        m=m+1;
                        state=4;
                        break;
                    }else{
                        m=m+1;
                        state=3;
                        break;
                    }
                case 4:
                    if(str.charAt(m) === '*'){
                        m=m+1;
                        state=4;
                        break;
                    }else if (str.charAt(m) === '/'){
                        m=m+3;
                        state=5;
                        break;
                    } else{
                        m=m+1;
                        state = 3;
                        break;
                    }

                case 6:
                    if(str.charAt(m) === '\r'){
                        m=m+2;
                        state=7;
                        break;
                    }else{
                        m=m+1;
                        state = 6;
                        break;
                    }
                case 9:
                    if((str.charAt(m) === '_')||(charArray.indexOf(str.charAt(m))!==-1)||(digitArray.indexOf(str.charAt(m))!==-1)){
                        m=m+1;
                        state=9;
                        break;
                    } else{
                        m=m+1;
                        state = 10;
                        break;
                    }
            }
        }
                switch (state){
                    case 5:
                        state=1; //块注释
                        var tem1=[];
                        tem1 =str.slice(n,m).split("");
                        for(var mm=0;mm<tem1.length;mm++){
                            if(charArray.indexOf(tem1[mm])!==-1){
                               tem1[mm] = tem1[mm].toUpperCase();
                            }
                        }
                        tokens.push(tem1.join(""));
                        break;
                    case 8:   //其他字符
                        state = 1;
                        break;
                    case 11:  //其他字符
                        state =1;
                        tokens.push(str.slice(n,m));
                        break;
                    case 7:  //行注释
                        state = 1;
                        var tem2=[];
                        tem2 =str.slice(n,m).split("");
                        for(var mm2=0;mm2<tem2.length;mm2++){
                            if(charArray.indexOf(tem2[mm2])!==-1){
                                tem2[mm2]= tem2[mm2].toUpperCase();
                            }
                        }
                        tokens.push(tem2.join(""));
                        break;
                    case 10:  //标识符或关键字
                        m=m-1;
                        state = 1;
                        var tem3=str.slice(n,m);
                        if(keys.indexOf(tem3.toLowerCase())!==-1){
                            tem3=tem3.toUpperCase();
                        }else {
                            tem3= tem3.toLowerCase();
                        }
                        tokens.push(tem3);
                        break;
                }
            }
        // n保存的是m的初值,也就是token的第一个指针指向的字符,m保存的是token的末尾的索引值
        return tokens;
}

经过简单的测试,没有问题,但是肯定不是包含了所有测试样例的。

先就这样啦。


编译原理作业:编写一个程序,使之将一个C程序除注释之外的所有保留字全部大写

这是编译原理编程课的一次编程题目,用的j2se实现
  • u014193283
  • u014193283
  • 2014-12-31 10:49:27
  • 1284

编译器练习:将C程序中的除注释外的所有保留字全部大写

/*programed by:alex shoaledit date:2009-3-22, Sunday revision:2*****************Program Objective:将C...
  • burnalex
  • burnalex
  • 2009-03-18 22:54:00
  • 831

Hmmm:在社交网络上展示不同的真实的你

相信每个人在生活中都有不同的一面:朋友面前的疯狂,同事间严肃,父母膝下乖巧,独处时的落寞;但你可能并不想所有人同时看到你不同的样子,在社交网络上亦是如此。有了 Hmmm,问题迎刃而解。 Hm...
  • leiphone
  • leiphone
  • 2012-05-24 09:48:13
  • 283

大写C语言注释

昨天无意中看到一道题:“编写一个程序,使一段合理C语言中的注释全部大写“。突然兴趣来了,于是决定自己动手来试试。这道题目看起来很简单,但是实际动起手来,还是有点难度。 C语言注释说明 注意问题 状态变...
  • cairo123
  • cairo123
  • 2017-01-07 18:17:58
  • 1622

编译原理练习一(处理c源码)

题目描述:编写一个程序,将C源码中的所有注释字母大写,注释之外的所有保留字大写,所有标识符小写我使用的是js编程,先画出有限状态机的转换,再用双重switch,case处理自动转换机的状态,(双重循环...
  • ArthurZhou96
  • ArthurZhou96
  • 2018-04-17 10:17:42
  • 92

编译原理实验之源程序的预处理及词法分析程序设计

题目要求:     1、实现预处理功能 源程序中可能包含有对程序执行无意义的符号,要求将其剔除。 首先编制一个源程序的输入过程,从键盘、文件或文本框输入若干行语句,依次存入输入缓冲区(字符型数据);...
  • u010668907
  • u010668907
  • 2014-09-08 23:41:15
  • 2863

编译原理---简易C编译器 生成汇编语言代码

  • 2008年12月15日 14:06
  • 1.08MB
  • 下载

c#的注释规范

1  规范目的 ……………………………………………………… 3 2  适用范围 ……………………………………………………… 3 3  代码注释 ……………………………………………………… ...
  • becausehome
  • becausehome
  • 2015-10-05 10:45:14
  • 524

注释转换 (将C注释转换为C++注释)

注释转换  注释转换 》  就是将代码中的注释转换为同一类的  , 比如是 C 语言 或者C++  C语言中  ,编译器默认的注释风格是    /*  .........*/    C++中 ...
  • WX_East
  • WX_East
  • 2016-08-11 10:41:38
  • 1332

TINY编译器《编译原理》

实现TINY+编译器 ,华南理工大学,《编译原理》课程实验
  • u012587561
  • u012587561
  • 2016-03-17 21:37:49
  • 2741
收藏助手
不良信息举报
您举报文章:编译原理练习一(处理c源码)
举报原因:
原因补充:

(最多只允许输入30个字)