2011-06-04 45 views
5

我希望能夠使用flex /分隔符來分析非空,一個或多個元素,逗號分隔的列表(並且可以用括號括起來)野牛解析規則。如何設置解析逗號分隔參數列表的flex/bison規則

一些例如可解析的列表:

  • 1,2-
  • (1,2)
  • (3)
  • 3,4,5-
  • (3,4,5,6- )

我使用下面的規則解析該列表(最終結果是解析元素'頂級列表'),但它們在解析時似乎沒有給出想要的結果(當提供有效列表時,我得到了語法錯誤)。任何關於我如何設置的建議?

cList : ELEMENT 
      { 
       ... 
      } 
     | cList COMMA ELEMENT 
      { 
       ... 
      } 
     ; 

topLevelList : LPAREN cList RPAREN 
       { 
        ...     
       } 
       | cList 
       { 
        ... 
       } 
      ; 

回答

2

聽起來很簡單。告訴我,如果我錯過了什麼,或者我的例子不工作

RvalCommaList: 
      RvalCommaListLoop 
    | '(' RvalCommaListLoop ')' 

RvalCommaListLoop: 
     Rval 
    | RvalCommaListLoop ',' Rval 

Rval: INT_LITERAL | WHATEVER 

但是如果你接受rvals以及這個名單你就會有衝突混淆了一個單一的項目清單定期RVAL。在這種情況下,你可以使用下面這要麼需要「(」「)」周圍或需要2項之前,它是一個列表

RvalCommaList2: 
     Rval ',' RvalCommaListLoop 
    | '(' RvalCommaListLoop ')' 
0

我也想知道如何做到這一點,想着它簡單地說,實現這一目標是使用以下形式的鏈接列表的一種方式,

struct list; 
struct list { 
    void *item; 
    struct list *next; 
}; 

struct list *make_list(void *item, struct list *next); 

和使用規則:

{ $$ = make_list($1, $2); } 

該解決方案在設計上非常相似: Using bison to parse list of elements

困難的一點是弄清楚如何處理一個(我推測)二進制AST方案中的列表。

-1
%start input 
%% 
input: 
%empty 
| integer_list 
; 

integer_list 
: integer_loop 
| '(' integer_loop ')' 
; 

integer_loop 
: INTEGER 
| integer_loop COMMA INTEGER 
; 
%% 
+0

爲什麼要讓換行符成爲一個標記? – EJP 2017-07-31 03:23:18