首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sablecc shift/减少带有标识符的产品上的冲突

Sablecc shift/减少带有标识符的产品上的冲突
EN

Stack Overflow用户
提问于 2016-11-18 12:56:18
回答 1查看 302关注 0票数 0

我试图为小型parsing的一个版本(带有后缀/前缀增量和递减操作符)为sablecc编写一个规范文件,一些产品自然需要使用标识符,但在解析过程中会遇到以下冲突:

代码语言:javascript
复制
shift/reduce conflict in state [stack: TPrint TIdentifier *] on TPlusPlus in {
    [ PMultiplication = TIdentifier * ] followed by TPlusPlus (reduce),
    [ PPostfix = TIdentifier * TPlusPlus ] (shift)
}

shift/reduce conflict in state [stack: TPrint TIdentifier *] on TMinusMinus in {
    [ PMultiplication = TIdentifier * ] followed by TMinusMinus (reduce),
    [ PPostfix = TIdentifier * TMinusMinus ] (shift)
}

shift/reduce conflict in state [stack: TPrint TIdentifier *] on TLPar in {
    [ PFunctionCall = TIdentifier * TLPar PArglist TRPar ] (shift),
    [ PFunctionCall = TIdentifier * TLPar TRPar ] (shift),
    [ PMultiplication = TIdentifier * ] followed by TLPar (reduce)
}

shift/reduce conflict in state [stack: TPrint TIdentifier *] on TLBr in {
    [ PExpression = TIdentifier * TLBr PExpression TRBr ] (shift),
    [ PMultiplication = TIdentifier * ] followed by TLBr (reduce),
    [ PPostfix = TIdentifier * TLBr PExpression TRBr TMinusMinus ] (shift),
    [ PPostfix = TIdentifier * TLBr PExpression TRBr TPlusPlus ] (shift)
}
java.lang.RuntimeException:

首先,我遵循了给定的bnf语言,并得到了这一点。下面是语法文件:

代码语言:javascript
复制
Productions
goal = {prgrm}program* ;

program = {func}function | {stmt}statement;

function = {func}def identifier l_par argument? r_par semi statement ;

argument = {arg} identifier assign_value? subsequent_arguments* ;

assign_value = {assign} eq value ;

subsequent_arguments = {more_args} comma identifier assign_value? ;

statement = {case1}tab* if comparison semi statement
          | {case2}tab* while comparison semi statement
          | {case3}tab* for [iterator]:identifier in [collection]:identifier semi statement
          | {case4}tab* return expression
          | {case5}tab* print expression more_expressions
          | {simple_equals}tab* identifier eq expression
          | {add_equals}tab* identifier add_eq expression
          | {minus_equals}tab* identifier sub_eq expression
          | {div_equals}tab* identifier div_eq expression
          | {case7}tab* identifier l_br [exp1]:expression r_br eq [exp2]:expression
          | {case8}tab* function_call;

comparison = {less_than} comparison less relation
           | {greater_than} comparison great relation
           | {rel} relation;

relation = {relational_value} relational_value
         | {logic_not_equals} relation logic_neq relational_value
         | {logic_equals} relation logic_equals relational_value;

relational_value = {expression_value} expression_value
      | {true} true
      | {false} false;

expression = {case1} arithmetic_expression
           | {case2} prefix
           | {case4} identifier l_br expression r_br
           | {case9} l_br more_values r_br;

more_expressions = {more_exp} expression subsequent_expressions*;

subsequent_expressions = {more_exp} comma expression;

arithmetic_expression = {plus} arithmetic_expression plus multiplication
         | {minus} arithmetic_expression minus multiplication
         | {multiplication} multiplication ;

multiplication = {expression_value} expression_value
         | {div} multiplication div expression_value
         | {mult} multiplication mult expression_value;

expression_value = {exp} l_par expression r_par
                 | {function_call} function_call
                 | {value} value
                 | {identifier} identifier ;

prefix = {pre_increment} plus_plus prepost_operand
       | {pre_decrement} minus_minus prepost_operand
       | {postfix} postfix;

postfix = {post_increment} prepost_operand plus_plus
        | {post_decrement} prepost_operand minus_minus;  

prepost_operand = {value} identifier l_br expression r_br
                 | {identifier} identifier;

function_call = {args} identifier l_par arglist? r_par;

arglist = {arglist} more_expressions ;

value = {number} number
      | {string} string ;

more_values = {more_values} value subsequent_values* ;

subsequent_values = comma value ;

number = {int} numeral              
       | {float} float_numeral ;

标识符当然是一个令牌,可以在其中找到它的有问题的结果是function_call、prepost_operand、expression_value。我实验中删除了前缀/后缀和prepost_operand,以查看冲突是否会至少改变一点,但这只剩下最后两个冲突。我有没有办法在不改变语法的情况下解决这些冲突,还是我走错了路?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-18 15:47:18

问题是生产的右手边是:

代码语言:javascript
复制
print expression more_expressions

more_expressions匹配一个表达式列表(因此它可能应该被称为expression_list,以减少混淆)。规则中的两个连续的expression显然是不明确的(如果可以有两个表达式,那么1+1+11+1后面是+1还是1后面是+1+1)。你想要的只是

代码语言:javascript
复制
print more_expressions
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40677707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档