Я разбираю язык, на котором есть оператор 'code', за которым следует '{', за которым следует куча кода, который у меня нет интереса к синтаксическому разбору, а затем '}' , Я бы в идеале хотелось бы иметь правила, как:ANTLR4 правило синтаксического разбора для сопоставления открытых/закрытых скобок
skip_code: 'code' '{' ~['}']* '}'
..which бы просто пропустить вперед к закрывающей фигурной скобкой. Проблема в том, что пропущенный код сам может иметь пары фигурных скобок. Итак, что мне нужно сделать, это запустить счетчик и увеличить каждый «{» и декремент на каждом «}» и закончить правило разбора, когда счетчик вернулся к 0.
Каков наилучший способ сделать это в ANTLR4? Должен ли я перейти к пользовательской функции, когда «код» обнаружен и проглотил токены и запустил мой счетчик, или есть какой-то элегантный способ выразить это в самой грамматике?
EDIT: Некоторые примеры кода, в соответствии с просьбой:
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
Не могли бы вы представить реальный пример кода, который вы разбираете? –
Существуют ли строковые литералы (которые могут включать '{' или '}') внутри блока кода, который вы хотите игнорировать? Есть ли комментарии внутри этих блоков кода (которые могут включать '{' или '}')? Вы могли бы пойти на предложение Майка, но отбросить эти кодовые блоки во время лексинга может быть проще. Отбрасывание их в синтаксическом анализаторе означало бы, что все внутри '{...}' все равно нужно будет обозначить. –
@BartKiers Да, контент в фигурных скобках можно считать полностью законным кодом C, с его собственными строками, фигурными фигурными скобками и т. Д., Что делает его сложнее сделать в lexer. В идеале я не хочу даже маркировать этот код, но предложение Майка делает его очень простым для реализации в синтаксическом анализаторе.Любые предложения о том, как это можно сделать в лексере? – Stan