国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

第1關(guān):使用C/C++語言編寫PL/0編譯程序的詞法分析程序

這篇具有很好參考價值的文章主要介紹了第1關(guān):使用C/C++語言編寫PL/0編譯程序的詞法分析程序。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

任務(wù)描述

使用C/C++語言編寫PL/0編譯程序的詞法分析程序。需要注意的點:

(1)識別非法字符:如 @ 、 & 和 ! 等;

(2)識別非法單詞:數(shù)字開頭的數(shù)字字母組合;

(3)標(biāo)識符和無符號整數(shù)的長度不超過8位;

(4)能自動識別并忽略/* */及//格式的注釋信息;

(5)詞法分析過程中遇到錯誤后能繼續(xù)往下識別,并輸出錯誤信息。

編程要求

完成上述編程任務(wù),將C/C++語言源程序復(fù)制粘貼到右側(cè)代碼編輯器,點擊“評測”按鈕,運行程序,系統(tǒng)會自動進(jìn)行結(jié)果對比。

測試說明

平臺會對你編寫的代碼進(jìn)行測試:

測試輸入:

const a = 10;
var   b, c;

procedure fun1;
    if a <= 10 then
        begin
            c := b + a;
        end;
begin
    read(b);
    while b # 0 do
        begin
            call fun1;
            write(2 * c);
            read(b);
        end
end.

預(yù)期輸出:

(保留字,const)
(標(biāo)識符,a)
(運算符,=)
(無符號整數(shù),10)
(界符,;)
(保留字,var)
(標(biāo)識符,b)
(界符,,)
(標(biāo)識符,c)
(界符,;)
(保留字,procedure)
(標(biāo)識符,fun1)
(界符,;)
(保留字,if)
(標(biāo)識符,a)
(運算符,<=)
(無符號整數(shù),10)
(保留字,then)
(保留字,begin)
(標(biāo)識符,c)
(運算符,:=)
(標(biāo)識符,b)
(運算符,+)
(標(biāo)識符,a)
(界符,;)
(保留字,end)
(界符,;)
(保留字,begin)
(保留字,read)
(界符,()
(標(biāo)識符,b)
(界符,))
(界符,;)
(保留字,while)
(標(biāo)識符,b)
(運算符,#)
(無符號整數(shù),0)
(保留字,do)
(保留字,begin)
(保留字,call)
(標(biāo)識符,fun1)
(界符,;)
(保留字,write)
(界符,()
(無符號整數(shù),2)
(運算符,*)
(標(biāo)識符,c)
(界符,))
(界符,;)
(保留字,read)
(界符,()
(標(biāo)識符,b)
(界符,))
(界符,;)
(保留字,end)
(保留字,end)
(界符,.)

測試輸入:

const 2a = 123456789;
var   b, c;

//單行注釋

/*
* 多行注釋
*/

procedure function1;
    if 2a <= 10 then
        begin
            c := b + a;
        end;
begin
    read(b);
    while b @ 0 do
        begin
            call function1;
            write(2 * c);
            read(b);
        end
end.

預(yù)期輸出:

(保留字,const)
(非法字符(串),2a,行號:1)
(運算符,=)
(無符號整數(shù)越界,123456789,行號:1)
(界符,;)
(保留字,var)
(標(biāo)識符,b)
(界符,,)
(標(biāo)識符,c)
(界符,;)
(保留字,procedure)
(標(biāo)識符長度超長,function1,行號:10)
(界符,;)
(保留字,if)
(非法字符(串),2a,行號:11)
(運算符,<=)
(無符號整數(shù),10)
(保留字,then)
(保留字,begin)
(標(biāo)識符,c)
(運算符,:=)
(標(biāo)識符,b)
(運算符,+)
(標(biāo)識符,a)
(界符,;)
(保留字,end)
(界符,;)
(保留字,begin)
(保留字,read)
(界符,()
(標(biāo)識符,b)
(界符,))
(界符,;)
(保留字,while)
(標(biāo)識符,b)
(非法字符(串),@,行號:17)
(無符號整數(shù),0)
(保留字,do)
(保留字,begin)
(保留字,call)
(標(biāo)識符長度超長,function1,行號:19)
(界符,;)
(保留字,write)
(界符,()
(無符號整數(shù),2)
(運算符,*)
(標(biāo)識符,c)
(界符,))
(界符,;)
(保留字,read)
(界符,()
(標(biāo)識符,b)
(界符,))
(界符,;)
(保留字,end)
(保留字,end)
(界符,.)

解題思路

雙指針 + map

思路分為兩步,分別為篩選與識別,篩選就是掃描篩選字符串,提取出符合要求的字符串,為識別做準(zhǔn)備,這一步可以用雙指針?biāo)惴?/span>實現(xiàn),而識別就是識別提取出來的字符串,看是否是保留字、運算符、界符、無符號整數(shù)、標(biāo)識符這五個中的一個,這一步可以用map實現(xiàn)識別。

運用雙指針?biāo)惴⊕呙杼崛∽址倪^程中,注意做好分類識別保留字、運算符、界符、無符號整數(shù)、標(biāo)識符的標(biāo)記,為后面分類識別做準(zhǔn)備。因為保留字、無符號整數(shù)、標(biāo)識符都是由數(shù)字或字母組成,所以可以直接掃描篩選由數(shù)字或字母組成的字符串,至于界符、運算符可以單獨掃描篩選。當(dāng)掃描提取出字符串時,我們就可以進(jìn)行分類識別了。最后注釋里的內(nèi)容是無效的,不用識別。文章來源地址http://www.zghlxwxcb.cn/news/detail-492993.html

代碼

//識別保留字、運算符、標(biāo)識符、界符、無符號整數(shù) (可能還存在沒有考慮的情況,僅供參考)
#include<bits/stdc++.h>
using namespace std;
map<string,int> B, Y; //B(保留字)、Y(運算符)
map<char,int> J, y; //J(界符)
string s;
int F; //(標(biāo)記'/*''*/'注釋) 
int main()
{
    B["const"]=B["var"]=B["procedure"]=B["begin"]=B["end"]=B["odd"]=B["if"]=B["then"]=B["call"]=B["while"]=B["do"]=B["read"]=B["write"]=1; //保留字,13個 
    Y["+"]=Y["-"]=Y["*"]=Y["/"]=Y["<"]=Y["<="]=Y[">"]=Y[">="]=Y["#"]=Y["="]=Y[":="]=1; //運算符,11個 
    y['+']=y['-']=y['*']=y['/']=y['<']=y['>']=y['=']=y['#']=y[':']=1;
    J['(']=J[')']=J[',']=J[';']=J['.']=1; //界符,5個
    string s1 = "http://", s2 = "/*", s3 = "*/", str;
    for(int id = 1; getline( cin, s); id++) {
        int f = 0; // (標(biāo)記'//'注釋) 
        for(int i=0; s[i]!='\0'; i++) { //雙指針?biāo)惴?掃描識別) 
            while(s[i]!='\0' && (s[i]==' ' || s[i]=='\t')) i++; //去掉空格與'\t'
            int f1 = 0, f2 = 0, f3 = 0, f4 = 0, flog = 0;
            int j1 = i, j2 = i; //j1(保留字、標(biāo)識符、無符號整數(shù))、j2(運算符)
            if(!((s[i]>='0'&&s[i]<='9') || (s[i]>='a'&&s[i]<='z') || (s[i]>='A'&&s[i]<='Z') || y[s[i]]==1 || J[s[i]]==1)) flog = 1; //標(biāo)記非法字符
            while(s[j1]!='\0' && ((s[j1]>='0'&&s[j1]<='9') || (s[j1]>='a'&&s[j1]<='z') || (s[j1]>='A'&&s[j1]<='Z')) ) {//識別數(shù)字與字母串
                if( s[j1]>='0'&& s[j1]<='9' ) f1 = 1; //標(biāo)記數(shù)字 
                else f2 = 1; //標(biāo)記字母 
                j1 ++;
            }
            while(s[j2]!='\0' && y[ s[j2] ] == 1) f3 = 1, j2 ++; //識別運算符,并標(biāo)記運算符 
            if(J[ s[i] ] == 1) f4 = 1; //識別界符,并標(biāo)記界符
            if(f1 || f2) str =  s.substr( i, j1-i); //提取字符串
            if(f1 == 1 && f2 == 0 && !f && !F) { //無符號整數(shù)
                if(str.size() <= 8)  cout<<"(無符號整數(shù),"<<str<<")"<<endl;
                else cout<<"(無符號整數(shù)越界,"<<str<<",行號:"<<id<<")"<<endl;
            }
            else if(f2 == 1 && B[str] != 1 && !f && !F) { //標(biāo)識符
                if(s[i]>='0' && s[i]<='9') cout<<"(非法字符(串),"<<str<<",行號:"<<id<<")"<<endl; //識別非法字符串
                else if(str.size() <= 8) cout<<"(標(biāo)識符,"<<str<<")"<<endl;
                else cout<<"(標(biāo)識符長度超長,"<<str<<",行號:"<<id<<")"<<endl;
            }
            else if(f2 == 1 && B[str] == 1 && !f && !F) cout<<"(保留字,"<<str<<")"<<endl; //保留字
            else if( f3 == 1) { //運算符及注釋
                str = s.substr( i, j2-i); // 提取字符串
                if(str == s1) f = 1; // '//'注釋,標(biāo)記'//' 
                else if(str == s2) F = 1; // '/*'注釋,標(biāo)記'/*'
                else if(str == s3) F = 0; // '*/'注釋,解除'/*/'標(biāo)記
                else if(!f && !F)
                    cout<<"(運算符,"<<str<<")"<<endl;
            }
            else if(f4 == 1 && !f && !F) //界符 
                cout<<"(界符,"<<s[i]<<")"<<endl;
            else if(flog == 1 && !f && !F) cout<<"(非法字符(串),"<<s[i]<<",行號:"<<id<<")"<<endl; //識別非法字符
            if(j1 != i) i = j1 - 1;
            else if(j2 != i) i = j2 - 1; 
        }
    }
    return 0;
 }

到了這里,關(guān)于第1關(guān):使用C/C++語言編寫PL/0編譯程序的詞法分析程序的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包