ANTLR递归语法匹配

ANTLR递归语法匹配,antlr,antlr4,Antlr,Antlr4,我有以下语法 grammar Group; script: statementList; statementList: (statement NEWLINE+)*; statement: titleStatement | groupStatement; titleStatement : 'hello_world' WS+ ':' WS+ IDENTIFIER; groupStatement :groupDefStatement (messag

我有以下语法

grammar Group;

script: statementList;

statementList: (statement NEWLINE+)*;


statement: titleStatement | groupStatement;

titleStatement
    : 'hello_world' WS+ ':' WS+ IDENTIFIER;

groupStatement
        :groupDefStatement
         (messageFlowStatementList | groupStatement)
         END
         ;

messageFlowStatementList: (messageFlowStatement NEWLINE+)*;

messageFlowStatement: processingStatement;



groupDefStatement : GROUP WS+ (NAME WS* EQ_SYMBOL WS* STRINGX WS* COMMA_SYMBOL WS*)?
                            PATH WS* EQ_SYMBOL WS* STRINGX WS*
                            (COMMA_SYMBOL WS* METHOD WS* EQ_SYMBOL WS* STRINGX WS*)? NEWLINE+;

processingStatement: PROCESS_MESSAGE LPAREN STRINGX COMMA_SYMBOL STRINGX RPAREN;
要匹配以下脚本,请执行以下操作:

hello_world : abc

group name="group", path="hello", method="POST"

group name="group", path="hello", method="POST"
process_message("aaa","bbb")
end

group name="group", path="hello", method="POST"
process_message("aaa","bbb")
end

end

hello_world : abc
group name="group", path="hello", method="POST"
process_message("aaa","bbb")
end
第二个与预期匹配,但第一个不匹配

在第一个脚本中,父组下的第二个内部组不匹配

相反,它与
语句匹配


我在这里遗漏了什么?

在第一组之后遗漏了一个“结尾”。第二个组是嵌套的,但根据规则
groupStatement
,它们都需要一个结尾。正确的输入应该是:

hello_world : abc

group name="group", path="hello", method="POST"

group name="group", path="hello", method="POST"
process_message("aaa","bbb")
end
end

group name="group", path="hello", method="POST"
process_message("aaa","bbb")
end

end
如果希望原始输入正确,可以将
groupStatement
规则更改为:

groupStatement
    : groupDefStatement messageFlowStatementList END
    | groupDefStatement groupStatement
    ;
然后它应该正确解析