我正在尝试使用添加的语法对自定义.c文件进行简单解析。
Ex:test.c
// I don’t need this in output
int func1(int a, int b);
//I need this.
@parseme int func2(int a, int b);
//and this …
@parseme
void func3()
{
Int a;
//put here where ever
…
{
//inside block
}
return;
}
我想在词法分析器阶段使用模糊解析方法,然后在解析器规则上用TokenRewriteStream和模板重写令牌。
嗯,这是一个词法分析器......
lexer grammar Lexi;
options {filter = true;}
// Pick everything between @parseme and ';' or '{ }'
METHOD
: HEADER .* (';' | BODY )
;
fragment
HEADER
: '@' ('parseme' | 'PARSEME') ;
fragment
BODY: '{' .* '}' ;
.
... 专家看来问题很简单: 1- Lexer在找到';'之前停止解析,然后到达@parseme void func3()的最后'}'。 “ 当在块右边卷曲时发现2- Lexer停止解析。 3-当然还有更多的病例尚未进行测试。
问题非常明显。解决方案也是?我希望如此 !!
感谢。
答案 0 :(得分:1)
回答我自己。
lexer grammar Lexi;
options {filter = true;}
// Pick everything between @parseme and ';' or '{}'
METHOD
: METHOD_HEADER (~'{')* METHOD_END ;
fragment
METHOD_HEADER
: '@' ('parseme' | 'PARSEME') ;
fragment
METHOD_END
: (';' | BLOCK ) ;
fragment
BLOCK
: '{' ( ~('{' | '}') | BLOCK )* '}' ;
WS : (' '|'\r'|'\t'|'\n')+ ;
解决方案非常简单。