首页 > 解决方案 > Antlr4 接受无效表达式但仍返回有效部分

问题描述

我有以下 C# 程序,我想在其中编写一个带有可链接 AND 或和括号的“过滤器语法”:

static void Main(string[] args)
    {

        try
        {
            var filter = "OWNER(Peter AND Susan) OR OWNER(Bob AND Alice)";
            var input = new AntlrInputStream(filter);
            var lexer = new ExampleSyntaxLexer(input);
            var tokens = new CommonTokenStream(lexer);
            var parser = new ExampleSyntaxParser(tokens);
            parser.AddErrorListener(new ErrorListenerParser());
            lexer.AddErrorListener(new ErrorListenerLexer());
            var rootContext = parser.filter();
        }
        catch (Exception e)
        {
            System.Diagnostics.Debug.WriteLine(e);
            throw e;
        }
    }

语法:

grammar ExampleSyntax;

/*
 * Parser Rules
 */


filter
    :command
    |BR_ROUND_OPEN filter BR_ROUND_CLOSE
    |filter AND filter
    |filter OR filter
    ;


command
    :ELEMENT BR_ROUND_OPEN element BR_ROUND_CLOSE
    ;

element
    :BR_ROUND_OPEN element BR_ROUND_CLOSE
    |element AND element
    |element OR element
    |ELEMENT
    ;

/*
 * Lexer Rules
 */

AND
    :[aA][nN][dD]                   
    ;

OR
    :[oO][rR]                       
    ;

BR_ROUND_OPEN
    :'('
    ;

BR_ROUND_CLOSE
    :')'
    ;

ELEMENT
    :LETTER+
    ;


WHITESPACE          : (' '|'\t')+ -> skip ;
NEWLINE             : ('\r'? '\n' | '\r')+ ;

fragment LETTER:[a-zA-ZäÄöÖüÜß]+;

从理论上讲,这非常有效,零件被很好地识别,并且我会在 2 个错误侦听器中发现很多错误。但是,会出现一些错误:

var filter = "OWNER(Peter AND Susan))))) OR OWNER(Bob AND Alice)";

 var filter = "OWNER(Peter AND Susan) ORT OWNER(Bob AND Alice)";

在这两种情况下,ANTLR 都会识别所有内容,直到“错误”(在第一部分中括号太多,在第二部分中是单词 ORT)并为该部分生成正常树,但会简单地忽略其余部分。我怎样才能找到这样的错误?我假设这些不是 Lexer Errors,因为 Lexes 实际上是定义的,但应该是一些 Parser 错误?

标签: c#antlrantlr4

解决方案


推荐阅读