[英]How to find tokens from a c file?
我正在嘗試從C源文件生成令牌。 我已將C文件拆分為一個數組line
,並將整個文件的單詞存儲在一個數組words
。
問題在於strtok()
函數,該函數在空白字符上分割行。 因此,我沒有得到某些分隔符,例如括號和方括號,因為它們與其他標記之間沒有空格。
如何確定哪個是標識符,哪個是運算符?
到目前為止的代碼:
int main()
{
/* ... */
char line[300][200];
char delim[]=" \n\t";
char *words[1000];
char *token;
while (fgets(&line[i][0], 100, fp1) != NULL)
{
token = strtok(&line[i][0], delim);
while (token != NULL)
{
words[j++] = token;
token = strtok(NULL, delim);
}
i++;
}
for(i = 0; i < 50; i++)
{
printf("%s\n", words[i]);
}
return 0;
}
這是一個棘手的問題,這個問題可能需要比StackOverflow答案更深入的問題。 盡管如此,我會嘗試的。
對輸入進行標記化是編譯過程的第一部分 。 目的是簡化解析器的任務,該解析器將使用文件的內容創建一個抽象語法樹。 我們如何簡化呢? 我們確實認識到那些具有特殊含義的標記,還有標識符,運算符... C確實是一種棘手的復雜語言。 讓我們簡化語言來標記化:我們將從一個典型的計算器開始。
輸入示例為:
( 4 +5)* 2
當語法免費時,您可以添加或跳過空格,因此,正如您已經嘗試過的那樣,不能選擇按空格分割。
上面的示例的標記化輸出為:LPAR,LIT,OP,LIT,RPAR,OP,LIT。 含義如下:
LPAR: Left parenthesis
RPAR: Right parenthesis
LIT: Literal (a number)
OP: Operator (say: +, -, * and /).
因此,完整的輸出為:
{ LPAR, LIT(4), OP('+'), LIT(5), RPAR, OP('*'), LIT(2) }
您的詞法分析器基本上必須使用狀態機逐字符逐個輸入。 例如,當您閱讀一個數字時,您將進入“輸入文字”狀態,在該狀態中僅包含其他數字和“。”。 被允許。
現在,解析器的任務更加簡單。 如果使用先前的標記來填充它,則不必跳過空格,也不必區分負數和減號,它可以在列表或數組中前進。 如您所見,它可以遵循令牌的類型運行,並且其中一些具有關聯的數據。
無論如何,這只是介紹的介紹。 有關整個編譯過程的信息可以填滿一本書。 實際上,有很多專門針對該主題的書籍,例如Aho,Sethi&Ullman着名的《 龍書 》。 更新的一本是《 老虎書 》。
最后,詞法分析器彼此之間非常相似,因此可以在那里找到通用詞法分析器 。 您甚至還可以找到此類工具的C語法 。
希望這(以某種方式)有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.