Parsing 如何在bison中编写LTL公式的非歧义语法

Parsing 如何在bison中编写LTL公式的非歧义语法,parsing,grammar,bison,context-free-grammar,Parsing,Grammar,Bison,Context Free Grammar,我正在为LTL公式编写CFG语法,其中原子命题直接由逻辑公式表示。然而,当我尝试为-logic和LTL公式实现括号时,我的语法中出现了一些错误(逻辑公式的括号应该具有更高的优先级)。这是我的语法;当我在ltl nonterminal中取消对括号规则的注释时,我得到了shift/reduce冲突。如何解决 %left TPLUS TMINUS %left TMUL TDIV %left TAND TOR TIMP %left TRSHIFT TLSHIFT %left TEQUAL TCNE TC

我正在为LTL公式编写CFG语法,其中原子命题直接由逻辑公式表示。然而,当我尝试为-logic和LTL公式实现括号时,我的语法中出现了一些错误(逻辑公式的括号应该具有更高的优先级)。这是我的语法;当我在ltl nonterminal中取消对括号规则的注释时,我得到了shift/reduce冲突。如何解决

%left TPLUS TMINUS
%left TMUL TDIV
%left TAND TOR TIMP
%left TRSHIFT TLSHIFT
%left TEQUAL TCNE TCGE TCGT TCLE TCLT
%left TUNTIL TWEAK TFUT TGLOB TREL TNEG

%start ltlformula

%%

ltlformula
  : ltl   {}

formula
  : lexpr  {}
  ;

lterm
  : TLPAREN lexpr TRPAREN         {}
  | arexpr binary_la_oper arexpr  {}
  ;

lnterm
  : lterm      {}
  | TNEG lnterm {}
  ;

lexpr
  : lterm                         {}
  | lexpr binary_ll_oper lnterm    {}
  ;

ltl
  : formula               {}
  | TFUT ltl              {}
  | TGLOB ltl             {}
  | ltl TUNTIL ltl        {}
  | ltl TREL ltl          {}
  | ltl TWEAK ltl         {}
  | TNEG ltl              {}
//  | TLPAREN ltl TRPAREN   { } - here comes the trouble...
  ;

我没有使用Bison,所以我的答案是基于我对语法分析的一般知识

移位/减少冲突与
ltl
生产可以通过两种可能的方式匹配
TLPAREN
有关。第一个是您试图添加的规则。另一个是当解析器遵循这些非终端时:
formula->lexpr->lterm

这与解析器的先行属性有关。下面的链接是关于前瞻和处理移位/减少冲突的Bison文档


我没有使用Bison,所以我的答案是基于我对语法分析的一般知识

移位/减少冲突与
ltl
生产可以通过两种可能的方式匹配
TLPAREN
有关。第一个是您试图添加的规则。另一个是当解析器遵循这些非终端时:
formula->lexpr->lterm

这与解析器的先行属性有关。下面的链接是关于前瞻和处理移位/减少冲突的Bison文档


我没有使用Bison,所以我的答案是基于我对语法分析的一般知识

移位/减少冲突与
ltl
生产可以通过两种可能的方式匹配
TLPAREN
有关。第一个是您试图添加的规则。另一个是当解析器遵循这些非终端时:
formula->lexpr->lterm

这与解析器的先行属性有关。下面的链接是关于前瞻和处理移位/减少冲突的Bison文档


我没有使用Bison,所以我的答案是基于我对语法分析的一般知识

移位/减少冲突与
ltl
生产可以通过两种可能的方式匹配
TLPAREN
有关。第一个是您试图添加的规则。另一个是当解析器遵循这些非终端时:
formula->lexpr->lterm

这与解析器的先行属性有关。下面的链接是关于前瞻和处理移位/减少冲突的Bison文档


基本问题是
ltl
可以通过两种方式匹配括号中的
lexpr

            ltl                          ltl
          /  |  \                         |
   TLPAREN  ltl  TRPAREN               formula
             |                            |
          formula                       lexpr
             |                            |
           lexpr                        lterm
                                      /   |   \
                               TLPAREN  lexpr  TRPAREN
如果要解决此问题,以便无法进行第二次解析,则需要取消语法因子,以便
ltl
无法展开为展开为括号表达式的
lterm
。这涉及沿该路径拆分(复制)所有规则:

ltl: formula_no_paren
   |  ..other ltl rules

formula_no_paren: lexpr_no_paren ;

lexpr_no_paren
    : lterm_no_paren
    |  ... all other lterm rules

lterm_no_paren:  ... all lterm rules that don't start with TLPAREN
然后,您可以重构其他规则以使用这些无准备规则来避免重复所有操作:

lterm_paren : TLPAREN lexpr TRPAREN ;
lterm : lterm_paren | lterm_no_paren ;

lexpr_paren : lterm_paren ;
lexpr : lexpr_paren | lexpr_no_paren ;
您可以先去掉无用的
公式
规则,使这一点变得更简单

或者,您可以(ab)通过为
公式:lexpr
规则提供高于
TRPAREN
优先级的显式优先级(使用
%prec
),来使用bison的优先级解析规则



如果您希望使用第二种解析,则无需执行任何操作,因为默认的prefershift-over-reduce冲突解决方法就是这样做的。您可以通过给
公式:lexpr
规则一个显式优先级,该优先级低于
TPAREN

的优先级来关闭警告消息。基本问题是
ltl
可以通过两种方式匹配括号内的
lexpr

            ltl                          ltl
          /  |  \                         |
   TLPAREN  ltl  TRPAREN               formula
             |                            |
          formula                       lexpr
             |                            |
           lexpr                        lterm
                                      /   |   \
                               TLPAREN  lexpr  TRPAREN
如果要解决此问题,以便无法进行第二次解析,则需要取消语法因子,以便
ltl
无法展开为展开为括号表达式的
lterm
。这涉及沿该路径拆分(复制)所有规则:

ltl: formula_no_paren
   |  ..other ltl rules

formula_no_paren: lexpr_no_paren ;

lexpr_no_paren
    : lterm_no_paren
    |  ... all other lterm rules

lterm_no_paren:  ... all lterm rules that don't start with TLPAREN
然后,您可以重构其他规则以使用这些无准备规则来避免重复所有操作:

lterm_paren : TLPAREN lexpr TRPAREN ;
lterm : lterm_paren | lterm_no_paren ;

lexpr_paren : lterm_paren ;
lexpr : lexpr_paren | lexpr_no_paren ;
您可以先去掉无用的
公式
规则,使这一点变得更简单

或者,您可以(ab)通过为
公式:lexpr
规则提供高于
TRPAREN
优先级的显式优先级(使用
%prec
),来使用bison的优先级解析规则



如果您希望使用第二种解析,则无需执行任何操作,因为默认的prefershift-over-reduce冲突解决方法就是这样做的。您可以通过给
公式:lexpr
规则一个显式优先级,该优先级低于
TPAREN

的优先级来关闭警告消息。基本问题是
ltl
可以通过两种方式匹配括号内的
lexpr

            ltl                          ltl
          /  |  \                         |
   TLPAREN  ltl  TRPAREN               formula
             |                            |
          formula                       lexpr
             |                            |
           lexpr                        lterm
                                      /   |   \
                               TLPAREN  lexpr  TRPAREN
如果要解决此问题,以便无法进行第二次解析,则需要取消语法因子,以便
ltl
无法展开为展开为括号表达式的
lterm
。这涉及沿该路径拆分(复制)所有规则:

ltl: formula_no_paren
   |  ..other ltl rules

formula_no_paren: lexpr_no_paren ;

lexpr_no_paren
    : lterm_no_paren
    |  ... all other lterm rules

lterm_no_paren:  ... all lterm rules that don't start with TLPAREN
然后,您可以重构其他规则以使用这些无准备规则来避免重复所有操作:

lterm_paren : TLPAREN lexpr TRPAREN ;
lterm : lterm_paren | lterm_no_paren ;

lexpr_paren : lterm_paren ;
lexpr : lexpr_paren | lexpr_no_paren ;
您可以先去掉无用的
公式
规则,使这一点变得更简单

或者,您可以(ab)通过为
公式:lexpr
规则提供高于
TRPAREN
优先级的显式优先级(使用
%prec
),来使用bison的优先级解析规则


如果您希望使用第二个解析,则无需执行任何操作,因为这是默认的p