我的Lex and Yacc程序可以运行一次,然后在第二次尝试时崩溃?

剑龙

我有两个分别用Lex和Yacc编写的非常小的文件(试图删除所有其他混淆变量)。

Lex:

%{
    #include <stdlib.h>
    #include "y.tab.h"
    void yyerror(char *);
%}

%%

[a] {
    yylval = *yytext;
    return VAR;
    }

[ \t\n] ;

. yyerror("invalid character");

%%

int yywrap(void) {
 return 1;
}

Yacc:

%token VAR

%{
    void yyerror(char *);
    int yylex(void);
    #include <stdio.h>
%}

%%

butts:
    VAR { printf("%d\n", $1); }

%%

void yyerror(char *s) {
    fprintf(stderr, "%s\n", s);
}


int main(void) {
    #if YYDEBUG
    yydebug = 1;
    #endif
    yyparse();
    return 0;
}

当我编译整个东西(使用-DYYDEBUG)时,我得到的输出是:

Starting parse
Entering state 0
Reading a token: a
Next token is token VAR ()
Shifting token VAR ()
Entering state 1
Reducing stack by rule 1 (line 12):
   $1 = token VAR ()
97
-> $$ = nterm butts ()
Stack now 0
Entering state 2
Reading a token: a
Next token is token VAR ()
syntax error
Error: popping nterm butts ()
Stack now 0
Cleanup: discarding lookahead token VAR ()
Stack now 0

输入两次“ a”时。第一次询问Reading a token:程序时,我按“ a”键似乎运行良好,但是第二次,它会呕吐。

我不知道为什么会这样。

Brian Tompsett - 汤莱恩

这是因为您的语法文件说只允许一个“ a”。再有就是一个错误,因此您会得到一个错误。您的语法规则说:

butts: VAR 

仅此而已。

因此,语法匹配的唯一有效程序是:

a

任何其他输入,例如:

aa

或者:

a
a

会导致语法错误。您的规则非常明确地一个VAR 没有VARS序列;没有几个变量。只有一个VAR。

如果您希望它与输入中的多个匹配,则必须这样说。因此,语法必须描述允许的顺序:

butts: VAR | butts VAR

然后它将允许序列。

清楚点吗?

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

第二次我按录制按钮时,我的应用程序崩溃了

Xcode:我的用户位置在第一次运行模拟时没有显示,但是在第二次运行时显示

我的 javascript 单击事件在第二次单击时运行,但在第一次单击时不运行

当我尝试在按钮单击上第二次打开Dialogfragment(Alert-Dialog)时崩溃

第二次打开父片段时,我在Viewpager中崩溃

IllegalStateException:当我尝试第二次显示AlertDialog时

我可以在第二次触发事件时执行另一组代码吗?

当我第一次按下按钮时,它不会执行我的 JavaScript,直到我第二次按下它

当我第二次运行它时,从特定的行启动bash脚本

为什么我不是在第一次点击时收到数据,而是在 Angular 中第二次点击时收到数据?

为什么我第一次运行字计数器与第二次计数器会产生不同的输出?

当我第二次单击按钮时,此函数只执行一次,它保持相同的值

为什么当我想第二次上传文件(第一次完美)时出现 Multer 错误(在 express js 中)?

我的登录代码第一次不起作用?第二次呢?

我怎样才能让按键第一次执行,而第二次执行不同的操作?

我的拖放取消功能(弹出式),当我第二次尝试时不起作用(JQUERY)

是什么导致我的基本客户端/服务器套接字程序中的循环在第二次尝试时失败?

我希望代码在第一次点击时说出第一个词,在第二次点击时说出第二个词

当我第二次运行我的应用程序时出现空指针异常

为什么我的clickListener只会让我的应用第二次崩溃

为什么我的 tkinter 应用程序仅在第二次运行更新命令时关闭而没有错误消息?

当我第二次单击鼠标时(不是在当前窗口中),我可以获得一个函数吗?

当应用程序第二次运行时,不显示我的欢迎屏幕

我第二次使用sqlite3_prepare_v2导致SQLite崩溃

为什么我的第二次exec调用后ruby代码崩溃/退出?

当我第二次运行线程时:java.lang.IllegalThreadStateException:线程已启动

我有一个按钮,我需要在第一次单击时更改颜色并在第二次单击时更改回原始颜色

为什么我不能在第二次运行中运行代码?

为什么实体框架尝试第二次存储我的外键?