2012-02-22 119 views
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