2011-06-04 9 views
5

Me gustaría poder analizar una lista no vacía, de uno o varios elementos, delimitada por comas (y opcionalmente entre paréntesis) utilizando flex/reglas de Bison Parse.cómo configurar reglas de flex/bison para analizar una lista de argumentos delimitada por comas

algunos p. Ej. de listas analizable:

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

etc.

estoy usando las siguientes reglas para analizar la lista (el resultado final es el elemento de análisis 'lista de nivel superior'), pero no parecen dar el resultado deseado al analizar (obtengo un error de sintaxis cuando proporciono una lista válida). ¿Alguna sugerencia sobre cómo puedo configurar esto?

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

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

Respuesta

2

Esto suena simple. Dime si me he perdido algo o si mi ejemplo no funciona

RvalCommaList: 
      RvalCommaListLoop 
    | '(' RvalCommaListLoop ')' 

RvalCommaListLoop: 
     Rval 
    | RvalCommaListLoop ',' Rval 

Rval: INT_LITERAL | WHATEVER 

Sin embargo si acepta rvals así como esta lista tendrá un conflicto confundir un rval regular con una sola lista de elementos. En este caso, puede utilizar el siguiente que se requerirá al '(' ')' alrededor de ellos o requieren 2 artículos antes de que sea una lista

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

yo también quiero saber cómo hacer esto, pensando en ella en pocas palabras, una manera de lograr esto sería el uso de una lista enlazada de forma,

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

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

y el uso de la regla:

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

esta solución es muy similar en diseño a: Using bison to parse list of elements

Lo difícil es descubrir cómo manejar las listas en el esquema de una AST binaria (supongo).

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

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

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

¿Por qué harías que newline token? – EJP

Cuestiones relacionadas