gpt4 book ai didi

c++ - Bison 获取 C 函数指针作为函数调用?

转载 作者:搜寻专家 更新时间:2023-10-31 01:54:08 25 4
gpt4 key购买 nike

如果先行标记是给定值,是否有一种方法可以指定 Bison 规则不应匹配?

我目前有以下 Bison 语法(简体):

var_decl:
type ident
{
$$ = new NVariableDeclaration(*$1, *$2);
} |
type ident ASSIGN_EQUAL expr
{
$$ = new NVariableDeclaration(*$1, *$2, $4);
} |
type CURVED_OPEN STAR ident CURVED_CLOSE CURVED_OPEN func_decl_args CURVED_CLOSE
{
$$ = new NVariableDeclaration(*(new NFunctionPointerType(*$1, *$7)) /* TODO: free this memory */, *$4);
} |
type CURVED_OPEN STAR ident CURVED_CLOSE CURVED_OPEN func_decl_args CURVED_CLOSE ASSIGN_EQUAL expr
{
$$ = new NVariableDeclaration(*(new NFunctionPointerType(*$1, *$7)) /* TODO: free this memory */, *$4, $10);
} ;

...

deref:
STAR ident
{
$$ = new NDereferenceOperator(*$<ident>2);
} |

...

type:
ident
{
$$ = new NType($<type>1->name, 0, false);
delete $1;
} |
... ;

...

expr:
deref
{
$$ = $1;
} |
...
ident
{
$<ident>$ = $1;
} |
...
ident CURVED_OPEN call_args CURVED_CLOSE
{
$$ = new NMethodCall(*$1, *$3);
delete $3;
} |
...
CURVED_OPEN expr CURVED_CLOSE
{
$$ = $2;
} ;

...

call_args:
/* empty */
{
$$ = new ExpressionList();
} |
expr
{
$$ = new ExpressionList();
$$->push_back($1);
} |
call_args COMMA expr
{
$1->push_back($3);
} ;

问题是解析的时候:

void (*ident)(char* some_arg);

它看到 void (*ident) 并推断它必须是函数调用而不是函数声明。 有什么方法可以告诉 Bison 它应该支持向前看以匹配 var_decl,而不是将 *ident 和 void 减少为 deref 和 exprs?

最佳答案

any identifier can be a type

这正是问题所在。类 C 语言(或具有类 C 语法的类型的语言)的 LALR(1) 语法需要在标记级别区分类型和其他标识符。也就是说,您需要 IDENT 和 TYPEIDENT 是两个不同的标记。 (您必须将有关标识符的数据从编译器反馈给分词器)。这是消除歧义语法的最标准方法。

更新 参见,例如,this ANSI C grammar for Yacc .

关于c++ - Bison 获取 C 函数指针作为函数调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10132158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com