2011-06-04 16 views
5

Boş olmayan, bir veya birçok öğe, virgül kullanarak virgülle ayrılmış (ve isteğe bağlı olarak parantezli) bir listeyi ayrıştırmak istiyorum bizon ayrıştırma kuralları. Bazı örn. ayrıştırılabilir listelerinin:virgülle ayrılmış bir bağımsız değişken listesi ayrıştırmak için flex/bison kurallarının nasıl ayarlanacağı

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

vb

ben ayrıştırmak için aşağıdaki kuralları kullanıyorum

liste (son sonuç ayrıştırma elemanı 'üst düzey listesi'), ancak ayrıştırma sırasında istenen sonucu vermezler (geçerli bir liste verirken bir sözdizimi hatası alıyorum). Bunu nasıl kurabileceğime dair bir önerin var mı?

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

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

cevap

2

Bu kulağa basit geliyor. Eğer rvals yanı sıra tek bir öğe listesi ile düzenli RVal kafa karıştırıcı bir çatışma olacak bu listeyi kabul edersek benim örnek Ancak

RvalCommaList: 
      RvalCommaListLoop 
    | '(' RvalCommaListLoop ')' 

RvalCommaListLoop: 
     Rval 
    | RvalCommaListLoop ',' Rval 

Rval: INT_LITERAL | WHATEVER 

işe doesnt eğer ben bir şey cevapsız varsa söyle ya. Bu durumda hangi altında gerektirecektir kullanabilirsiniz '(' ')' çevrelerindeki ya da bir liste

RvalCommaList2: 
     Rval ',' RvalCommaListLoop 
    | '(' RvalCommaListLoop ')' 
0
Ben de bunu nasıl bilmek istiyorum

düşünmeye, önce 2 öğe gerektirir kısaca, bu formun bağlantılı liste kullanmak olacaktır ulaşmanın yollarından biri,

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

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

ve kuralı kullanarak: 0123:

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

Bu çözüm için tasarımda çok benzer Sabit bit, bir (I preume) ikili AST şemasındaki listelerin nasıl işleneceğini bulmaktır.

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

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

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

Neden bir simge belirtin? – EJP