parsing - 对多行 ANTLR 重复相同的规则

标签 parsing antlr antlr4 lexer antlrworks

我想知道使用 ANTLR 对多行应用解析规则的正确方法是什么。我使用以下规则,该规则适用于单行语句。我想在下几行重复这一点:

    grammar Condition;


/* Parser Rules */

condition : (expr+)? EOF;
expr
    : expr And expr         # andExpr
    | expr Or expr          # orExpr
    | LPar expr RPar        # parExpr
    | prop MIN Numerical expr       # eqExpr
    | prop some expr        # someExpr
    | prop only expr        # onlyExpr
    | prop value dataValue      # valueExpr
    | id                    # idExpr
    | not id                    # idExpr
    ;

id : Identifier;
prop:Identifier;
dataValue:Identifier;

/* Lexical Tokens */

And : 'AND';
Or : 'OR';
LPar : '(';
RPar : ')';
Equals : '=';
some : 'some';
only : 'only';
MIN : 'MIN';
value:'value';
not:'not';
NEWLINE: ('\n') { skip(); };

Numerical : [1-9] [0-9]*;
Data
    : [true]
    | [false]
    | [A]
    | [B]
    | [C]
    | [D]
    ;

// Using generic identifier tokens so that better warnings can be given in later passes.
Identifier : [a-zA-Z_] [a-zA-Z0-9_]*;

// Skip parsing of whitespace but save on hidden channel to enable retrieval of original string.
WhiteSpace : [ \t\r\n]+ -> channel(HIDDEN);

// Invalid character rule is used so that the lexer pass never fails.
InvalidChar : .;

上面的语法在测试时给出了正确的结果,但是当我尝试使用访问者时它会消耗每个 token ,它会抛出以下错误:

line 2:0 extraneous input 'SafetyGoal' expecting {, 'AND', 'OR'}

有什么建议吗?

编辑 下面是我用来读取输入文件并调用访问者代码的代码:

Stream<String> stream = Files.lines( Paths.get("C:\\test\\RulesTest.txt"), StandardCharsets.UTF_8);
stream.forEach(s -> contentBuilder.append(s).append("\n"));
String input=contentBuilder.toString();
InputStream inStream = new ByteArrayInputStream(input.getBytes(StandardCharsets.UTF_8));
org.antlr.v4.runtime.ANTLRInputStream in=new org.antlr.v4.runtime.ANTLRInputStream(inStream);
System.out.println("These are the lines:"+contentBuilder);
ConditionLexer lexer=new ConditionLexer(in);
org.antlr.v4.runtime.CommonTokenStream tokens= new org.antlr.v4.runtime.CommonTokenStream(lexer);
ConditionParser parser=new ConditionParser(tokens);
ParseTree tree=parser.expr();
MyVisitor vis=new MyVisitor();
vis.visit(tree);

MyVisitor 基本上包含与 ANTLR 生成的代码相同的代码,我在其中存储解析结果。

最佳答案

ParseTree tree=parser.expr();

您正在调用 expr 规则,该规则仅匹配单个表达式。您的 condition 规则是匹配多个表达式的规则,因此您应该调用该规则。

关于parsing - 对多行 ANTLR 重复相同的规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50528918/

相关文章:

java - ANTLR 中的递归处理规则

antlr - 您可以有条件地更改 ANTLR 词法分析器模式吗?

antlr4 - Antlr 中的 token 别名

javascript - 从 Javascript 解析 CDATA

r - 为什么 parse_number 函数说我的字符向量不是字符?

java - 如何使用 ANTLR v4 标记代码

go - ANTLR4内存使用情况

java - 在 ANTLR 解析器中跳过空格

java - ANTLR - 如何确定什么样的解析树 "best fits"一些代码

c++ - C++ 中的解析符号微分