我试图在 LBNF 中表示 C/C++ 函数声明具有以下(近似)形式(<sym>表示可选性,并且 [rule] 是一个零个或多个列表):
type ident ( [type <id>] );
虽然函数定义具有以下形式:
type ident ( [type id] ) { [stmt] }
目前,我有以下 LBNF:
entrypoints Program ;
Program. Program ::= [TopDef] ;
FnDef. TopDef ::= Type Ident "(" [Arg] ")" Block ;
FnDecl. TopDef ::= Type Ident "(" [Par] ")" ";" ;
separator nonempty TopDef "" ;
Param. Par ::= Type ;
NParam. Par ::= Type Ident ;
separator Par "," ;
Arg. Arg ::= Type Ident;
separator Arg "," ;
-- Types ---------------------------------------------------
Int. Type ::= "int" ;
--- more types...
separator Type "," ;
这会导致按预期减少/减少冲突。有没有办法在解析器/词法分析器中解决这个问题?
我可以用以下语法解决它:
FnDef. TopDef ::= Type Ident "(" [Arg] ")" Block ;
FnDecl. TopDef ::= Type Ident "(" [Arg] ")" ";" ;
separator nonempty TopDef "" ;
Arg. Arg ::= Type Ident;
Arg. Arg ::= Type;
separator Arg "," ;
然后在类型检查器中检查函数定义是否具有每个参数的标识符,但这感觉不太令人满意......
这通常在像 C 这样的语言中是如何处理的?