簡體   English   中英

如何掃描輸入字符串以獲取令牌流

[英]How to scan input string for token stream

我正在做一個簡單的Lexical Analyzer C程序。 我首先要做的是標記輸入的語句。 (示例語句:printf1234 = --- abc)

如何使用strtok()分隔“ printf”,“ 1234”,“ =“,“ ---”和“ abc”?

這是我的實驗代碼:

#include <stdio.h>
#include <string.h>
#include <conio.h>

void main()
{
    char input_string[100];
    char string_storage[100][100];
    char *token;

    printf("Enter a string: ");
    gets(input_string);

    token = strtok(input_string, " ");
    while(token != NULL)
    {
        printf("%s\n",token);
        //strcpy(input_storage,token);
        token = strtok(NULL, " ");
    }
    getch();
}

strtok關於基於定界符進行空間細分。 在這里,您沒有清晰的分界線。 您正在尋找語義細分,該細分基於您希望每個令牌中包含的內容類型。 為此,您應該看一下正則表達式理論。 現在,您應該限制輸入語句的約束,例如,您有一個文本命令,然后是數字,然后始終是=符號,等等。

如您現在所了解的strtok您不能在這里使用。因為您不能為輸入使用特定的定界符集。 甚至即使您可以,也沒有足夠的通用令牌生成器。

您可以做的是,僅需簡單地首先確定將是什么令牌即可? 這樣,您將具有一組詞匯規則,這些規則將決定標記。 例如,4位數字將是一個令牌, =將是另一個,依此類推。 然后,您將具有一組獲取令牌的規則。 在此之前,這要容易得多。 這個問題已經解決。 您可以自己應用這些解決方案。

這就是所謂的詞法分析就是編譯器設計。 這里沒有任何意義。 正如您沒有提到任何語義上的內容一樣,您也可以在這里停止。 lex也許您可以看一下並獲得一些想法。 如果不需要或不需要此細節,則必須創建一些自動機來為您完成此任務。 (正則表達式處理就是您要做的)。

關於這一點的有趣討論可以在《龍書》中找到。 通過它-如果您想更深入地研究。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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