0

重複の可能性:フレックスレクサーへ
のC /C++パーサー/アナライザー文字列入力を作成するための優れたツール

私の考えは、ブール値の式を計算できるパーサーを作成することです。次のステップは、それをc ++プログラムで使用することですが、使用方法がわかりません。

現在、この計算機はコマンドラインで実行でき、コードは適切ではなく、プログラムでの使用方法がわかりません。lex_yacc(var)この計算機を呼び出す関数を使用したいのですが、これvarは入力です。たとえば、メインプログラムはvaris(T+F)を読み取ったので、に送信されlex_yacc(var)、最後にfuncが戻ります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.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;
}
4

0 に答える 0