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