3

嗨,我想做一个 java 或 c# 方法,它将根据给定的输入返回一个布尔表达式 true 或 false。例如:

if(输入匹配 antlr 语法)返回 true;否则返回假;所以问题是我不知道如何检查公共树是否有任何不匹配的令牌。我试图遍历树,但它没有给出任何 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”

在控制台中。

4

2 回答 2

1

正如我在您问题下的评论中暗示的那样:之前的问答回答了您的问题。我将用一个例子来演示。

假设您有一个接受数字(并忽略空格)的语法。您只需要覆盖解析器和词法分析器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
于 2012-02-23T16:41:19.213 回答
0

ANTLR 很乐意为您恢复一些错误(例如缺少明显的 stoken),如果您不熟悉它可能会很痛苦。

如果您愿意,您可以在 regExParser 类中覆盖 BaseRecognizer.recoverFromMismatchedToken 并在找到不匹配的令牌时始终抛出异常。

参考:

ANTLR:错误恢复和报告

于 2012-02-23T05:31:37.040 回答