簡體   English   中英

ANTLR遞歸語法匹配

[英]ANTLR recursive syntax matching

我有以下語法

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

第2個符合預期,但第一個不符合。

在第一個腳本中,第二個內部組在父組下不匹配。

相反,它與以下statement匹配

這是有錯誤的樹形視圖

我在這里想念什么?

第一組之后,它缺少一個“終點”。 第二組是嵌套的,但是根據規則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
    ;

然后它應該正確解析。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM