小C语言--词法分析程序
小C語言--詞法分析程序
Time Limit:?1000 ms?Memory Limit:?65535 KiB
Submit?Statistic
Problem Description
小C語言文法?
1. <程序>→(){<聲明序列><語句序列>}
2. <聲明序列>→<聲明序列><聲明語句>|<聲明語句>|<空>
3. <聲明語句>→<標識符表>;
4. <標識符表>→<標識符>,<標識符表>|<標識符>
5. <語句序列>→<語句序列><語句>|<語句>
6. <語句>→< if語句>|< while語句>|< for語句>|<復合語句>|<賦值語句>
7. < if語句>→< if關鍵字>(<表達式>)<復合語句>|(<表達式>)<復合語句>< else關鍵字><復合語句>
8. < while語句>→< while關鍵字>(<表達式>)<復合語句>
9. < for語句>→< for關鍵字>(<表達式>;<表達式>;<表達式>)<復合語句>
10. <復合語句>→{<語句序列>}
11. <賦值語句>→<表達式>;
12. <表達式>→<標識符>=<算數表達式>|<布爾表達式>
13. <布爾表達式>→<算數表達式> |<算數表達式><關系運算符><算數表達式>
14. <關系運算符>→>|<|>=|<=|==|!=
15. <算數表達式>→<算數表達式>+<項>|<算數表達式>-<項>|<項>
16. <項>→<項>*<因子>|<項>/<因子>|<因子>
17. <因子>→<標識符>|<無符號整數>|(<算數表達式>)
18. <標識符>→<字母>|<標識符><字母>|<標識符><數字>
19. <無符號整數>→<數字>|<無符號整數><數字>
20. <字母>→a|b|…|z|A|B|…|Z
21. <數字>→0|1|2|3|4|5|6|7|8|9
22. < main關鍵字>→main
23. < if關鍵字>→if
24. < else關鍵字>→else
25. < for關鍵字>→for
26. < while關鍵字>→while
27. < 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;} }Sample 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,})Hint
Source
cai++
思路:使用空格,回車,界符和運算符分割字符串,然后對字符串進行分析(分析是整數,關鍵字,自定義標識符三者中的哪一種)
(1)空格,回車:利用cin的性質
(2)界符和運算符:利用temp數組
注意:數字+字母的形式(如:123abc)不屬于題干中單詞的5種分類的任何一種(文法中的18和19條表明整數只能由數字組成,而自定義標識符一定是標識符,標識符必須以字母開頭),但提交發現將這種形式歸為自定義標識符可以AC,就沒有細分
代碼:
#include <iostream>
#include <string.h>
#include <cstdio>
using namespace std;
char key[][6]={"main","if","else","for","while","int"};//列下標不能缺省
void f(char temp[])
{
? ? if(temp[0]>='0'&& temp[0]<='9')
? ? {
? ? ? ? cout<<"(integer,"<<temp<<")"<<endl;
? ? }
? ? else
? ? {
? ? ? ? for(int i=0;i<6;i++)
? ? ? ? {
? ? ? ? ? ? if(!strcmp(temp,key[i]))
? ? ? ? ? ? {
? ? ? ? ? ? ? ? cout<<"(keyword,"<<temp<<")"<<endl;
? ? ? ? ? ? ? ? return;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? cout<<"(identifier,"<<temp<<")"<<endl;
? ? }
}
int main()
{
? ? char code[2020]={0};
? ? char temp[2020]={0};//char數組要初始化,否則會有亂碼
? ? while(cin>>code)
? ? {
? ? ? ? for(int i=0;i<strlen(code);i++)
? ? ? ? {
? ? ? ? ? ? char x=code[i];
? ? ? ? ? ? if(x=='{'||x=='}'||x=='('||x==')'||x==','||x==';')
? ? ? ? ? ? {
? ? ? ? ? ? ? ? if(strlen(temp))
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? f(temp);
? ? ? ? ? ? ? ? ? ? memset(temp,'\0',sizeof(temp));
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? cout<<"(boundary,"<<x<<")"<<endl;
? ? ? ? ? ? }
? ? ? ? ? ? else if(x=='+'||x=='-'||x=='*'||x=='/')
? ? ? ? ? ? {
? ? ? ? ? ? ? ? if(strlen(temp))
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? f(temp);
? ? ? ? ? ? ? ? ? ? memset(temp,'\0',sizeof(temp));
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? cout<<"(operator,"<<x<<")"<<endl;
? ? ? ? ? ? }
? ? ? ? ? ? else if(x=='>'||x=='<'||x=='='||x=='!')//這里把!也作為運算符(雖然OJ上并沒有說明)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? if(strlen(temp))
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? f(temp);
? ? ? ? ? ? ? ? ? ? memset(temp,'\0',sizeof(temp));
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? if(i+1<strlen(code) && code[i+1]=='=')
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? cout<<"(operator,"<<x<<"=)"<<endl;
? ? ? ? ? ? ? ? ? ? i++;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? cout<<"(operator,"<<x<<")"<<endl;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? else
? ? ? ? ? ? {
? ? ? ? ? ? ? ? temp[strlen(temp)]=x;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? if(strlen(temp))
? ? ? ? {
? ? ? ? ? ? f(temp);
? ? ? ? ? ? memset(temp,'\0',sizeof(temp));
? ? ? ? }
? ? }
? ? return 0;
}
?
總結
以上是生活随笔為你收集整理的小C语言--词法分析程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WAMP 简易配置
- 下一篇: RNN实践之唐诗创作