ANTLR输入不匹配?lexer顺序错误?

ANTLR输入不匹配?lexer顺序错误?,antlr,antlr4,Antlr,Antlr4,我已经开始使用Antlr为自定义DSL生成解析器。 该语言获取文件并对其进行过滤 我的语法如下(缩短): 假设我想解析这个输入: 过滤式abc 然后我得到: mismatched input 'filter -type abc ' expecting FILTER 问题是,如果我碰巧lexer规则说明符 SPECIFIER : 'abc' 我输入:过滤型abc它工作得很好 我相信这是一个与贪婪匹配有关的lexer排序问题? 即使我不明白为什么,因为我认为Antlr采用了第一条匹配的lexer

我已经开始使用Antlr为自定义DSL生成解析器。 该语言获取文件并对其进行过滤

我的语法如下(缩短):

假设我想解析这个输入: 过滤式abc

然后我得到:

mismatched input 'filter -type abc ' expecting FILTER
问题是,如果我碰巧lexer规则说明符

SPECIFIER : 'abc'
我输入:过滤型abc它工作得很好

我相信这是一个与贪婪匹配有关的lexer排序问题? 即使我不明白为什么,因为我认为Antlr采用了第一条匹配的lexer规则。在我的例子中,规则过滤器和类型在说明符前面

提前感谢,

斯蒂芬

我以为Antlr采用了第一条匹配的lexer规则。在我的例子中,规则过滤器和类型在说明符前面

嗯。。。这并不完全正确。ANTLR首先使用最长的匹配规则,并且只有当多个规则匹配相同的令牌长度时,它才会选择第一个出现的规则

您的
说明符
规则太宽,匹配的文本太多,请尝试缩小范围。一般来说,IMHO中使用包含性规则比使用独占性规则更好,正是因为这种匹配策略

我以为Antlr采用了第一条匹配的lexer规则。在我的例子中,规则过滤器和类型在说明符前面

嗯。。。这并不完全正确。ANTLR首先使用最长的匹配规则,并且只有当多个规则匹配相同的令牌长度时,它才会选择第一个出现的规则

您的
说明符
规则太宽,匹配的文本太多,请尝试缩小范围。一般来说,IMHO中使用包含性规则比使用独占性规则更好,正是因为这种匹配策略

我以为Antlr采用了第一条匹配的lexer规则。在我的例子中,规则过滤器和类型在说明符前面

嗯。。。这并不完全正确。ANTLR首先使用最长的匹配规则,并且只有当多个规则匹配相同的令牌长度时,它才会选择第一个出现的规则

您的
说明符
规则太宽,匹配的文本太多,请尝试缩小范围。一般来说,IMHO中使用包含性规则比使用独占性规则更好,正是因为这种匹配策略

我以为Antlr采用了第一条匹配的lexer规则。在我的例子中,规则过滤器和类型在说明符前面

嗯。。。这并不完全正确。ANTLR首先使用最长的匹配规则,并且只有当多个规则匹配相同的令牌长度时,它才会选择第一个出现的规则


您的
说明符
规则太宽,匹配的文本太多,请尝试缩小范围。总的来说,IMHO中使用包容性规则比使用排他性规则更好,正是因为这种匹配策略。

谢谢,这解释了它失败的原因。你能告诉我,你所说的包容性和排他性规则是什么意思吗?你的意思是,我不应该写~'~',而是应该手动将它与a..z a..z等匹配?@Stephan是的,没错。这样更好,意外的情况会少一些,语法也会更容易理解。谢谢,这就解释了它失败的原因。你能告诉我,你所说的包容性和排他性规则是什么意思吗?你的意思是,我不应该写~'~',而是应该手动将它与a..z a..z等匹配?@Stephan是的,没错。这样更好,意外的情况会少一些,语法也会更容易理解。谢谢,这就解释了它失败的原因。你能告诉我,你所说的包容性和排他性规则是什么意思吗?你的意思是,我不应该写~'~',而是应该手动将它与a..z a..z等匹配?@Stephan是的,没错。这样更好,意外的情况会少一些,语法也会更容易理解。谢谢,这就解释了它失败的原因。你能告诉我,你所说的包容性和排他性规则是什么意思吗?你的意思是,我不应该写~'~',而是应该手动将它与a..z a..z等匹配?@Stephan是的,没错。这样更好,意外情况会更少,语法也更容易理解。
SPECIFIER : 'abc'