我正在使用模态SAT求解器。不幸的是,这个解算器使用的是Flex和Bison,这两种语言都是我不能掌握的......
我想将一种语法更改为另一种语法,但即使在有关Flex-Lexer和Bison的教程之后,我也遇到了一些问题。
所以这就是问题所在:
我希望能够解析这种模态逻辑公式:
在之前的表示法中,这样的公式是这样写的:
(NOT (IMP (AND (ALL R0 (IMP C0 C1)) (ALL R0 C0)) (ALL R0 C1)))
以下是用于解析它们的Flex / Bisons文件:
%{
#include "fnode.h"
#define YYMAXDEPTH 1000000
fnode_t *formula_as_tree;
%}
%union {
int l;
int i;
fnode_t *f;
}
/* Tokens and types */
%token LP RP
%token ALL SOME
%token AND IMP OR IFF NOT
%token TOP BOT
%token RULE CONC
%token <l> NUM
%type <f> formula
%type <f> boolean_expression rule_expression atomic_expression
%type <f> other
%type <i> uboolop bboolop nboolop ruleop
%type <l> rule
%% /* Grammar rules */
input: formula {formula_as_tree = $1;}
;
formula: boolean_expression {$$ = $1;}
| rule_expression {$$ = $1;}
| atomic_expression {$$ = $1;}
;
boolean_expression: LP uboolop formula RP
{$$ = Make_formula_nary($2,empty_code,$3);}
| LP bboolop formula formula RP
{$$ = Make_formula_nary($2,empty_code, Make_operand_nary($3,$4));}
| LP nboolop formula other RP
{$$ = Make_formula_nary($2,empty_code,Make_operand_nary($3,$4));}
;
rule_expression: LP ruleop rule formula RP {$$ = Make_formula_nary($2,$3,$4);}
;
atomic_expression: CONC NUM {$$ = Make_formula_nary(atom_code,$2,Make_empty());}
| TOP {$$ = Make_formula_nary(top_code,empty_code,Make_empty());}
| BOT {$$ = Make_formula_nary(bot_code,empty_code,Make_empty());}
;
other: formula other {$$ = Make_operand_nary($1,$2);}
| {$$ = Make_empty();}
;
uboolop: NOT {$$ = not_code;}
;
bboolop: IFF {$$ = iff_code;}
| IMP {$$ = imp_code;}
;
nboolop: AND {$$ = and_code;}
| OR {$$ = or_code;}
;
ruleop: SOME {$$ = dia_code;}
| ALL {$$ = box_code;}
rule: RULE NUM {$$ = $2;}
;
%% /* End of grammar rules */
int yyerror(char *s)
{
printf("%s\n", s);
exit(0);
}
%{
#include <stdio.h>
#include "fnode.h"
#include "y.tab.h"
int number;
%}
%%
[ \n\t] ;
"(" return LP;
")" return RP;
"ALL" return ALL;
"SOME" return SOME;
"AND" return AND;
"IMP" return IMP;
"OR" return OR;
"IFF" return IFF;
"NOT" return NOT;
"TOP" return TOP;
"BOTTOM" return BOT;
"R" return RULE;
"C" return CONC;
0|[1-9][0-9]* {
sscanf(yytext,"%d",&number);
yylval.l=number;
return NUM;
}
. {
/* Error function */
fprintf(stderr,"Illegal character\n");
return -1;
}
%%
现在,让我们编写我们的示例,但是在我想要使用的新语法中:
begin
(([r0](~pO | p1) & [r0]p0) | [r0]p1)
end
阻止我正确解析这种新语法的主要问题是:
IMP (A B)
现在写成~B | A
(如布尔逻辑(A => B) <=> (~B v A)
中所示)。ALL RO
现在写为[r0]
。 SOME RO
现在写为<r0>
。IFF (A B)
现在写为(~B | A) & (~A | B)
。 (IFF代表for if and only if
)以下是新符号的小清单,即使我不知道如何解析它们:
"(" return LP;
")" return RP;
"[]" return ALL;
"<>" return SOME;
"&" return AND;
"IMP" return IMP;
"|" return OR;
"IFF" return IFF;
"~" return NOT;
"true" return TOP;
"false" return BOT;
"r" return RULE;
"p" return CONC;
我假设只有这两个文件会改变,因为它应该仍然能够读取以前的语法,通过编译源代码与其他.y和.lex
但我请求你帮忙知道如何写下来:/
提前致谢!
答案 0 :(得分:1)
Tommi Junttila BC Package使用Boolean
和Bison
为Flex
表达式和电路实现了一种语言。
要研究通过正确的Bison
/ Flex
教程完全替换的源文件,但它肯定会给你一个良好的开端。
答案 1 :(得分:0)
对于会遇到完全相同问题的人(我认为这个问题非常罕见:))
凭借良好的词汇量,可以更轻松地解决问题并找到解决方案。
第一种符号
(NOT (IMP (AND (ALL R0 (IMP C0 C1)) (ALL R0 C0)) (ALL R0 C1)))
是 ALC格式。
另一种表示法
begin
(([r0](~pO | p1) & [r0]p0) | [r0]p1)
end
是InToHyLo格式。
还有一个名为公式翻译工具的工具(&#34; ftt&#34;)与Spartacus(http://www.ps.uni-saarland.de/spartacus/)一起开发和捆绑。它可以在所有格式的证明者之间进行转换。
使用此工具是一个小小的黑客,他们避免使用Flex / Bison语言。
只需要将一个问题翻译成另一个问题,问题将是等同的,并且翻译速度非常快。