C++ 在c++;

C++ 在c++;,c++,bison,yacc,lex,flex-lexer,C++,Bison,Yacc,Lex,Flex Lexer,可能重复: 我的想法是创建一个解析器,可以计算布尔表达式,我的下一步是在C++程序中使用它,但是我不知道如何使用它。p> 目前,这个计算器可以在命令行中运行,代码不好,我不知道如何在我的程序中使用它。我想使用一个函数lex_-yacc(var)来调用这个计算器,var是输入,例如,读取var的主程序是(T+F),因此它将被发送到lex_-yacc(var),最后,该函数返回1 我对lexya.l的定义如下: %{ #include <stdlib.h> void yyerro

可能重复:

我的想法是创建一个解析器,可以计算布尔表达式,我的下一步是在C++程序中使用它,但是我不知道如何使用它。p> 目前,这个计算器可以在命令行中运行,代码不好,我不知道如何在我的程序中使用它。我想使用一个函数

lex_-yacc(var)
来调用这个计算器,
var
是输入,例如,读取
var
的主程序是
(T+F)
,因此它将被发送到
lex_-yacc(var)
,最后,该函数返回
1

我对lexya.l的定义如下:

%{

#include <stdlib.h>

void yyerror(char *);

#include "lexya_a1.tab.h"
%}

%%

"T"       { yylval = 1; return boolean; }
"F"       { yylval = 0; return boolean; }
"!F"      { yylval = 1; return boolean; }
"!T"      { yylval = 0; return boolean; }

[+*\n]     return *yytext;
"("        return *yytext;
 ")"       return *yytext;
[\t]       ;/* .... */

.            yyerror("....");

%%

int yywrap(void) {
     return 1;
}
%{
#包括
无效错误(字符*);
#包括“lexya_a1.表h”
%}
%%
“T”{yylval=1;返回布尔值;}
“F”{yylval=0;返回布尔值;}
“!F”{yylval=1;返回布尔值;}
“!T”{yylval=0;返回布尔值;}
[+*\n]返回*yytext;
“(“返回*文本;
“”“返回*文本;
[\t];/**/
.            错误(“..”);
%%
int-yywrap(无效){
返回1;
}
和雷克萨斯大学a1.y:

%{
#include <stdlib.h>

int yylex(void);

void yyerror(char *);

%}

%token boolean

%left '+' '-'

%left '*'

%left '(' ')'

%%

program:
    program expr '\n' { printf("%d\n", $2); }
  |
  ;

expr:
    boolean { $$ = $1; }
  | expr '*' expr { $$ = $1 * $3; }
  | expr '+' expr { $$ = $1 + $3; }
  | '(' expr ')' { $$ = $2; }
  ;

%%

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

int main(void) {
    yyparse();
    return 0;
}
%{
#包括
int yylex(无效);
无效错误(字符*);
%}
%标记布尔
%左'+''-'
%左'*'
%左'('')
%%
节目:
程序expr'\n'{printf(“%d\n”,$2);}
|
;
表达式:
布尔值{$$=$1;}
|expr'*'expr{$$=$1*$3;}
|expr'+'expr{$$=$1+$3;}
|“('expr')”{$$=$2;}
;
%%
无效错误(字符*s){
printf(“%s\n”,s);
}
内部主(空){
yyparse();
返回0;
}

我很好奇,为什么
yylval=atoi(“0”)而不是仅
yylval=0?看起来效率有点低…哦,对不起,我会修改它,事实上,今天是我第一次写lex Yaccse,了解如何让lexer从字符串而不是文件中读取。