0

我正在尝试使用添加的语法对自定义 .c 文件进行简单的解析。

例如: 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-当然还有更多的案例尚未测试。

问题真的很明显。也解决了吗??我希望如此 !!</p>

谢谢。

4

1 回答 1

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')+ ;

解决方案非常简单。

于 2012-07-29T16:01:57.093 回答