繁体   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