簡體   English   中英

我正在嘗試在 C 中設計一個詞法分析器

[英]I'm trying to design a lexical Analyzer in C

我的代碼:

#include <stdio.h>

#include <ctype.h>

#include <string.h>


int main()

{

    int identifier_counter=0,constants_counter=0,operators_counter=0,delimeters_counter=0,i,j,x;
    char expr[50],operators[50],identifiers[50],constants[50],delimeters[50];
    printf("Enter the Expression: ");
    scanf("%[^\n]s",expr);
    for(i=0;i<strlen(expr);i++)
    {
        if(isspace(expr[i])){
            continue;
        }
        else if(isalpha(expr[i]))
        {
            identifiers[identifier_counter]=expr[i];
            identifier_counter++;
        }
        else if(isdigit(expr[i]))
        {
            x=(expr[i]-'0');
            i=i+1;
            while(isdigit(expr[i]))
            {
                x=x*10+(expr[i]-'0');
                i++;
            }
            i=i-1;
            constants[constants_counter]=x;
            constants_counter++;
        }
        else if(expr[i]==','||expr[i]==';'||expr[i]=='{'||expr[i]=='}')
        {
            if(expr[i]==',')
            {
                delimeters[delimeters_counter]=',';
                delimeters_counter++;
            }
            else if(expr[i]==';')
            {
                delimeters[delimeters_counter]=';';
                delimeters_counter++;
            }
            else if(expr[i]=='{')
            {
                delimeters[delimeters_counter]='{';
                delimeters_counter++;
            }
            else if(expr[i]=='}')
            {
                delimeters[delimeters_counter]='}';
                delimeters_counter++;
            }
            
        }
        else
        {
            if(expr[i]=='*')
            {
                operators[operators_counter]='*';
                operators_counter++;
            }
            else if(expr[i]=='-')
            {
                operators[operators_counter]='-';
                operators_counter++;
            }
            else if(expr[i]=='+')
            {
                operators[operators_counter]='+';
                operators_counter++;
            }
            else if(expr[i]=='=')
            {
                operators[operators_counter]='=';
                operators_counter++;
            }
            else if(expr[i]=='/')
            {
                
                operators[operators_counter]='/';
                operators_counter++;
            }
            else if(expr[i]=='%')
            {
                
                operators[operators_counter]='%';
                operators_counter++;
            }
        }
    }
    printf("\nIdentifiers are: ");
    for(j=0;j<identifier_counter;j++)
    {
        printf("%c ",identifiers[j]);
    }
    printf("\nConstants are: ");
    for(j=0;j<constants_counter;j++)
    {
        printf("%d ",constants[j]);
    }
    printf("\nDelimeters are: ");
    for(j=0;j<delimeters_counter;j++)
    {
        printf("%c ",delimeters[j]);
    }
    printf("\nOperators are: ");
    for(j=0;j<operators_counter;j++)
    {
        printf("%c ",operators[j]);
    }
    return 0;
}

我的查詢:

  1. 我想將變量名稱后的數字或下划線視為“標識符”。 例如:用戶輸入是“a4”。 我希望程序打印“標識符是:a4”。 在我的代碼中,“a”被視為標識符,“4”被視為常量。 如果用戶輸入是:“a 4”,則可以將“a”作為標識符打印,將“4”打印為常量,因為兩者之間有空格。

  2. 我想為數據類型生成一個令牌。 如果用戶鍵入“int”,它應該返回“數據類型為:int”。 我知道一個過程,但它既冗長又耗時,我試圖搜索是否有任何內置函數以便它們可以返回數據類型,但我找不到任何東西。

你能幫我解決這兩個查詢以及我應該如何相應地更新我的代碼。 謝謝你。

你應該把你的問題分成小塊。 首先,如何識別標識符? 編寫一個 function,它接受一個字符串並返回 true,如果它以標識符開頭。 如果你已經這樣做了,讓 function 返回標識符的長度。 現在對數字和你想要的一切做同樣的事情。 現在你已經構建了一個分詞器/詞法分析器。 我在這里有一個實現(但更大的一個)。

暫無
暫無

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

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