2009-07-15 12 views
5

Sto utilizzando Flex e Bison per un generatore di parser, ma ho problemi con gli stati di avvio nello scanner.Stati di avvio in Lex/Flex

Sto utilizzando le regole esclusive per affrontare commentare, ma questa grammatica non sembra corrispondere gettoni citati:

%x COMMENT 

//     { BEGIN(COMMENT); } 
<COMMENT>[^\n]  ; 
<COMMENT>\n   { BEGIN(INITIAL); } 

"=="     { return EQUALEQUAL; } 

.      ; 

In questo semplice esempio la linea:

// a == b 

isn' t corrisponde interamente a un commento, a meno che non includa questa regola:

<COMMENT>"=="    ; 

Come faccio a evitare tutto questo? t dover aggiungere tutti questi token alle mie regole esclusive?

risposta

9

coordinati commenti C-stile di Lex/Flex o qualsiasi altra cosa è ben documentata:

in the documentation, così come diverse varianti in tutto l'Internet.

Ecco una variazione su quello che si trova nella documentazione Flex:

<INITIAL>{ 
    "//"    BEGIN(IN_COMMENT); 
    } 
    <IN_COMMENT>{ 
    \n  BEGIN(INITIAL); 
    [^\n]+ // eat comment 
    "/"  // eat the lone/
    } 
+0

Preferisco non dover utilizzare gli stati inclusivi se può essere evitato in quanto ho un sacco di regole. Il problema è che questa regola "eat comment" non sembra corrispondere a token con più di un carattere (come ==). – Dan

+0

Quindi penso che potresti fare qualcosa di sbagliato. Devi creare un "parser secondario" per i commenti, che non corrisponde ai tuoi normali token. –

+0

Dire, si desidera memorizzare la riga di ogni input, quindi questo ti darà numeri di linea errati? –

2

provare ad aggiungere un "+" dopo il [^ n] regola. Non so perché lo stato esclusivo stia ancora raccogliendo '==' anche in uno stato esclusivo, ma apparentemente lo è. Flex corrisponderà normalmente alla regola che corrisponde alla maggior parte del testo e l'aggiunta del "+" renderà almeno le due regole legate in lunghezza. Mettendo per primo la regola COMMENT, verrà utilizzato in caso di parità.

0

L'indizio è:

Il problema è questo 'mangiare commento' regola non sembra corrispondere gettoni con più di un carattere

quindi aggiungere un * per indicare zero o più non di nuova riga. Vuoi Zero altrimenti un commento vuoto non corrisponderà.

%x COMMENT 

//     { BEGIN(COMMENT); } 
<COMMENT>[^\n]*  ; 
<COMMENT>\n   { BEGIN(INITIAL); } 

"=="     { return EQUALEQUAL; } 

.      ; 
+0

Un commento vuoto non attiverà nemmeno una corrispondenza per quella regola, né è necessario. – Darryl

+0

Vero, è vero, la linea in basso che la cattura. quindi sei sicuro di cambiare * in a + –