文法は EBNF 形式で、 a|b
は「a または b」、
{c}
は c の 0 回以上の繰り返しを意味し、 [d]
は d の
0 回または 1 回の繰り返しを意味します。
Vmgen の入力は自由書式ではないため、 改行(および場合によっては空白)をどこに入れるかに注意する必要があります。
description: {instruction|comment|eval-escape|c-escape} instruction: simple-inst|superinst simple-inst: ident '(' stack-effect ')' newline c-code newline newline stack-effect: {ident} '--' {ident} super-inst: ident '=' ident {ident} comment: '\ ' text newline eval-escape: '\E ' text newline c-escape: '\C ' text newline
注意: この文法の \
は、 印刷不可能な文字の C 言語スタイルのエンコーディングではなく、
文字通りの意味であることに注意してください。
simple-inst
で C 言語コードを区切る(delimit)方法は 2 つあります:
comment
と eval-escape
と c-escape
内の text
には改行を含めることはできません。 Ident
は、 C 言語識別子の通常の規則に準拠する必要があります(そうしないと、 Vmgen
出力で C 言語のコンパイラーが詰まり(choke)ます)。 Ident
は、 stack-effect
の ident
にスタック・プレフィックス(スタック・プレフィックス構文については see Eval escapes 参照)が付いている場合がある点を除き、 C
言語識別子の通常の規則に準拠する必要があります。
c-escape
は text を各出力ファイルに渡します(‘\C’ 無しで)。
これは主に条件付きコンパイルに役立ちます(つまり、 ‘\C #if ...’ などを記述します)。
文法で指定された構文に加えて、 Vmgen は ‘m4 -s’ (see Invoking m4 in GNU m4)や、 同様のツールによって生成された同期行(sync lines)(‘#line’ で始まる行)も処理します。 これにより、 C 言語コンパイラーのエラー・メッセージを C 言語コードの元のソースに関連付けることができます。
Vmgen は、 ここで説明した文法を超えたいくつかの拡張機能を理解しますが、 これらの拡張機能は Gforth を構築する場合にのみ役立ちます。 Gforth に使用される書式の説明は prim にあります。