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
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语言--词法分析程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vue表单
- 下一篇: 2021年12届蓝桥杯C++B组省赛