C 从lex中的while循环中断
所以我在linux中使用了lex工具,陷入了一个尴尬的境地,我无法打破一个while循环 e、 g:我写了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循环之后,我无法调用其他函数。我知道我遗漏了一些基本的东西,如
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代码的一些问题,独立于