ANTLR同一解析器规则的零到多次出现

ANTLR同一解析器规则的零到多次出现,antlr,Antlr,我试图解析javadoc风格的注释。我如何指示相同的解析器规则可能被触发零次或多次 doc_comment : '/**' (param_declaration)* '*/' ; param_declaration : OUTERWS '@param' OUTERWS ID OUTERWS; ID : ('a'..'z')+ ; OUTERWS :

我试图解析javadoc风格的注释。我如何指示相同的解析器规则可能被触发零次或多次

doc_comment            :    '/**' (param_declaration)* '*/'         ;

param_declaration      :    OUTERWS '@param' OUTERWS ID OUTERWS;

ID                     :    ('a'..'z')+ ;

OUTERWS                :     ('\n' | '\r' | ' ' |'\t')*;
将param_声明规则封装在*中似乎不起作用,因为它不是令牌

我希望:

/**
  @param one
  @param two
 */
会有用的。但我得到的结果是:如果param_声明匹配零个或多个实例,则无关的输入'@param'应为{'/',这对我来说没有意义。似乎将*添加到param_声明中没有任何作用。无论哪种方式:

/**
 @param one
*/

工作正常;有或没有*

您的问题的答案是,要匹配规则foo零次或多次,请使用foo*或仅使用foo*

如果这不能产生一个可用的结果,那么问题就在于你是如何构造你的词法分析器和/或语法分析器的,为了解决这个问题,你需要问一个更具体的问题,包括你的语法以及你不希望的特定输入和输出,以及对所需输出的描述

编辑:由于param_声明规则以所需的OUTERWS标记开始和结束,因此发生了两个参数错误。这意味着两个OUTERWS标记必须出现在一行中,才能解析两个参数。这是不可能的,因为输入文件中的任意两个空格字符序列都将匹配一个长OUTERWS标记,并且将始终使用较长的令牌,而不是两个较短的令牌

还请注意,您的OUTERWS令牌的写入方式可以匹配0个字符。如果您的输入序列包含一个数字,例如0,则出现在0之前的最长令牌将是一个长度为零的OUTERWS令牌。由于匹配0个字符不会使输入前进,这意味着包含数字的输入应产生一个无限长的空OUTERWS令牌流。在为该语法生成代码时,您看到的相关警告不容忽视


编辑2:如果注释以/***/形式出现,您的输入可以匹配零个参数。但是,如果您的注释以/***/形式出现,您将有一个介于/**和*/之间的OUTERWS标记,在没有参数声明的情况下,解析器规则不允许这样做。

您的问题的答案是,要匹配规则foo零次或多次,use foo*或简称foo*

如果这不能产生一个可用的结果,那么问题就在于你是如何构造你的词法分析器和/或语法分析器的,为了解决这个问题,你需要问一个更具体的问题,包括你的语法以及你不希望的特定输入和输出,以及对所需输出的描述

编辑:由于param_声明规则以所需的OUTERWS标记开始和结束,因此发生了两个参数错误。这意味着两个OUTERWS标记必须出现在一行中,才能解析两个参数。这是不可能的,因为输入文件中的任意两个空格字符序列都将匹配一个长OUTERWS标记,并且将始终使用较长的令牌,而不是两个较短的令牌

还请注意,您的OUTERWS令牌的写入方式可以匹配0个字符。如果您的输入序列包含一个数字,例如0,则出现在0之前的最长令牌将是一个长度为零的OUTERWS令牌。由于匹配0个字符不会使输入前进,这意味着包含数字的输入应产生一个无限长的空OUTERWS令牌流。在为该语法生成代码时,您看到的相关警告不容忽视


编辑2:如果注释以/***/形式出现,您的输入可以匹配零参数。但是,如果注释以/***/形式出现,您将有一个介于/**和*/之间的OUTERWS标记,在没有参数声明的情况下,解析器规则不允许使用该标记。

以上是完整的语法。它与零参数定义不匹配或者。它似乎只适用于一个。上面是完整的语法。它也不匹配零参数定义。它似乎只适用于一个