나는 논리적 표현을 평가하기위한 파서를 작성했다. flex와 bison은 전역 변수 (예 : yylval)를 사용합니다. 순수한 파서와 쓰레드 프로그래밍을위한 재진입 스캐너가 필요하다. 내 '.Y'파일은 여기에 있습니다 :"win_flex bison"을 사용하여 순수 파서 및 재진입 스캐너를 작성하는 방법은 무엇입니까?
%{
#include <stdio.h>
#include <string>
#define YYSTYPE bool
void yyerror(char *);
//int yylex (YYSTYPE* lvalp);
int yylex(void);
bool parseExpression(const std::string& inp);
%}
%token INTEGER
%left '&' '|'
%%
program:
program statement '\n'
| /* NULL */
;
statement:
expression { printf("%d\n", $1); return $1; }
;
expression:
INTEGER
| expression '|' expression { $$ = $1 | $3; }
| expression '&' expression { $$ = $1 & $3; }
| '(' expression ')' { $$ = $2; }
| '!' expression { $$ = !$2; }
;
%%
void yyerror(char *s) {
fprintf(stderr, "%s\n", s);
}
void main(void) {
std::string inp = "0|0\n";
bool nasi = parseExpression(inp);
printf("%s%d\n", "nasi ", nasi);
printf("Press ENTER to close. ");
getchar();
}
내 '.Y'파일은 여기에 있습니다 : 나는 두 파일에 %pure_parser
을 추가 int yylex (YYSTYPE* lvalp);
로는 yylex 선언을 변경하고 yylval
를 교체 한
/* Lexer */
%{
#include "parser.tab.h"
#include <stdlib.h>
#include <string>
#define YYSTYPE bool
void yyerror(char *);
%}
%%
[0-1] {
if (strcmp(yytext, "0")==0)
{
yylval = false;
//*lvalp = false;
}
else
{
yylval = true;
//*lvalp = true;
}
return INTEGER;
}
[&|!()\n] { return *yytext; }
[ \t] ; /* skip whitespace */
. yyerror("Unknown character");
%%
int yywrap(void) {
return 1;
}
bool parseExpression(const std::string& inp)
{
yy_delete_buffer(YY_CURRENT_BUFFER);
/*Copy string into new buffer and Switch buffers*/
yy_scan_string(inp.c_str());
bool nasi = yyparse();
return nasi;
}
*lvalp
,하지만 오류가 발생했습니다 : 'lvalp' is undeclared identifier.
. '재진입 성'과 '순수함'에 대한 사례가 많이 있지만 최고의 가이드 라인을 찾을 수 없습니다.
나를 안내해 줄 수 있습니까?
미리 감사드립니다.
(사용되지 않은) 초기 버퍼를 삭제하려면 'yypop_buffer_state' 할 수 없습니까? ('yy_scan_string'은 삭제하지 않는다고 가정하면됩니다.) – rici