Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从lex中的while循环中断_C_Lex - Fatal编程技术网

C 从lex中的while循环中断

C 从lex中的while循环中断,c,lex,C,Lex,所以我在linux中使用了lex工具,陷入了一个尴尬的境地,我无法打破一个while循环 e、 g:我写了 while(1) { int x = yylex(); switch(x): case(ID):printf("ID"); case(NUM):printf("NUM"); } 现在我正在使用yyin读取一个文件;问题是while循环在读取整个文件后并没有失败,而是一直在终端请求更多的输入。因此,在调用while循环之后,我无法调用其他函数。我知道我遗漏了一些基本的东西,如

所以我在linux中使用了lex工具,陷入了一个尴尬的境地,我无法打破一个while循环

e、 g:我写了

while(1)
{
 int x = yylex();
 switch(x):
  case(ID):printf("ID");
  case(NUM):printf("NUM");

}
现在我正在使用yyin读取一个文件;问题是while循环在读取整个文件后并没有失败,而是一直在终端请求更多的输入。因此,在调用while循环之后,我无法调用其他函数。我知道我遗漏了一些基本的东西,如果有人能提供对这个问题的见解,那就太好了


谢谢大家的回答;作业提交日期前的紧张和睡眠不足;顺便说一句,我已经找到了我的答案。

好吧,虽然我承认我不熟悉lex是什么,但我确实对linux环境和终端了解很多,所以

尝试在终端中同时键入“Ctrl”和“c”。如果不起作用,请使用“Ctrl”+“z”。如果您不介意让进程在后台停止,直到计算机关闭并完全消失,那么在Ctrl+Z之后,您不需要做任何其他事情。如果Ctrl+C有效,那么程序结束,您就没事了

无论出于何种原因,如果两者都不起作用,如果您知道所编写程序的名称,您可以在终端中键入:

pkill -9 [insert name of program here]
…它将向进程发送一个不可识别的终止信号,并将其所有内存(RAM-它不会撤消对磁盘所做的更改)返回给父进程

如果您不知道该程序的名称,但您认为您可能能够识别它,您可以尝试:

top
这将调出终端中当前正在运行的所有进程。找到仍在运行的程序的名称后,按q退出top,然后使用在top中识别的名称键入上面的kill命令。如果您不知道程序名,并且Ctrl+Z有效,但不希望停止的作业在关闭计算机之前一直占用内存,则可以键入:

ps -a
而在运行(并停止)程序的终端会话中,显示为“stopped”的作业很可能是您的。同样,使用上面的pkill命令将杀死它。无论出于何种原因,如果您知道进程ID但不知道名称(我不知道您为什么会知道,但现在就知道了…),您可以使用命令“kill”而不是“pkill”(有关如何使用这些命令的说明在internet上到处都有,因此我在此不再提及它们。它们还有有用的帮助手册页,可以通过以下方式访问:

man [the name of the program you want help with; 'pkill' or 'kill', in this case.]

嗯,虽然我承认我不熟悉lex是什么,但我确实对linux环境和终端了解很多,所以

尝试在终端中同时键入“Ctrl”和“c”。如果不起作用,请使用“Ctrl”+“z”。如果您不介意在后台停止进程,直到计算机关闭并完全消失,在Ctrl+z之后,您不需要执行任何其他操作。如果Ctrl+c起作用,则程序结束,您就没事了

无论出于何种原因,如果两者都不起作用,如果您知道所编写程序的名称,您可以在终端中键入:

pkill -9 [insert name of program here]
…它将向进程发送一个不可识别的终止信号,并将其所有内存(RAM-它不会撤消对磁盘所做的更改)返回给父进程

如果您不知道该程序的名称,但您认为您可能能够识别它,您可以尝试:

top
这将调出终端中当前正在运行的所有进程。找到仍在运行的程序的名称后,按q键退出top,然后使用top中识别的名称键入上面的kill命令。如果不知道程序名称,并且Ctrl+Z有效,但不希望停止的作业继续占用内存y在关闭计算机之前,您可以键入:

ps -a
而在运行(并停止)程序的终端会话中,显示为“stopped”的作业很可能是您的作业。同样,使用上面的pkill命令将杀死它。如果出于任何原因,您知道进程ID,但不知道名称(我不知道您为什么会这样做,但您知道了…),您可以使用命令“kill”而不是“pkill”(有关如何使用这些命令的说明在internet上随处可见,因此我在此不再提及它们。它们还有一些有用的帮助手册页,可以通过以下途径访问:

man [the name of the program you want help with; 'pkill' or 'kill', in this case.]

我发现C代码存在一些问题,与
yylex()
函数内部的情况无关

while(1)
{
  int x = yylex();
  switch(x):
  case(ID):printf("ID");
  case(NUM):printf("NUM");
}
这显然不是您编译的源代码,因为它不能被接受为C。您需要将第一个冒号(在
开关(x)
之后)替换为一个打开的大括号
{
,并且您需要另一个关闭的大括号
}
,以生成:

while(1)
{   
    int x = yylex();
    switch(x)
    {   
    case(ID):printf("ID");
    case(NUM):printf("NUM");
    }   
}
这是语法上有效的C代码,但仍存在以下问题:

  • 在每个
    案例之后,可能会出现
    中断;
  • 可能应该有一个
    default:
    子句,它可以用来终止循环(但不能在开关的作用域内使用
    break
  • printf()
    语句应该打印一个换行符,以便显示数据
  • 由于
    yylex()
    在到达末尾时返回0,因此您可能应该修改代码,使其更像:

    void function(void)
    {
        int x;
        while ((x = yylex()) != 0)
        {   
            switch (x)
            {   
            case ID: 
                printf("ID\n");
                break;
            case NUM:
                printf("NUM\n");
                break;
            default:
                printf("Other: %d\n", x); 
                break;
            }   
        }   
    }
    
    这至少会向您显示发生了什么,并且不会有无限循环,除非您编写了
    lex
    分析器,使其无法正确终止。我选择不让默认情况终止循环,因为循环由
    yylex()
    限制,而是返回0


    当你写
    while时(1),你正在写一个无限循环。考虑循环是否真的是无限的,你是义不容辞的。如果不是,那么你应该能够在循环的顶部做一个测试,控制循环是否有另一个循环。< /P> < P>我看到C代码的一些问题,独立于