今个又要捣鼓可恶的lex和yacc,当年编译原理被虐成翔,毕业之后,满以为可以和词法语法说“债贱~债也不贱”~
结果读研又用到它门了。。。先去实验室了,等下再补上~
好吧,总算搞好了部分词法语法功能了,来说道说道咱对lex和yacc的认识~
貌似这两个单开也可以用的样子,不过我的目的是检查命题公式:a&b->c. b|d->b&c. (a&b)|~d. ~d->a.这些。
检查同时导入内存,就是存入自己建的结构体了。
lex是词法处理,明显的~
因为在C++里运行,所以第一部分要加
extern "C" {
int yywrap(void);
int yylex(void);
}
然后第二部分,称为规则部分,形如下面:
"->" {return S_IMPL; }
"~" {return S_NEG; }
"(" {return LPAREN; }
")" {return RPAREN; }
"&" {return S_CONJ; }
最后一部分用户例子,咱不用了~
另外注意的是
FILE *yyin是默认输入,把要读文件赋值给它就好~
FILE *yyout是输出~
yacc语法处理,目前实现了&,|,~,因为->和()有优先级,暂时没实现,实现了再说~
具体的&,|,~实现貌似挺容易~
我这主要之前的结构体不太好用,所以一直悲剧,后来改了结构体,就容易多了~
yyparse()这个函数功能是执行~直接读yyin,或者命令行里自己输入~
差不多就这些了。。乱七八糟。。毫无逻辑。。。等有空修改吧。。
再接着写点,关于优先级,在yacc里定义左结合的时候如下
%left S_IMPL
%left S_DISJ
%left S_CONJ
越往后优先级越高~所以会先识别后面的~
这样很是方便~
另外yyin能读取,但是yyout不能输出到文件,只能输出到stdout标准输出。。。随它去吧。。。这个也没什么需求/。/