ANTLR检查commontree是否正确或如何检查给定的输入是否匹配ANTLR语法?
您好我想要做一个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期待”
。
正如我在您的问题下方的评论暗示:this previous Q&A回答你的问题。我将用一个例子来演示。
假设你有一个接受数字的语法(并忽略空格)。您只需要覆盖解析器和词法分析器的reportError
并在该方法中引发异常:解析器(或词法分析器)将不会继续。赶上错误,并简单地返回false
在static
辅助方法。
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
ANTLR善意地为你恢复了一些错误(比如错过了一个明显的理由),如果你不熟悉它,这可能是一种痛苦。
如果你喜欢,你可以重载regExParser类中的BaseRecognizer.recoverFromMismatchedToken,并且总是抛出一个异常是找到一个不匹配的标记。
参考:
感谢您的回答,但我想通过覆盖该类我将实现显示自定义的错误,那就是不是我所需要的。我只需要知道什么时候发生错误(任何错误)我想要做这样的事情:if(发生错误){do smth} else {do smth else}错误发生我的意思是检查给定的输入是否匹配antlr文法在.g文件中指定? – sm13294 2012-02-23 14:21:41
谢谢,这非常好。现在我还有一个问题。我的语法接受例如这个字符串a * b,但不接受a ** b,这部分工作正常,但是当我添加一个不属于语言部分的字符串时,它会抛出一个异常,但返回true,例如a * b_。在这种情况下,'_'不是我的语言的一部分。任何建议 – sm13294 2012-02-23 18:29:33
哦,我忘了在我的词法分析器中添加@Override。非常感谢你。 – sm13294 2012-02-23 18:31:05