c# - 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 错误?
解决方案
推荐阅读
- r - 从字符串格式 "c(\"4\", \"5\", \"7\", \"8\", \"9\", \"10\")" 转换为字符
- javascript - 无法获得输出.. 函数中给出的参数未读取
- chatbot - 如何通过 docker 在 rasa nlu 中使用 fasttext
- swift - 如何在 alamofire 中使用自定义动词?
- python - 这个朴素贝叶斯多项式模型代码的预期结果是什么
- android - 对于不同的屏幕尺寸,我们可以为相同的布局文件设置不同的按钮(或视图)吗
- python - 当我返回页面时,我从选择页面上的一个元素中得到了 StaleElementReferenceException 异常。为什么?
- google-tag-manager - 如何从 2 个数据层变量中获取电子商务标签的总收入?
- python-3.x - 当值为 NaN 时合并数据框行
- angular - 如何使用 Angular 创建多页应用程序?