2014-06-19 99 views
5

我使用ANTLR版本4來創建編譯器。第一階段是Lexer部分。我創建了「CompilerLexer.g4」文件,並在其中放置了詞法分析器規則。它工作正常。分別使用ANTLR解析器和Lexer

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 
; 

現在是時候了,第2階段這是parser.I創建 「CompilerParser.g4」 文件和推杆語法中,但有幾十個警告和錯誤。

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 
; 

警告和錯誤:

  • 解析器的令牌 'BLOCK' 隱含的定義
  • 令牌隱含定義「 BOOLEXP'解析器
  • 解析器令牌「EXP」
  • 解析器令牌「EXPLIST」的隱定義的隱含定義
  • 詞法規則「BLOCK」解析器不允許
  • 詞法規則「EXP」解析器
  • 不允許
  • 詞法規則「EXPLIST」解析器不允許
  • 詞法分析器中不允許規則「表達」

有幾十這些警告和錯誤。原因是什麼?

一般問題:使用組合語法和分別使用詞法分析器和分析器有什麼區別?如何加入單獨的語法和詞法分析器文件?

回答

7

Lexer規則以大寫字母開頭,解析器規則以小寫字母開頭。在語法分析器中,您不能定義令牌。由於ANTLR認爲你所有的上層規則詞法規則,它會產生這些錯誤/警告。

編輯

user2998131寫道:

一般問題:什麼是使用組合語法和分別使用詞法和語法分析器之間的區別?

分離詞法分析器和分析器規則將使事情保持有序。另外,在創建單獨的詞法分析器和分析器語法時,不能(意外)將分詞標記放入分析器語法中,但需要在詞法分析器語法中定義所有的標記。這將使明顯這詞法規則得到別人之前匹配,你不能做任何錯字的內部反覆文字記號:

grammar P; 

r1 : 'foo' r2; 

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

但是,當你有一個解析器語法,你不能犯類似的錯誤。你將不得不使用符合 '富' 的詞法規則:

parser grammar P 

options { tokenVocab=L; } 

r1 : FOO r2; 

r2 : r3 FOO; 


lexer grammar L; 

FOO : 'foo'; 

user2998131寫道:

應該如何加入獨立的語法和詞法文件?

就像你在你的語法解析器做:你指出正確的tokenVocaboptions { ... }塊內。

請注意,您還可以導入語法,這是不同的東西:https://theantlrguy.atlassian.net/wiki/display/ANTLR4/Grammar+Structure#GrammarStructure-GrammarImports

+0

解決的主要問題。一般問題如何? – user2998131

+0

@ user2998131啊,錯過了那些。將在稍後回答這些問題。 –

+0

@ user2998131,檢查我的**編輯**。 –