ANTLR递归语法匹配

时间:2016-04-01 09:45:51

标签: antlr antlr4

我有以下语法

return $(this).parent().attr('class');

要匹配以下脚本

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

匹配

this is the tree view with errors

我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

第一组之后缺少'结束'。第二组是嵌套的,但根据规则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
    ;

然后它应该正确解析。