讓我們定義一個語言:如何編寫解析這種語言的flex和bison文件?
VAR := [0-9A-Za-z_]+
Exp := VAR
| VAR,'=',VAR
| '(', Exp, ')'
| Exp, '&', Exp
| Exp ,'|', Exp
如: 「(A = B)&(C |(d = E))」 是法律
我讀過雲南省社會科學院&萊克斯手冊,但我完全困惑,我只是想要解析這種語言的編譯器
你能告訴我如何編寫這種語言的flex & bison配置文件嗎?
我迄今所做的:
文件人:
%{
#include <string.h>
#include "stdlib.h"
#include "stdio.h"
#include "y.tab.h"
%}
%%
("&"|"and"|"AND") { return AND; }
("|"|"or"|"OR") { return OR; }
("="|"eq"|"EQ") { return EQ; }
([A-Za-z0-9_]+) { return VAR;}
("(") { return LB ;}
(")") { return RB ;}
("\n") { return LN ;}
%%
int main(void)
{
yyparse();
return 0;
}
int yywrap(void)
{
return 0;
}
int yyerror(void)
{
printf("Error\n");
exit(1);
}
文件唉
%{
#include <stdio.h>
%}
%token AND OR EQ VAR LB RB LN
%left AND OR
%left EQ
%%
line :
| exp LN{ printf("LN: %s",$1);}
;
exp: VAR { printf("var:%s",$1);}
| VAR EQ VAR { printf("var=:%s %s %s",$1,$2,$3);}
| exp AND exp { printf("and :%s %s %s",$1,$2,$3);}
| exp OR exp { printf("or :%s %s %s",$1,$2,$3);}
| LB exp RB { printf("abstract :%s %s %s",$1,$2,$3);}
;
現在我編輯過的文件作爲多德引導,似乎要好得多(至少lex工作正常),但我得到這樣的輸出:
disk_path>myprogram
a=b
var=:(null) (null) (null)LN: (null)ab=b
Error
那麼,爲什麼函數printf輸出爲空?並輸入第二個後,它提示錯誤並退出程序?
向我們展示你的嘗試。我會在回覆中給出一些提示,但你真的應該先顯示你嘗試的第一個 –