Użyłem ANTLR w wersji 4 do stworzenia kompilatora. Pierwsza faza była częścią Lexer. Stworzyłem w nim plik "CompilerLexer.g4" i zawarte w nim zasady lexera. Działa dobrze.Używanie ANTLR Parser i Lexer Separatly
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
;
Teraz nadszedł czas na etapie 2, który jest tworzony parser.I "CompilerParser.g4" plik i putted gramatyk w nim jednak dziesiątki ostrzeżenia i błędy.
CompilerParser.g4:
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
;
ostrzegawcze i błędy:
- implicite definicja symboliczną 'BLOCK' w parsera
- implicite definicja żeton ' BOOLEXP "w parserze
- implicite definicja symboliczną „EXP” w parsera
- implicite definicja tokena „explist” w parsera
- lexer zasada „BLOK” niedozwolone w parsera
- lexer zasada „EXP” niedozwolone w parsera
- lexer zasada „explist” niedozwolone w parsera
- lexer zasady „wyrażenie” niedozwolone w parsera
dziesiątki tych ostrzeżenia i błędy. Jaka jest przyczyna?
Pytania ogólne: Jaka jest różnica między używaniem gramatyki kombinowanej a używaniem osobno lexera i analizatora składni? Jak dołączyć do osobnych plików gramatyki i lexera?
główny problem rozwiązany. Co powiesz na ogólne pytanie? – user2998131
@ user2998131, ah, brakowało tych. Odpowie na te pytania w późniejszym czasie. –
@ user2998131, sprawdź moją ** EDYCJĘ **. –