2016-05-17 3 views
0

を減らす: https://courses.engr.illinois.edu/cs421/sp2011/mps/mp2/minijavasyntax.pdfバイソンシフト/ Iは、バイソンの入力ファイルにこの構文を記述しようとしている競合

これは私の入力です:

%start Program 
%token KW_CLASS KW_EXTENDS KW_PUBLIC KW_STATIC KW_BOOLEAN KW_STRING KW_FLOAT KW_INT EOF 
%token KW_IF KW_WHILE KW_BREAK KW_CONTINUE KW_SWITCH KW_CASE KW_DEFAULT KW_RETURN 
%token KW_NEW KW_THIS KW_NULL KW_TRUE KW_FALSE KW_PRINTLN 
%token IDENT INT_LITERAL FLOAT_LITERAL STRING_LITERAL 

%nonassoc "THEN" 
%nonassoc KW_ELSE 

%right "STATEMENTS" 

%right OP_ASSIGN 
%left OP_OR 
%left OP_AND 
%nonassoc CMP_EQ CMP_NEQ 
%nonassoc CMP_GT CMP_LT CMP_GTE CMP_LTE 
%left OP_ADD OP_MINUS 
%left OP_MULT OP_DIV OP_MOD 
%right OP_NOT OP_UNARY "NEW" 
%left "FUNCALL" "SUBSCRIPT" '.' 
%nonassoc '(' 
%nonassoc ')' 
%% 
Program:  ClassDeclp EOF 
      ; 

ClassDeclp:  ClassDecl 
      | ClassDeclp ClassDecl 
      ; 
ClassDecl:  KW_CLASS IDENT ExtendsFrom 
      '{' VarDecls MethodDecls '}' 
      ; 
ExtendsFrom:  /*empty*/ 
       | KW_EXTENDS IDENT 
      ; 

VarDecls:  /*empty*/ 
      | VarDecls VarDecl 
      ; 
VarDecl:  Type IDENT ';' 
      | KW_STATIC Type IDENT ';' /*Co the sua thanh AcessModifier Type IDENT*/ 
      ; 

MethodDecls:  /*empty*/ 
      | MethodDecls MethodDecl 
      ; 
MethodDecl:  KW_PUBLIC Type IDENT 
      '('MethodParams')' 
      '{'VarDecls Statements KW_RETURN Expression ';' '}' 
      ; 

MethodParams:  /*empty*/ 
      | MethodParams ',' MethodParam 
      ;  
MethodParam:  Type IDENT; 

Type :   Type '['']' 
       | KW_BOOLEAN 
      | KW_STRING 
      | KW_FLOAT 
      | KW_INT 
      | IDENT 
      ; 
Statements:  Statements Statement %prec "STATEMENTS" 
      | /*empty*/ %prec "STATEMENT" 
      ; 
Statementp:  Statements Statement %prec "STATEMENTS" 
      ; 
Statement:  '{'Statements'}' 
      | KW_IF '(' Expression ')' Statement %prec "THEN" 
      | KW_IF '(' Expression ')' Statement KW_ELSE Statement 
      | KW_WHILE '(' Expression ')'Statement 
      | KW_PRINTLN '(' Expression ')' ';' 
      | IDENT OP_ASSIGN Expression ';' 
      | KW_BREAK ';' 
      | KW_CONTINUE ';' 
      | IDENT %prec "SUBSCRIPT" '['Expression']' '=' Expression ';' 
      | KW_SWITCH '(' Expression ')' '{' 
       Cases 
       KW_DEFAULT ':' Statementp '}' 
      ; 

Cases:   Cases Case 
      | /*empty*/ 
      ; 
Case:   KW_CASE INT_LITERAL ':' Statementp 
      ; 


Expression:  Expression OP_OR Expression 
      | Expression OP_AND Expression 
      | Expression CMP_EQ Expression 
      | Expression CMP_NEQ Expression 
      | Expression CMP_GT Expression 
      | Expression CMP_GTE Expression 
      | Expression CMP_LT Expression 
      | Expression CMP_LTE Expression 
      | Expression OP_ADD Expression 
      | Expression OP_MINUS Expression 
      | Expression OP_MULT Expression 
      | Expression OP_DIV Expression 
      | Expression OP_MOD Expression 
      | '-' Expression %prec OP_UNARY 
      | OP_NOT Expression 
      | Expression %prec "SUBSCRIPT" '['Expression']' 
      | Expression '.'"length" 
      | Expression '.' IDENT %prec "FUNCALL" '(' ParamList ')' 
      | INT_LITERAL 
      | FLOAT_LITERAL 
      | STRING_LITERAL 
      | KW_NULL 
      | KW_TRUE 
      | KW_FALSE 
      | IDENT 
      | KW_THIS 
      | KW_NEW Type '[' Expression ']' %prec "NEW" 
      | KW_NEW IDENT '('')'  %prec "NEW" 
      | '(' Expression ')' 
      ; 


ParamList:  /*empty*/ 
      | ParamList ',' Expression 
      | Expression 
      ; 
%% 
main(int argc, char** argv[]) 
{ 
    extern FILE *yyin; 
    ++argv; --argc; 
    yyin = fopen(argv[0], "r"); 
    yydebug = 1; 
    errors = 0; 
    yyparse(); 
} 

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

/* Co 3 conflict RR can xu ly khi bien thuoc kieu bool 
    giua BoolExpr va Expresstion */ 

とき、コンパイル、私は2回の16回の衝突を得ました。紛争の 一つは、私が--report =先読みでバイソンを走った:私は期待したもの

OP_NOT Expression . [OP_OR, OP_AND, CMP_EQ, CMP_NEQ, CMP_GT, CMP_LT, CMP_GTE, CMP_LTE, OP_ADD, OP_MINUS, OP_MULT, OP_DIV, OP_MOD, ')', ';', ',', '[', ']']

は、「[」ではありませんOP_NOT先読みトークンで、添字の優先順位が高い演算子よりもなければならないからです!。 他の競合はこのようなものです。どうすればそれを解決できますか? Tks

答えて

1

これは優先順位の仕組みではありません。

EDIT:あなたは以下の記述が混乱を見つけるか、あなたはそんなに英語のテキストを苦労したくない場合は、あなたが私のいつもの助言を取ることができるが優先を使用しないでください。ほとんどの場合、優先宣言を必要としない明確な文法を書くことができます。それを行うなら、優先順位を理解する必要はありません。 /EDIT

優先順位は常にそのrightt手側の現在の最上部に一致する可能化(すなわち生産を比較する(あなたはLRの作品を解析する。どのように理解していればけれどもが、正直、それはその複雑ではありません)パーサースタック)と先読みシンボル。時点

Expression : Expression · '[' Expression ']' 

点が右側の端部にあるときに減少のみ起こることができるので、唯一の可能なパーサーアクションは、シフトです。

しかし、その点が発生した状態のいずれかに、別の生産がある:点が端部にあるので

Expression : OP_NOT Expression · 

この1 、低減することができます。

これらのポイントは同じ状態なので、両方とも有効である必要があります。つまり、私たちは次のように見ています:

OP_NOT Expression · '[' Expression ']' 

そして、私たちは何をすべきか考えています。私たちは、私たちが持っていると思われる時点でExpressionからOP_NOT Expressionを、減らすことができます:

Expression · '[' Expression ']' 

それとも私たちはこれらの両方が可能なのであり、

OP_NOT Expression '[' · Expression ']' 

で私たちを残してシフト「[」ができましたシフト/リダクションの競合です。 Yacc/Bisonは、優先ルール(存在する場合)を使用してその競合を解決しようとします。

Expression : OP_NOT Expression 

とシフトすることがありますシンボル'['特に、それが低減される可能性があります生産の優先度を比較する必要があります。

ただし、優先順位宣言を徹底的に見れば、'['に優先順位が割り当てられていないことがわかります。何%prec宣言が存在しないので、だから、yaccの/バイソンは、その優先順位の右側の最後の端末で定義される生産(、OP_NOTに対してそれをテストすることはできません。

を使用すると、後置添字演算子([式」をしたい場合] ')接頭演算子OP_NOTよりも高い優先順位を持っている、あなたはOP_NOTより高い[の優先順位を宣言しなければなりません。

ところで、私はここで矛盾のポイントが表示されていない。あなたは持っている可能性がありOP_NOTの場合は!OP_MINUSの場合は-など)を使用します。これは読みやすく、少ない作業。

あなたは

Expression %prec "SUBSCRIPT" '['Expression']' 

%prec宣言が適切であることを考えているようです。そうではない。パーサーが可能な場合は、Expression '[' Expression ']'を減らすことができます。しかし、それは無意味です。なぜなら、あなたはその生産の優先権を保持するために偽の端末を作る必要がないからです。その優先順位は右端の最後の端末である']'によって定義されているので、その端末の優先順位を宣言することができます。

'-'Expresson OP_MINUS Expressionとは異なる優先順位を持つため、2つの異なる優先順位を持つか、またはより正確には、Expression : OP_MINUS Expression %prec OP_UNARYという宣言の偽トークンが必要です。しかし、実際には偽のトークンを作成する必要はありませんでした。たとえば、OP_NOTOP_NEWのような正しい優先順位のトークンを使用できます。

言葉が十分でなかった場合、私はこれをいくつかの異なるSO答えで説明しようとしました。 Here's oneおよびhere's another oneおよびhere's another oneである。また、here's one by Chris Doddthe bison manualのドキュメントもあります。あなたが運が良ければ、自分の言語で説明を見つけることができます。インターネット検索エンジンがあれば、あなたのために最適です。もしあれば、教授と話してください。

ところで、先読みレポートは、どのシンボルが特定の制作に続くかを示します。優先度はこれに影響しません。 [は間違いなく!aに従うことができます。優先順位はパーサーに減らすかシフトするかを指示しますが、削減またはシフトをトリガーするトークンは間違いなく先読みセットにあります。

+0

ありがとうございます。 :) –

+0

@rici素晴らしい答え。 –

関連する問題