#include iostream
創(chuàng)新互聯(lián)堅信:善待客戶,將會成為終身客戶。我們能堅持多年,是因?yàn)槲覀円恢笨芍档眯刨?。我們從不忽悠初訪客戶,我們用心做好本職工作,不忘初心,方得始終。10年網(wǎng)站建設(shè)經(jīng)驗(yàn)創(chuàng)新互聯(lián)是成都老牌網(wǎng)站營銷服務(wù)商,為您提供網(wǎng)站建設(shè)、做網(wǎng)站、網(wǎng)站設(shè)計、HTML5、網(wǎng)站制作、品牌網(wǎng)站建設(shè)、微信小程序定制開發(fā)服務(wù),給眾多知名企業(yè)提供過好品質(zhì)的建站服務(wù)。
#include string
using namespace std;
string key[6] = {"begin", "if", "then", "while", "do", "end"};
//關(guān)鍵字
bool isKey( string str, int syn) //判斷是否為關(guān)鍵字,若是傳回相
應(yīng)關(guān)鍵碼的種別名
{
int i;
for(i=0; i6; i++)
{
if(str == key[i])
{
syn = i + 1;
return true;
}
}
return false;
}
bool isLetter(char c) //是否為字母
{
if((c = 'A' c = 'Z') || (c = 'a' c = 'z'))
return true;
else
return false;
}
bool isDigit(char c) //是否為數(shù)字
{
if(c = '0' c = '9')
return true;
else
return false;
}
void analyse(FILE *fileP)
{
int n;
char c;
string str = "";
while((c = fgetc(fileP)) != EOF)
{
if(c == ' ' || c == '\n' || c == '\t')
continue;
else if(isDigit(c)) //數(shù)字
{
while(isDigit(c))
{
str += c;
c = fgetc(fileP);
}
fseek(fileP, -1, SEEK_CUR);
cout "(11, " str ")" endl;
str = "";
}
else if(isLetter(c)) //字母開頭的
{
while(isDigit(c) || isLetter(c))
{
str += c;
c = fgetc(fileP);
}
fseek(fileP, -1, SEEK_CUR);
if(isKey(str, n))
cout "(" n ", " str ")" endl; //關(guān)鍵碼
else
cout "(10, " "\'" str "\'" ")" endl; //標(biāo)志符
str = "";
}
else //操作符等
{
switch(c)
{
case '+':
cout "(13, +)" endl;
break;
case '-':
cout "(14, -)" endl;
break;
case '*':
cout "(15, *)" endl;
break;
case '/':
cout "(16, /)" endl;
break;
case ':':
{
if(c=fgetc(fileP) == '=')
cout "(18, :=)" endl;
else
{
cout "(17, :)" endl;
fseek(fileP, -1, SEEK_CUR);
}
break;
}
case '':
{
c=fgetc(fileP);
if(c == '=')
cout "(22, =)" endl;
else if(c == '')
cout "(21, )" endl;
else
{
cout "(20, )" endl;
fseek(fileP, -1, SEEK_CUR);
}
break;
}
case '':
{
c=fgetc(fileP);
if(c == '=')
cout "(24, =)" endl;
else
{
cout "(23, )" endl;
fseek(fileP, -1, SEEK_CUR);
}
break;
}
case '=':
cout "(25, =)" endl;
break;
case ';':
cout "(26, ;)" endl;
break;
case '(':
cout "(27, ()" endl;
break;
case ')':
cout "(28, ))" endl;
break;
case '#':
cout "(0, #)" endl;
break;
}
}
}
}
int main()
{
FILE *fileP;
fileP = fopen("test.txt", "r");
cout "------詞法分析如下------" endl;
analyse(fileP);
return 0;
}
簡而言之就是先畫一個狀態(tài)圖,然后根據(jù)圖來編碼就行
一個簡單的xml的詞法分析器供參考
#include
stdio.h
#include
stdlib.h
#include
string.h
typedef
struct
{
char
*p;
int
len;
}
xml_Text;
typedef
enum
{
xml_tt_U,
/*
Unknow
*/
xml_tt_H,
/*
Head
?xxx?*/
xml_tt_E,
/*
End
/xxx
*/
xml_tt_B,
/*
Begin
xxx
*/
xml_tt_BE,
/*
Begin
End
xxx/
*/
xml_tt_T
/*
Text
xxx
*/
}
xml_TokenType;
typedef
struct
{
xml_Text
text;
xml_TokenType
type;
}
xml_Token;
int
xml_initText(xml_Text
*pText,
char
*s)
{
pText-p
=
s;
pText-len
=
strlen(s);
return
0;
}
int
xml_initToken(xml_Token
*pToken,
xml_Text
*pText)
{
pToken-text.p
=
pText-p;
pToken-text.len
=
0;
pToken-type
=
xml_tt_U;
return
0;
}
int
xml_print(xml_Text
*pText)
{
int
i;
for
(i
=
0;
i
pText-len;
i++)
{
putchar(pText-p[i]);
}
return
0;
}
int
xml_println(xml_Text
*pText)
{
xml_print(pText);
putchar('\n');
return
0;
}
int
xml_getToken(xml_Text
*pText,
xml_Token
*pToken)
{
char
*start
=
pToken-text.p
+
pToken-text.len;
char
*p
=
start;
char
*end
=
pText-p
+
pText-len;
int
state
=
0;
pToken-text.p
=
p;
pToken-type
=
xml_tt_U;
for
(;
p
end;
p++)
{
switch(state)
{
case
0:
switch(*p)
{
case
'':
state
=
1;
break;
default:
state
=
7;
break;
}
break;
case
1:
switch(*p)
{
case
'?':
state
=
2;
break;
case
'/':
state
=
4;
break;
default:
state
=
5;
break;
}
break;
case
2:
switch(*p)
{
case
'?':
state
=
3;
break;
default:
state
=
2;
break;
}
break;
case
3:
switch(*p)
{
case
'':
pToken-text.len
=
p
-
start
+
1;
pToken-type
=
xml_tt_H;
return
1;
default:
state
=
-1;
break;
}
break;
case
4:
switch(*p)
{
case
'':
pToken-text.len
=
p
-
start
+
1;
pToken-type
=
xml_tt_E;
return
1;
default:
state
=
4;
break;
}
break;
case
5:
switch(*p)
{
case
'':
pToken-text.len
=
p
-
start
+
1;
pToken-type
=
xml_tt_B;
return
1;
case
'/':
state
=
6;
break;
default:
state
=
5;
break;
}
break;
case
6:
switch(*p)
{
case
'':
pToken-text.len
=
p
-
start
+
1;
pToken-type
=
xml_tt_BE;
return
1;
default:
state
=
-1;
break;
}
break;
case
7:
switch(*p)
{
case
'':
p--;
pToken-text.len
=
p
-
start
+
1;
pToken-type
=
xml_tt_T;
return
1;
default:
state
=
7;
break;
}
break;
default:
pToken-text.len
=
p
-
start
+
1;
pToken-type
=
xml_tt_T;
return
1;
}
}
return
0;
}
int
main()
{
int
ret
=
0;
xml_Text
xml;
xml_initText(xml,
"?xml?root
ss
hahahoho/haha/root");
xml_Token
token;
xml_initToken(token,
xml);
ret
=
xml_getToken(xml,
token);
printf("ret=%d;text=",ret);
xml_print(token.text);
printf(";type=%d;\n\n",
token.type);
ret
=
xml_getToken(xml,
token);
printf("ret=%d;text=",ret);
xml_print(token.text);
printf(";type=%d;\n\n",
token.type);
ret
=
xml_getToken(xml,
token);
printf("ret=%d;text=",ret);
xml_print(token.text);
printf(";type=%d;\n\n",
token.type);
ret
=
xml_getToken(xml,
token);
printf("ret=%d;text=",ret);
xml_print(token.text);
printf(";type=%d;\n\n",
token.type);
ret
=
xml_getToken(xml,
token);
printf("ret=%d;text=",ret);
xml_print(token.text);
printf(";type=%d;\n\n",
token.type);
ret
=
xml_getToken(xml,
token);
printf("ret=%d;text=",ret);
xml_print(token.text);
printf(";type=%d;\n\n",
token.type);
ret
=
xml_getToken(xml,
token);
printf("ret=%d;text=",ret);
xml_print(token.text);
printf(";type=%d;\n\n",
token.type);
return
0;
}
goto語句也稱為無條件轉(zhuǎn)移語句,其一般格式如下: goto 語句標(biāo)號; 其中語句標(biāo)號是按標(biāo)識符規(guī)定書寫的符號, 放在某一語句行的前面,標(biāo)號后加冒號(:)。語句標(biāo)號起標(biāo)識語句的作用,與goto 語句配合使用。
如: label: i++;
loop: while(x7);
goto loop;
C語言不限制程序中使用標(biāo)號的次數(shù),但各標(biāo)號不得重名。goto語句的語義是改變程序流向, 轉(zhuǎn)去執(zhí)行語句標(biāo)號所標(biāo)識的語句。
goto語句通常與條件語句配合使用??捎脕韺?shí)現(xiàn)條件轉(zhuǎn)移, 構(gòu)成循環(huán),跳出循環(huán)體等功能。
擴(kuò)展資料:
go to在C語言中的應(yīng)用:
統(tǒng)計從鍵盤輸入一行字符的個數(shù)。
#includestdio.h
int?n=0;
int?main(void)?{
printf("input?a?string:?");
? loop:?if?(getchar()!='\n')?{
n++;
?goto?loop;
}
printf("output:?%d\n",n);
}
例如輸入:abcdefghijklmnopqrstuvwxyz
然后回車Enter
輸出:26
本例用if語句和goto語句構(gòu)成循環(huán)結(jié)構(gòu)。當(dāng)輸入字符不為'\n'時即執(zhí)行n++進(jìn)行計數(shù)。
然后轉(zhuǎn)移至if語句循環(huán)執(zhí)行,直至輸入字符為'\n'才停止循環(huán)。
參考資料:百度百科-go to 語句
本文名稱:go實(shí)現(xiàn)c語言詞法分析 c語言goats
分享地址:http://jinyejixie.com/article30/doppgpo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、網(wǎng)站維護(hù)、網(wǎng)站營銷、網(wǎng)站內(nèi)鏈、微信小程序、移動網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)