我解析的語言有一個語句'code',後跟'{',後面跟着一堆我沒有興趣解析的代碼,接着是'}' 。我非常希望有一個類似的規則:ANTLR4解析規則以匹配打開/關閉括號
skip_code: 'code' '{' ~['}']* '}'
..這隻會直接跳到右大括號。問題在於被跳過的代碼本身可能會有一對花括號。所以,我基本上需要做的是運行一個計數器並在每個'{'上遞增並在每個'}'上遞減,並且當計數器回到0時結束解析規則。
什麼是最好的方式這在ANTLR4?我應該在檢測到「代碼」時跳過自定義函數併吞下代碼並運行我的計數器,或者在語法中有一些優雅的方式來表達它?
編輯:一些示例代碼,根據要求:
class foo;
int m_bar;
function foo_bar;
print("hello world");
endfunction
code {
// This is some C code
void my_c_func() {
printf("I have curly braces {} in a string!");
}
}
function back_to_parsed_code;
endfunction
endclass
你能發表一個你解析的代碼的真實例子嗎? –
在您想要忽略的代碼塊內是否有字符串文字(可能包含'{'或'}')?這些代碼塊中是否有註釋(可能包括''''或'}')?你可以選擇Mike的建議,但在lexing期間丟棄這些代碼塊可能會更容易。在解析器中放棄它們意味着'{...}'中的所有內容都需要被標記。 –
@BartKiers是的,大括號內的內容可以被認爲是完全合法的C代碼,帶有自己的字符串,花括號等等,這使得詞法分析器很難做到。理想情況下,我甚至不希望對該代碼進行標記,但是Mike的建議確實使其在解析器中非常容易實現。關於如何在詞法分析器中完成的任何建議? – Stan