簡體   English   中英

如何從AC文件中找到令牌?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM