6.1 Input File Grammar

文法は 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 つあります:

commenteval-escapec-escape 内の text には改行を含めることはできません。 Ide​​nt は、 C 言語識別子の通常の規則に準拠する必要があります(そうしないと、 Vmgen 出力で C 言語のコンパイラーが詰まり(choke)ます)。 Ide​​nt は、 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 にあります。