2016-03-16 120 views
1

我試圖通過定義一個非關聯優先執行一些解析錯誤。 這是我的語法文件的一部分:野牛nonassociative優先規則

Comparison : 
    Value ComparisonOp Value 
    { 
     $2->Left($1); 
     $2->Right($3); 
     $$ = $2; 
    } 
    ; 

表達式等1 = 2應該解析,但這樣的表達式1 = 2 = 3未在語法允許的。爲了適應這一點,我試圖讓我的運營商非關聯如下:

%nonassoc NONASSOCIATIVE 
. 
.(rest of the grammar) 
. 
Comparison : 
    Value ComparisonOp Value %prec NONASSOCIATIVE 
    { 
     $2->Left($1); 
     $2->Right($3); 
     $$ = $2; 
    } 
    ; 

1 = 2 = 3仍通過,可能有人請告訴我,我做錯了什麼?

回答

3

您需要設置ComparisonOp標記的關聯性。無論是

%nonassoc ComparisonOp NONASSOCIATIVE 

如果ComparisonOp是一個令牌或類似

%nonassoc '=' '<' '>' NOT_EQUAL GREATOR_OR_EQUAL LESS_OR_EQUAL NONASSOCIATIVE 
如果你有多張令牌和 ComparisonOp

東西是一個可擴展到其中的任何


舉一個具體的例子規則,以下作品完全如您所請求:

%{ 
#include <stdio.h> 
#include <ctype.h> 
int yylex(); 
void yyerror(const char *); 
%} 
%nonassoc '=' '<' '>' CMPOP 
%left '+' '-' ADDOP 
%left '*' '/' '%' MULOP 
%token VALUE 
%% 
expr: expr cmp_op expr %prec CMPOP 
    | expr add_op expr %prec ADDOP 
    | expr mul_op expr %prec MULOP 
    | VALUE 
    | '(' expr ')' 
    ; 
cmp_op: '=' | '<' | '>' | '<' '=' | '>' '=' | '<' '>' ; 
add_op: '+' | '-' ; 
mul_op: '*' | '/' | '%' ; 
%% 
int main() { return yyparse(); } 
int yylex() { 
    int ch; 
    while(isspace(ch = getchar())); 
    if (isdigit(ch)) return VALUE; 
    return ch; 
} 
void yyerror(const char *err) { fprintf(stderr, "%s\n", err); } 

因此,如果您有其他問題,請嘗試張貼的MVCE,顯示你有實際的問題...

+0

ComparisonOp是一種規則,即擴展到令牌EQ,NEQ,我嘗試添加這些優先級規則令牌,但顯然優先級不會傳播到父規則 – stopBugs

+0

您需要在規則和令牌上正確設置優先級 - 野牛優先級解決方案通過比較要降低的規則的優先級和令牌的優先級移動。如果您只設置一個或另一個,則不會發生任何事情。 –

+0

我已經完成了這兩項工作,但仍然無效。這裏巧妙的是,在價值規則中我有 – stopBugs