2016-12-30 72 views
-1

我需要一個識別令牌末尾的函數,以便我可以將它保存在一個數組中並將其發送到我的自動裝置進行識別(操作員,關鍵字,標識符)詞法分析器:如何識別令牌的末尾

當我只輸入1個令牌時,自動機工作的很好,但是當有許多令牌包括空格時,它不起作用,我需要這個函數來刪除空格,並在每個令牌的末尾停止併發送每個令牌陣列到我的自動機功能,我'卡住..

我'用C

例如:ABC + d

:ABC令牌1

:+令牌2​​

:d令牌3

EX2:ABC++ D12 */Z(ABC,+,+,D12,*,/,Z )7個令牌 EX3:AD ++ - C(AD,+,+, - ,C)5個令牌

編輯:我'不使用任何工具,只有c與確定性有限自動機

+0

你在使用什麼詞彙分析工具?他們通常使用正則表達式來識別令牌。 – Barmar

回答

0
void lirelexeme(char chaine[500]){ 
int i,j=0,k; 
char tc,tc2;    
char lexeme[500];memset(lexeme,0,500); 

for(i=0;i<length;i++){ 
tc=chaine[i]; // terme courant 
tc2=chaine[i+1]; // terme suivant 

if(tc!=' ' && tc!='\0' && tc!='\n'&& tc!='\t'){ 

if((tc==':' && tc2=='=') || (tc=='>' && tc2=='=') || (tc=='<' && tc2=='=') || (tc=='<' && tc2=='>')){ // ex: a:=/>=/<= 
lexeme[0]=tc; 
lexeme[1]=tc2; 
lex(lexeme); 
memset(lexeme,0,500); 
j=0; // préparer pour recevoir le nouveau lexeme 
i++; // on évite de prendre tc2 
} 

這裏是將分割標記的功能,使用看跌期權()代替()是看到結果

注意:lex()是我做的詞法分析器函數,它將把token作爲參數並給你返回它的類型(常量,標識符,關鍵字,算術運算符,邏輯運算符)。 ..)

2

假設評論在較早的通行證中被剝奪。

現在你打了空白,一個字母,一個數字或一個標點符號。

空白或者不是標記,或者是解析器忽略的啞/空標記。

一個字母必須是標識符的一部分。它由一個字母(或下劃線,那裏的小曲線球),零個或多個字母或數字組成。除下劃線以外的空格或標點符號會終止該標記。

數字必須是數字的一部分。規則有點複雜,前面的0表示ocatal(過時),前面的0x表示十六進制,1-9表示十進制。後綴是允許的,科學記數法也是如此。但任意的[標點符號或空白字符終止數字。對於一元 - ,++,< =,+ =和其他化合物有一點煩瑣的規則。 Bu這些令牌沒有附加值。 ++總是++。

字符串是下一個大問題,因爲引號可以被轉義。

但就是這樣。爲C源構建一個詞法分析器並不難。

(見MiniBasic瞭解如何編寫一個簡單但功能齊全的遞歸下降解析器的簡單語言。 https://sourceforge.net/projects/minibasic/files/?source=navbar