更改解析语言

Change the parsing language

我正在使用模态 SAT 求解器。不幸的是,这个求解器使用的是 Flex 和 Bison,这两种语言我都不掌握...

我想将一种语法更改为另一种语法,但我遇到了一些问题,即使在学习了有关 Flex-Lexer 和 Bison 的教程之后也是如此。

问题来了:

我希望能够解析这样的模态逻辑公式:

在以前的符号中,这样的公式是这样写的:

(NOT (IMP (AND (ALL R0 (IMP C0 C1)) (ALL R0 C0)) (ALL R0 C1)))

下面是用于解析它们的 Flex/Bisons 文件:

alc.y

%{

#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 = ;}       
;

formula: boolean_expression {$$ = ;}
| rule_expression {$$ = ;}
| atomic_expression {$$ = ;}
;

boolean_expression: LP uboolop formula RP 
{$$ = Make_formula_nary(,empty_code,);}

| LP bboolop formula formula RP 
{$$ = Make_formula_nary(,empty_code, Make_operand_nary(,));}

| LP nboolop formula other RP 
{$$ = Make_formula_nary(,empty_code,Make_operand_nary(,));}
;

rule_expression: LP ruleop rule formula RP {$$ = Make_formula_nary(,,);}
;

atomic_expression: CONC NUM {$$ = Make_formula_nary(atom_code,,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(,);}
| {$$ = 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 {$$ = ;}
;

%% /* End of grammar rules */

int yyerror(char *s)  
{
  printf("%s\n", s);
  exit(0);
}

alc.lex

%{
#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

阻碍我正确解析这个新语法的主要问题是:

这是新符号的小列表,即使我不知道如何解析它们:

"("      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;

我假设只有这 2 个文件会改变,因为它应该仍然能够通过使用其他 .y 和 .lex 编译源代码来读取以前的语法

但我想请你帮忙知道具体如何写下来:/

提前致谢!

Tommi Junttila 的 BC Package 使用 BisonFlexBoolean 表达式和电路实现了一种语言。

学习源文件并不能完全取代学习正确的 Bison/Flex 教程,但它肯定会给您一个良好的开端。

对于遇到完全相同问题的人(我认为这个问题很少见:))

有了好的词汇,google问题和找到解决方案就容易多了。

第一个符号

(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格式。

还有一个与 Spartacus (http://www.ps.uni-saarland.de/spartacus/) 一起开发并捆绑的工具,称为公式翻译工具 ("ftt")。它可以在证明者的所有格式之间进行翻译。

使用此工具是避免与 Flex/Bison 语言打交道的小窍门。

只需要将一个问题转化为另一个问题,问题是等价的,转化速度非常快。