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?
problema principale risolto. Che ne dici di una domanda generale? – user2998131
@ user2998131, ah, persi quelli. Risponderà a quelli in un secondo momento. –
@ user2998131, controlla il mio ** EDIT **. –