簡體   English   中英

如何在沒有S / R沖突的情況下用0或1+令牌編寫Bison規則?

[英]How can I write Bison rule with 0 or 1+ tokens without S/R conflicts?

如果我像正常對象訪問一樣定義了令牌:

[$_a-zA-Z]+[.] { return ACCESS; }
[$_a-zA-Z]+    { return ID; }
[+]            { return PLUIS;  }

而Bison語法規則:

Accesses
    : Accesses ACCESS    { /*do something...*/ }
    | ACCESS             { /*do something...*/ }

Expression    
    : Accesses ID PLUS Accesses ID    { /*do something...*/ }

我想在源代碼中允許這樣的內容:

moduleA.valueB.valueC + valueD

在示例中,如果我沒有在Accesses放置空規則,則像valueD這樣的單個ID變量是非法的。 但是如果我把空規則放進去, Accesses就會引起嚴重的S / R沖突,而匹配的文本會變得很奇怪。

並且,我不認為復制Expression的規則是一個好主意,例如:

Expression    
    : Accesses ID PLUS Accesses ID   { /*do something...*/ }
    | ID PLUS Accesses ID            { /*do something...*/ }
    | Accesses ID PLUS ID            { /*do something...*/ }
    | ID PLUS ID                     { /*do something...*/ }

我能找到解決這個問題的其他方法嗎?

編輯 :好的,謝謝你的回答注意到我這個簡單的語法沒有沖突。 至少你讓我知道真正的問題可能隱藏在其他地方(對於編譯新手來說真是太糟糕了!)。

你可以這樣做:lex:

[$_a-zA-Z]+ {return WORD;}
"."         {return DOT;}
"+"         {return PLUS;}

野牛:

Expression   : Value PLUS Value;
Value        : WORD|WORD AccessList;
AccessElement: DOT WORD;
AccessList   : AccessElement|AccessList AccessElement;

在您的示例中使用epsilon生成沒有任何問題:

Expression    
    : Accesses ID PLUS Accesses ID    { /*do something...*/ }
;

Accesses
    : Accesses ACCESS    { /*do something...*/ }
    |                    { /*do something...*/ }
;

沒有沖突....

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM