2014-06-19 16 views
5

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?

Odpowiedz

7

Reguły Lexer rozpoczynają się od dużej litery, a reguły parsera zaczynają się od małej litery. W gramatyce parsera nie można definiować tokenów. A ponieważ ANTLR myśli wszystkie reguły reguł leksykalnych, generuje te błędy/ostrzeżenia.

EDIT

user2998131 napisał:

ogólne pytania: Jaka jest różnica między używaniem gramatyki łączy się i za pomocą parsera lexer i osobno?

Rozdzielenie reguł leksera i parsera pozwoli uporządkować sprawy. Ponadto podczas tworzenia osobnych gramatyk leksykonu i parsera nie można (przypadkowo) umieścić dosłownych tokenów w gramatyce analizatora składni, ale trzeba zdefiniować wszystkie tokeny w gramatyce leksykonu.Pozwoli to oczywiste, które przepisy Lexer uzyskać dopasowane przed innymi, a nie można zrobić wewnątrz powtarzające literalne znaki żadnego literówkę w:

grammar P; 

r1 : 'foo' r2; 

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

Ale kiedy masz gramatyki parser, nie można zrobić tego błędu. Będziesz musiał użyć reguły Lexer pasujący 'foo':

parser grammar P 

options { tokenVocab=L; } 

r1 : FOO r2; 

r2 : r3 FOO; 


lexer grammar L; 

FOO : 'foo'; 

user2998131 napisał:

Jak należy dołączyć oddzielne pliki gramatyki i Lexer?

tak jak ty w swojej gramatyki parser: wskazaniu właściwego tokenVocab wewnątrz bloku options { ... }.

pamiętać, że można również importować gramatyk, który jest coś innego: https://theantlrguy.atlassian.net/wiki/display/ANTLR4/Grammar+Structure#GrammarStructure-GrammarImports

+0

główny problem rozwiązany. Co powiesz na ogólne pytanie? – user2998131

+0

@ user2998131, ah, brakowało tych. Odpowie na te pytania w późniejszym czasie. –

+0

@ user2998131, sprawdź moją ** EDYCJĘ **. –