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;
我在 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;