c - C语言词法分析——如何在多行注释检测中读取并输出星号?

标签 c lexical-analysis lexical

我正在开发一个词法分析程序,在检测单行注释时一切正常。这是我的单行注释检测代码。

//Single Comment
if ((Current_Character == '/') && (fgetc(File_Input) == '/')){
    printf("%c", Current_Character);
    do{
        printf ("%c", Current_Character);
        Current_Character = fgetc (File_Input);
    }while(Current_Character != '\n');
    printf("\b \t | COMMENT\n", Current_Character);
    i = -1;
    Lexeme_Count++;
    Comment_Count++;
}

但是当我尝试检测多行注释时出现逻辑错误,无法检测到开头的星号。这是我的多行注释检测代码:

//Multi-Line Comment
if((Current_Character == '/') && (fgetc(File_Input) == '*')){ 
    printf ("%c", fgetc(File_Input));
    do{
        printf ("%c", Current_Character);
        Current_Character = fgetc(File_Input);
    }while(Current_Character != '/');

    printf("\b | COMMENT\n", Current_Character);
    i = -1;
    Lexeme_Count++;
    Comment_Count++;
}

当前字符是多行注释的第一个字符,它是反斜杠,第二个字符是(fgetc(File_Input)(从文件中获取下一个最新字符)用于打开askterisk。

这是我输入的文件内容:

#include <conio.h>

{

int a[3],t1,t2;

t1=2; a[0]=1; a[1]=2; a[t1]=3;

t2=

-

(a[2]+t1*6)/(a[2]

-

t1);

if t2>5 then

print(t2);

else {

int t3;

t3=99;

t2=

-

25;

print(

-

t1+t2*t3); // this is a comment on 2 lines

} endif /* THIS IS A MUTLI-LINE COMMENT  ON 2 LINES
*/ }

This is my current output

最佳答案

你有:

if((Current_Character == '/') && (fgetc(File_Input) == '*')){ 
    printf ("%c", fgetc(File_Input));
    do{
        printf ("%c", Current_Character);
        Current_Character = fgetc(File_Input);
    }while(Current_Character != '/');

第一个 printf() 应该打印 fgetc() 返回的字符,您知道它是一个 *,所以你可以使用 putchar('*'); 或(如果你真的坚持)printf("%c", '*')printf("* ").

请注意,您还有另一个潜伏的问题:

x = a/b;

尚不清楚您的注释 block 中的哪一个先执行,但是它们在除法之后都丢失了 b 。在 C 中的注释检测中还有许多其他的微妙之处——我不会让您厌烦所有这些,但足以说“在 C 中删除注释是一项艰巨的工作”(在 C++ 中更难)。您没有解决的问题之一是意外的 EOF(文件结尾)。

您可能需要一个 peek() 函数来查看下一个字符而不使用它:

int peek(FILE *fp)
{
    int c = fgetc(fp);
    if (c != EOF)
        ungetc(c, fp);
    return c;
}

关于c - C语言词法分析——如何在多行注释检测中读取并输出星号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47826651/

相关文章:

c++ - 如何附加到文本文件?

捕获并显示调用 C system() 的返回值

c - 如何为词法分析器创建makefile?

c - build 一台扫描仪。识别代币

php - PHP 在匿名函数/闭包中是否有词法作用域?

c - 在 C 中重新声明变量

c - 从 CSV 存储数据时发生访问冲突

python - 更有效的方法是用 python 按空格拆分引用的字符串?

flex-lexer - 如何使用 Flex(快速词法分析器)解词?

当查询有效时,Java Apache Jena SparQL 查询返回词法错误