2009-12-16 13 views
5

Ehi. Sono nuovo di ANTLR. ANTLRWorks wizard wrrited per me il seguente codice:ANTLR "Inaspettata fine della sottostruttura"

grammar test; 

ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* 
    ; 

INT : '0'..'9'+ 
    ; 

FLOAT 
    : ('0'..'9')+ '.' ('0'..'9')* EXPONENT? 
    | '.' ('0'..'9')+ EXPONENT? 
    | ('0'..'9')+ EXPONENT 
    ; 

COMMENT 
    : '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;} 
    | '/*' (options {greedy=false;} : .)* '*/' {$channel=HIDDEN;} 
    ; 

WS : (' ' 
     | '\t' 
     | '\r' 
     | '\n' 
     ) {$channel=HIDDEN;} 
    ; 

STRING 
    : '"' (ESC_SEQ | ~('\\'|'"'))* '"' 
    ; 
CHAR: '\'' (ESC_SEQ | ~('\''|'\\')) '\'' 
    ; 

fragment 
EXPONENT : ('e'|'E') ('+'|'-')? ('0'..'9')+ ; 

fragment 
HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ; 

fragment 
ESC_SEQ 
    : '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\') 
    | UNICODE_ESC 
    | OCTAL_ESC 
    ; 

fragment 
OCTAL_ESC 
    : '\\' ('0'..'3') ('0'..'7') ('0'..'7') 
    | '\\' ('0'..'7') ('0'..'7') 
    | '\\' ('0'..'7') 
    ; 

fragment 
UNICODE_ESC 
    : '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT 
    ; 

Quando il debug di esso, si getta il seguente errore:

[22:45:49] error(100): C:\Documents and Settings\user\Desktop\test.g:0:0: syntax error: codegen: <AST>:0:0: unexpected end of subtree 

Qualcuno mi può spiegare che cosa è l'errore, dove è e come posso risolvere vero?

Grazie.

risposta

7

In ANTLR, ogni regola che inizia con una maiuscola è una regola di lexer. Quelle che iniziano con un minuscolo sono le regole del parser. Come puoi vedere, hai solo regole lexer: e c'è il tuo problema. Devi avere almeno una regola parser. Se si aggiunge la seguente regola:

parse 
    : ID 
    | INT 
    | // ... 
    ; 

l'errore scompare quando la generazione di file di origine per il vostro lexer/parser.

2

Disclaimer: Non so nulla del wizard ANTLR.

Una ricerca su Google salta fuori questa citazione:

Usually "unexpected end of subtree" means you forgot to make something a root in the parser.

Questo ha senso per me se si suppone che il file per specificare una grammatica e non solo le regole per l'analisi lessicale. La prima riga del tuo file è "grammar test" quindi presumibilmente questa è una grammatica.

Una grammatica consente di ridurre una serie di simboli terminali a un singolo simbolo non terminale. Così, per esempio, una grammatica molto semplice che rappresenta espressioni pienamente tra parentesi sarebbe simile a questa:

P : E 
E : (X) 
    | E E 
    | (E) 
X : 'x' 

Qui, P è la radice, perché tutte le condanne alla fine si riducono a una P. Se una frase non può ridurre a un P, lo fa non corrisponde a questa grammatica. Quindi, devi trovare una radice per la tua grammatica, e tutte le altre produzioni dovrebbero apparire solo nel contesto della radice (cioè tramite una derivazione diretta o indiretta).

+0

Si noti che poiché ANTLR produce parser LL (*), non può far fronte alla grammatica ricorsiva sinistra che hai postato. http://www.antlr.org/wiki/display/ANTLR3/Left-Recursion+Removal –

+0

Ah, ok - con ANTLR che termina con "LR", ho appena assunto. – danben

+0

:) vero, il nome suggerisce il contrario. ANTLR sta per "AN un altro strumento per ** L ** anguage ** R ** ecognition". –

Problemi correlati