2013-02-12 68 views
0

我想與你分享我必須在ANTLR4中實施的島嶼解決方案。島嶼解決方案與ANTLR4

  1. 該語言的結構。我必須編寫語法的語言來自 帶有一些附加結構的PL/SQL。我不會在此討論更多細節,因爲這是脫離主題。
  2. 語言定義了一個特殊命令PUT具有以下結構:

    PUT [<SPECIALISED LANGUAGE>]

我的解決辦法是:

  1. 覆蓋詞法的nextToken方法:

    public Token nextToken() { 
        if (f_current_idx != -1) { 
         _input.seek(f_current_idx); f_current_idx = -1; 
        } 
        Token l_token = super.nextToken(); return l_token; 
    } 
    
  2. 添加一些代碼在詞法:

    PUT : 
    'PUT' 
    { 
        f_current_idx = _input.index(); ((ANTLRStringStream) _input).rewind(); 
    
        SRC_PUTLexer l_put_lexer = new SRC_PUTLexer(_input); 
        UnbufferedTokenStream<Token> l_tokenStream = new UnbufferedTokenStream<Token>(l_put_lexer); 
    
        if (l_tokenStream.LA(2) == SRC_PUTLexer.LBRACK) { 
         new SRC_PUTParser(l_tokenStream).start_rule(); f_current_idx = _input.index(); 
        } 
    }; 
    

而且已在ANTLR 4不見了類ANTLRStringStream必須定義:

public class ANTLRStringStream extends ANTLRInputStream { 

    protected int markDepth = 0; 
    protected int lastMarker; 

    protected ArrayList<Integer> markers; 

    public ANTLRStringStream() { 
     super(); 
    } 

    public ANTLRStringStream(String input) { 
     super(input); 
    } 

    public int mark() { 
     if (markers==null) { markers = new ArrayList<Integer>(); } 
     markers.add(markDepth, index()); markDepth++; lastMarker = markDepth; 
     return markDepth; 
    } 

    public void rewind(int m) { 
     int state = (int) markers.get(m); seek(state); release(m); 
    } 

    public void rewind() { rewind(lastMarker); } 

    public void release(int marker) { 
     markDepth = marker; markDepth--; 
    } 
} 

任何反饋將是非常歡迎! 親切的問候,WolfgangHämmer

回答

3

這應該是一個真正的社區維基。

我的第一個主要評論是你需要擺脫ANTLRStringStream類。由ANTLR 4提供的ANTLRInputStream類在ANTLR 3中提供ANTLRStringStream的功能。IntStreamCharStream接口在ANTLR 4中被修改和廣泛記錄以消除有問題的rewind方法和其他未定義的行爲。你不應該再介紹它們。