0

minipythonのバージョン(接尾辞/接頭辞の増分および減算演算子付き)のsableccの仕様ファイルを作成しようとしていますが、当然のことながらいくつかのプロダクションでは識別子を使用する必要があります構文解析中にこれらの競合が発生する:識別子付きプロダクションのSableccシフト/縮小競合

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に従うことから始めました。

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ある:ここ は文法ファイルです。 私は実験的にprefix/postfixとprepost_operandを削除して、衝突が少なくとも少し変わるかどうかを確認しましたが、最後の2つの衝突が残っています。 文法をあまり変えずにこれらの競合を解決する方法はありますか、まったく間違ったパスを辿ったのですか?

print expression more_expressions 

more_expressionsは、式のリストと一致した(ので、おそらくそれほど混乱するexpression_listと呼ばれるべきである):

答えて

1

問題は、その右側で生産されています。 2つの連続したexpressionは明らかにあいまいです(2つの式を使用できる場合、1+1+11+1、その後は+1または1、その後は+1+1)。あなたが欲しいのはちょうど

print more_expressions 
+0

ありがとうございます!私はそれがそんなにばかげた間違いだったとは信じられません... – user113377

+0

@ user113377これは命名が重要な理由です:-) – rici

関連する問題