2

您好我想要做一個java或c#方法,它將基於給定的輸入返回布爾表達式true或false。例如:ANTLR檢查commontree是否正確或如何檢查給定的輸入是否匹配ANTLR語法?

if(輸入與antlr語法匹配) 返回true; else return false; 所以問題是我不知道如何檢查commontree是否有任何mismatchetoken。我試圖遍歷樹,但它沒有給任何mismatchetoken作爲樹的節點。問題可能是AST不顯示不匹配的令牌只有解析樹。如果有人告訴我如何從解析器獲取解析器,它可能會有所幫助?

我也做了ANTLR .G文件和它的作品很好,現在我需要做到以下幾點:我要檢查,如果輸入是正確與否,我已經做到了這一點,但它不工作:

public static boolean check() { 
    String file = "test.txt"; 
    ANTLRReaderStream input; 
    try{ 

      input = new ANTLRReaderStream(new FileReader(file)); 
      regExLexer lexer = new regExLexer(input); 
      CommonTokenStream tokens = new CommonTokenStream(lexer); 
      regExParser parser = new regExParser(tokens); 

      CommonTree root = (CommonTree)parser.goal().getTree(); 

     return true;} 
catch{ 
return false;} 
} 

所以我期望從我的方法返回true只有當輸入字符串是正確的,否則爲false。我一直做它的方式返回true,但是當字符串是不正確的它打印

「線路1:4的外來輸入‘+’EOF期待」

控制檯

回答

1

正如我在您的問題下方的評論暗示:this previous Q&A回答你的問題。我將用一個例子來演示。

假設你有一個接受數字的語法(並忽略空格)。您只需要覆蓋解析器和詞法分析器的reportError並在該方法中引發異常:解析器(或詞法分析器)將不會繼續。趕上錯誤,並簡單地返回falsestatic輔助方法。

grammar T; 

@parser::members { 

    public static boolean matches(String input) { 
    try { 
     TLexer lexer = new TLexer(new ANTLRStringStream(input)); 
     TParser parser = new TParser(new CommonTokenStream(lexer)); 
     parser.parse(); 
     return true; 
    } catch(Exception e) { 
     return false; 
    } 
    } 

    @Override 
    public void reportError(RecognitionException e) { 
    throw new RuntimeException(e); 
    } 
} 

@lexer::members { 
    @Override 
    public void reportError(RecognitionException e) { 
    throw new RuntimeException(e); 
    } 
} 

parse 
: NUMBER* EOF 
; 

NUMBER : '0'..'9'+; 
SPACE : ' ' {skip();}; 

現在運行的類:

import org.antlr.runtime.*; 

public class Main { 
    public static void main(String[] args) throws Exception { 
    System.out.println(TParser.matches("")); 
    System.out.println(TParser.matches("1 234 42")); 
    System.out.println(TParser.matches("12 556 f")); 
    } 
} 

會打印:

true 
true 
false 
+0

謝謝,這非常好。現在我還有一個問題。我的語法接受例如這個字符串a * b,但不接受a ** b,這部分工作正常,但是當我添加一個不屬於語言部分的字符串時,它會拋出一個異常,但返回true,例如a * b_。在這種情況下,'_'不是我的語言的一部分。任何建議 – sm13294 2012-02-23 18:29:33

+0

哦,我忘了在我的詞法分析器中添加@Override。非常感謝你。 – sm13294 2012-02-23 18:31:05

0

ANTLR善意地爲你恢復了一些錯誤(比如錯過了一個明顯的理由),如果你不熟悉它,這可能是一種痛苦。

如果你喜歡,你可以重載regExParser類中的BaseRecognizer.recoverFromMismatchedToken,並且總是拋出一個異常是找到一個不匹配的標記。

參考:

ANTLR: error recovery and reporting

+0

感謝您的回答,但我想通過覆蓋該類我將實現顯示自定義的錯誤,那就是不是我所需要的。我只需要知道什麼時候發生錯誤(任何錯誤)我想要做這樣的事情:if(發生錯誤){do smth} else {do smth else}錯誤發生我的意思是檢查給定的輸入是否匹配antlr文法在.g文件中指定? – sm13294 2012-02-23 14:21:41