2012-07-29 11 views

risposta

9

Questo sembra funzionare:

%syntax_error { 
     int n = sizeof(yyTokenName)/sizeof(yyTokenName[0]); 
     for (int i = 0; i < n; ++i) { 
       int a = yy_find_shift_action(yypParser, (YYCODETYPE)i); 
       if (a < YYNSTATE + YYNRULE) { 
         printf("possible token: %s\n", yyTokenName[i]); 
       } 
     } 
} 

tenta tutte le possibili gettoni e stampa quelli che sono in vigore nello Stato parser corrente.

Nota che quando arriva un token non corretto, il parser non chiama immediatamente syntax_error, ma prova a ridurre quello che è in stack sperando che il token possa essere spostato in seguito. Solo quando nient'altro può essere ridotto e il token corrente non può essere spostato, il parser chiama syntax_error. Le riduzioni cambieranno lo stato del parser, il che significa che potresti vedere meno token di quelli che sarebbero stati applicabili prima delle riduzioni. Dovrebbe essere sufficiente per la segnalazione degli errori.

+2

Esattamente quello che stavo chiedendo! Tuttavia, hai dimenticato un 'yypParser' come primo parametro di yy_find_shift_action :) –

1

Non esiste un metodo diretto per generare tale elenco in Lemon. Ma puoi provare a farlo usando l'output di debug dello strumento Lemon e la traccia di debug del parser generato. Dopo la chiamata alla funzione ParseTrace, il parser generato stampa l'elenco di Shifts e Riduci si applica al flusso di input. L'ultimo Shift prima dell'errore di sintassi contiene il numero dello stato corrente prima dell'errore. Trova questo stato nel file * .out per il parser e vedi l'elenco dei token previsti per esso.

Problemi correlati