2014-06-19 23 views
5

Ho usato ANTLR versione 4 per la creazione del compilatore. La prima fase era la parte di Lexer. Ho creato il file "CompilerLexer.g4" e ho inserito le regole del lexer in esso. Funziona bene.Utilizzo di parser ANTLR e Lexer separatamente

CompilerLexer.g4:


lexer grammar CompilerLexer; 

INT   : 'int' ; //1 
FLOAT  : 'float' ; //2 
BEGIN  : 'begin' ; //3 
END   : 'end' ; //4 
To   : 'to' ; //5 
NEXT  : 'next' ; //6 
REAL  : 'real' ; //7 
BOOLEAN  : 'bool' ; //8 
. 
. 
. 
NOTEQUAL : '!=' ; //46 
AND   : '&&' ; //47 
OR   : '||' ; //48 
POW   : '^'  ; //49 
ID   : [a-zA-Z]+ ; //50 




WS 
: ' ' -> channel(HIDDEN) //50 
; 

Ora è il momento per la fase 2, che è la parser.I creato file "CompilerParser.g4" e putted grammatiche in esso, ma hanno decine di avvertimento ed errori.

CompilerParser.g4: errori


parser grammar CompilerParser; 

options { tokenVocab = CompilerLexer; } 

STATEMENT : EXPRESSION SEMIC 
     | IFSTMT 
     | WHILESTMT 
     | FORSTMT 
     | READSTMT SEMIC 
     | WRITESTMT SEMIC 
     | VARDEF SEMIC 
     | BLOCK 
     ; 

BLOCK  : BEGIN STATEMENTS END 
     ; 

STATEMENTS : STATEMENT STATEMENTS* 
     ; 

EXPRESSION : ID ASSIGN EXPRESSION 
     | BOOLEXP 
     ; 

RELEXP  : MODEXP (GT | LT | EQUAL | NOTEQUAL | LE | GE | AND | OR) RELEXP 
     | MODEXP 
     ; 

. 
. 
. 

VARDEF  : (ID COMA)* ID COLON VARTYPE 
     ; 

VARTYPE  : INT 
     | FLOAT 
     | CHAR 
     | STRING 
     ; 
compileUnit 
: EOF 
; 

avvertenza e:

  • implicita definizione di token 'block' nel parser
  • implicita definizione di token ' BOOLEXP 'nel parser
  • implicita definizione di token 'EXP' nel parser
  • implicita definizione di token 'EXPLIST' nel parser
  • lexer regola 'BLOCCO' non consentito in parser
  • lexer regola 'EXP' non consentito in parser
  • regola
  • lexer 'EXPLIST' non consentito in parser
  • lexer regola 'ESPRESSIONE' non consentito in parser

avere decine di questi avvertimenti ed errori. Qual è la causa?

Domande generali: Qual è la differenza tra l'utilizzo della grammatica combinata e l'utilizzo separato di lexer e parser? Come dovrebbero unire file separati di grammatica e lexer?

risposta

7

Le regole di Lexer iniziano con una lettera maiuscola e le regole del parser iniziano con una lettera minuscola. In una grammatica del parser, non è possibile definire i token. E poiché ANTLR pensa a tutte le regole del lexer delle regole del casing superiore, produce questi errori/avvertenze.

EDIT

user2998131 ha scritto:

Domande generali: Qual è la differenza tra l'uso della grammatica combinata e lexer e parser separatamente?

Separare le regole del lexer e del parser manterrà le cose organizzate. Inoltre, quando si creano le grammatiche separate di lessico e parser, non è possibile (accidentalmente) inserire i token letterali nella grammatica del parser, ma è necessario definire tutti i token nella grammatica del lexer.In questo modo sarà evidente che le regole vengono abbinati lexer prima degli altri, e non si può fare all'interno di gettoni letterali ricorrenti qualsiasi typo:

grammar P; 

r1 : 'foo' r2; 

r2 : r3 'foo '; // added an accidental space after 'foo' 

Ma quando si dispone di una grammatica parser, non è possibile fare questo errore. Si dovrà utilizzare la regola lexer che corrisponde 'foo':

parser grammar P 

options { tokenVocab=L; } 

r1 : FOO r2; 

r2 : r3 FOO; 


lexer grammar L; 

FOO : 'foo'; 

user2998131 ha scritto:

Come dovrebbe unire file di grammatica e lexer separate?

proprio come si fa nella tua grammatica parser: si punta al corretto tokenVocab all'interno del blocco options { ... }.

Si noti che è anche possibile importare le grammatiche, che è qualcosa di diverso: https://theantlrguy.atlassian.net/wiki/display/ANTLR4/Grammar+Structure#GrammarStructure-GrammarImports

+0

problema principale risolto. Che ne dici di una domanda generale? – user2998131

+0

@ user2998131, ah, persi quelli. Risponderà a quelli in un secondo momento. –

+0

@ user2998131, controlla il mio ** EDIT **. –

Problemi correlati