我正在解析一种语言,该语言的语句为“ code”,后跟“ {”,后跟一堆我对解析不感兴趣的代码,后跟“}”。理想情况下,我希望规则如下:
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
Run Code Online (Sandbox Code Playgroud)
我会用类似的东西:
skip_code: CODE_SYM block;
block: OPEN_CURLY (~CLOSE_CURLY | block)* CLOSE_CURLY;
CODE_SYM: 'code';
OPEN_CURLY: '{';
CLOSE_CURLY: '}';
Run Code Online (Sandbox Code Playgroud)