2016-07-18 119 views
0

如果用antlr4與孤島語法作鬥爭,並且我可以使其工作,但我仍然懷疑這是否是「正確」的方式。ANTLR4:Island語法,令牌匹配/跳過

我需要解析:

Some random text 
{ } 

@if(condition) { 
    more random text 
    @foobar 
    @if (condition2) { 
     random text {} 
    } 
} 

問題在於上下文中:一個「野」 {}是沒有什麼,但如果它是一個{}後面的語言運算符,{}變得有意義。 (閱讀:它打開和關閉塊)

在上述情況下,它會返回以下,假設條件和條件2都爲true:

Some random text 
{} 
more random text 
random text {} 

我很困惑哪個路線來接,關於上述的任何建議?

原來實行似乎是匹配的括號:

{ } 

@if (true) { 
    { 
    foo 
    bar 
    } } 

產生

{ } 
{ 
foo 
bar 
} 

{ } 

@if (true) { 
{ 
    foo 
    bar 
    } 

產生解析錯誤。

+0

你能發表你一直在研究的ANTLR語法嗎? –

+0

解析器/詞法分析器位於: https://github.com/igmar/rythm2/blob/master/src/main/antlr4/RythmLexer.g4 https://github.com/igmar/rythm2/blob/master /src/main/antlr4/RythmParser.g4 我還沒有實現涉及問題的部分,因爲我仍然在考慮正確的方法。 –

+0

爲了明確我的意思:當前解析器在 {} 作爲輸入失敗。邏輯:它返回CURLY_OPEN CURLY_CLOSE,根據語法不允許。我可以把它放在一個不容易的模式中,因爲我需要能夠逃脫它。基本上,我想說:匹配},如果你已經看到{第一。 –

回答

0

這可以用上下文特定的詞法分析器來解決。在這種情況下,通過跟蹤條件/塊的開頭,我們可以確定這是模板內容還是實際的塊打開/關閉。

參見ANTLR4權威性ANTLR4參考文獻的p219。

+0

它變得更糟: text @ foo.bar text text @ foo.bar()text is also valid。 –