LBNFでC/C++関数の宣言に次のような形式(略称)を指定しようとしています(<sym>
はoptionallity、[rule]もっとリスト):LBNF、C関数宣言/定義、reduce reduce conflict
type ident ([type <id>]);
関数定義は次の形式を持っているが:
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 "," ;
:
type ident ([type id]) { [stmt] }
現在、私は次のLBNFを持っています10
予想どおりの縮小/縮小の競合が発生します。 パーサー/レクサーでこれを解決する方法はありますか?
私は、次の文法でそれを解決することができます:どのように...
を
FnDef. TopDef ::= Type Ident "(" [Arg] ")" Block ;
FnDecl. TopDef ::= Type Ident "(" [Arg] ")" ";" ;
separator nonempty TopDef "" ;
Arg. Arg ::= Type Ident;
Arg. Arg ::= Type;
separator Arg "," ;
そして定義は各引数の識別子を持っているが、これはあまり満足のいく感じに機能型チェッカーでチェックこれは通常Cのような言語で扱われますか?
CまたはC++。 C++にはC言語では存在しないデコレータがあります。 – NathanOliver
@NathanOliverでは、CやC++ではない虚偽のはるかに単純な言語を考えてみましょう。私の質問は、上記の2つの形式とそれらの違いです。 – Centril
'('と ')'は入力記号であることを明確に意図しているので、あなたはオプションのために '<...>'を使用していると思っています....ああ、あなたは気づかなかったが、 ''はマークダウンがそれを削除するHTMLマークアップに似ています。 –
rici