Bison/Yacc 尽管明确禁用了跟踪,但仍在打印调试消息

Bison/Yacc still printing debug messages despite tracing being explicitly disabled

我在 this repository windows 上使用 flex 和 bison 以及 Visual Studio 2019 来制作一个小型计算器应用程序。

之前我通过 VS 中的构建属性启用了 bison 调试消息。我现在已将其关闭、清理并重建项目,但调试消息仍然存在于计算器中。我还尝试了一些其他方法来明确禁用它,例如将 YYDEBUG 设置为 0 和 %define parse.trace false.

弹性

%option noyywrap

%{
#include <stdlib.h>
#include "calculator.tab.h"
#define YY_DECL extern "C" int yylex()
void yyerror(const char*);
%}

digit   [0-9]

%%

{digit}+    { 
                yylval = atoi(yytext);
                return INTEGER;
            }
[-+*/\n()]  {
                return *yytext;
            }
[ \t]       ;
.           {
                yyerror("Unrecognised character.");
            }

%%
start /B /WAIT /D "%(RootDir)%(Directory)" win_flex.exe --outfile="%(Filename).flex.cpp" --wincompat  "%(Filename)%(Extension)"
exit /b %errorlevel%

野牛

%{
#include <stdlib.h>
#include <stdio.h>
extern "C" int yylex();
void yyerror(const char*);
%}

%token INTEGER
%left '-' '+'
%left '*' '/'

%%

program:    
            program expr '\n'   { printf("Result: %d\n", ); }
            |
            ;
expr:
            | INTEGER       { $$ = ; }
            | expr '-' expr { $$ =  - ; }
            | expr '+' expr { $$ =  + ; }
            | expr '*' expr { $$ =  * ; }
            | expr '/' expr { $$ =  / ; }
            | '(' expr ')'  { $$ = ; }
            ;

%%

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

int main(void){
    yyparse();
    return 0;
}
start /B /WAIT /D "%(RootDir)%(Directory)" win_bison.exe --output="%(Filename).tab.cpp" --defines="%(Filename).tab.h"  "%(Filename)%(Extension)"
exit /b %errorlevel%

运行时输出

--(end of buffer or a NUL)
1+5
--accepting rule at line 14 ("1")
--accepting rule at line 18 ("+")
--accepting rule at line 14 ("5")
--accepting rule at line 18 ("
")
Result: 6
--(end of buffer or a NUL)

如何从我的应用程序中正确删除调试 messages/tracing?

这似乎是 lex 跟踪,我已经能够通过 bison/yacc 输入文件将其禁用。

在定义代码中,添加: extern int yy_flex_debug;

在您的主要方法中,添加: yy_flex_debug = 0;