日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

A - 小C语言--词法分析程序

發布時間:2025/3/21 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 A - 小C语言--词法分析程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Description
小C語言文法

  • <程序>→<main關鍵字>(){<聲明序列><語句序列>}

  • <聲明序列>→<聲明序列><聲明語句>|<聲明語句>|<空>

  • <聲明語句>→<標識符表>;

  • <標識符表>→<標識符>,<標識符表>|<標識符>

  • <語句序列>→<語句序列><語句>|<語句>

  • <語句>→< if語句>|< while語句>|< for語句>|<復合語句>|<賦值語句>

  • < if語句>→< if關鍵字>(<表達式>)<復合語句>|(<表達式>)<復合語句>< else關鍵字><復合語句>

  • < while語句>→< while關鍵字>(<表達式>)<復合語句>

  • < for語句>→< for關鍵字>(<表達式>;<表達式>;<表達式>)<復合語句>

  • <復合語句>→{<語句序列>}

  • <賦值語句>→<表達式>;

  • <表達式>→<標識符>=<算數表達式>|<布爾表達式>

  • <布爾表達式>→<算數表達式> |<算數表達式><關系運算符><算數表達式>

  • <關系運算符>→>|<|>=|<=|==|!=

  • <算數表達式>→<算數表達式>+<項>|<算數表達式>-<項>|<項>

  • <項>→<項>*<因子>|<項>/<因子>|<因子>

  • <因子>→<標識符>|<無符號整數>|(<算數表達式>)

  • <標識符>→<字母>|<標識符><字母>|<標識符><數字>

  • <無符號整數>→<數字>|<無符號整數><數字>

  • <字母>→a|b|…|z|A|B|…|Z

  • <數字>→0|1|2|3|4|5|6|7|8|9

  • < main關鍵字>→main

  • < if關鍵字>→if

  • < else關鍵字>→else

  • < for關鍵字>→for

  • < while關鍵字>→while

  • < int關鍵字>→int

  • 每行單詞數不超過10個
    小C語言文法如上,現在我們對小C語言寫的一個源程序進行詞法分析,分析出關鍵字、自定義標識符、整數、界符
    和運算符。
    關鍵字:main if else for while int
    自定義標識符:除關鍵字外的標識符
    整數:無符號整數
    界符:{ } ( ) , ;
    運算符:= + - * / < <= > >= == !=

    Input
    輸入一個小C語言源程序,源程序長度不超過2000個字符,保證輸入合法。

    Output
    按照源程序中單詞出現順序輸出,輸出二元組形式的單詞串。

    (單詞種類,單詞值)

    單詞一共5個種類:

    關鍵字:用keyword表示
    自定義標識符:用identifier表示
    整數:用integer表示
    界符:用boundary表示
    運算符:用operator表示

    每種單詞值用該單詞的符號串表示。

    Sample
    Input

    main() {int a, b;if(a == 10){a = b;} }

    Output

    (keyword,main) (boundary,() (boundary,)) (boundary,{) (keyword,int) (identifier,a) (boundary,,) (identifier,b) (boundary,;) (keyword,if) (boundary,() (identifier,a) (operator,==) (integer,10) (boundary,)) (boundary,{) (identifier,a) (operator,=) (identifier,b) (boundary,;) (boundary,}) (boundary,}) #include <cstring> #include <cstdio> #include <iostream> #include <algorithm>using namespace std;string key[] = {"main", "if", "else", "for", "while", "int"}; string res[] = {"keyword","identifier","integer","boundary","operator"};void judge(string str) {if (isdigit(str[0])) // 數字的話直接輸出{cout << "(" << res[2] << ","<< str << ")" << endl;}else // 判斷是關鍵字,還是自定義{bool flag = false; // false表示不是關鍵字,true表示是關鍵字for (int i = 0; i < 6 ; i ++ ) // 依次訪問key數組,查找關鍵字{if (str == key[i]){flag = true;cout << "(" << res[0] << "," << str << ")" << endl;break;}}if (!flag) // 是自定義{cout << "(" << res[1] << "," << str << ")" << endl;}} }inline void solve() {string s; // 使用string的好處是,可以直接忽略空格,空格轉換為換行,換行表示輸入一次結束while (cin >> s){string str = "";for (int i = 0; i < s.size(); i ++ ) // 識別出字符串s的一個個字符{if (s[i] == '=' || s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/' || s[i] == '<' || s[i] == '>' || s[i] == '!') // 判斷運算符{// 進入之前先把str中的判斷一下if (str.size()){judge(str);}str = "";if (i + 1 < s.size() && s[i + 1] == '=') // 用來識別 <= += >= != == -={cout << "(" << res[4] << "," << s[i] << s[i + 1] << ")" << endl;i ++ ;}else{cout << "(" << res[4] << "," << s[i] << ")" << endl;}}else if(s[i] == '(' || s[i] == ')' || s[i] == '{' || s[i] == '}' || s[i] == ',' || s[i] == ';') // 判斷界符{if (str.size()){judge(str);}str = "";cout << "(" << res[3] << "," << s[i] << ")" << endl;}else // 將數字、字符都存起來{str += s[i];}}if (str.size()){judge(str);}} } int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);solve();return 0; }

    總結

    以上是生活随笔為你收集整理的A - 小C语言--词法分析程序的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。