資源簡介
設計思想
(1)程序主體結構部分:
說明部分
%%
規則部分
%%
輔助程序部分
(2)主體結構的說明
在這里說明部分告訴我們使用的LETTER,DIGIT, IDENT(標識符,通常定義為字母開頭的字母數字串)和STR(字符串常量,通常定義為雙引號括起來的一串字符)是什么意思.這部分也可以包含一些初始化代碼.例如用#include來使用標準的頭文件和前向說明(forward ,references).這些代碼應該再標記"%{"和"%}"之間;規則部分>可以包括任何你想用來分析的代碼;我們這里包括了忽略所有注釋中字符的功能,傳送ID名稱和字符串常量內容到主調函數和main函數的功能.
(3)實現原理
程序中先判斷這個句語句中每個單元為關鍵字、常數、運算符、界符,對與不同的單詞符號給出不同編碼形式的編碼,用以區分之。
PL/0語言的EBNF表示
::==;
::=={|};
::=+|-
::=*|/
::==|#|<||>=
::=a|b|…|X|Y|Z
::=0|1|2|…|8|9
三:設計過程
1. 關鍵字:void,main,if,then,break,int,Char,float,include,for,while,printfscanf 并為小寫。
2."+”;”-”;”*”;”/”;”:=“;”:”;”<“;”“;”>=“;”“;”=“;”(“;”)”;”;”;”#”為運算符。
3. 其他標記 如字符串,表示以字母開頭的標識符。
4. 空格符跳過。
5. 各符號對應種別碼
關鍵字分別對應1-13
運算符分別對應401-418,501-513。
字符串對應100
常量對應200
結束符#
四:舉例說明
目標:實現對常量的判別
代碼:
digit [0-9]
letter [A-Za-z]
other_char [!-@\[-~]
id ({letter}|[_])({letter}|{digit}|[_])*
string {({letter}|{digit}|{other_char})+}
int_num {digit}+
%%
[ |\t|\n]+
"auto"|"double"|"int"|"struct"|"break"|"else"|"long"|"switch"|"case"|"enum"|"register"|"typedef"|"char"|"extern"|"return"|"union"|"const"|"float"|"short"|"unsigned"|"continue"|"for"|"signed"|"void"|"default"|"goto"|"sizeof"|"do"|"if"|"static"|"while"|"main" {Upper(yytext,yyleng);printf("%s,NULL\n",yytext);}
\"([!-~])*\" {printf("CONST_string,%s\n",yytext);}
-?{int_num}[.]{int_num}?([E][+|-]?{int_num})? {printf("CONST_real,%s\n",yytext);}
"0x"?{int_num} {printf("CONST_int,%s\n",yytext);}
","|";"|"("|")"|"{"|"}"|"["|"]"|"->"|"."|"!"|"~"|"++"|"--"|"*"|"&"|"sizeof"|"/"|"%"|"+"|"-"|">"|"="|">="|"<<="|"&="|"^="|"|="|"=" {printf("%s,NULL\n",yytext);}
{id} {printf("ID,%s\n",yytext);}
{digit}({letter})+ {printf("error1:%s\n",yytext);}
%%
#include
Upper(char *s,int l)
{
int i;
for(i=0;i<l;i++)
{
s[i]=toupper(s[i])
代碼片段和文件信息
- 上一篇:多功能測溫報警漢字時鐘
- 下一篇:ArcGIS_最優路徑
評論
共有 條評論