7

この BNF を EBNF に変換するにはどうすればよいですか?

<vardec> ::= var <vardeclist>;
<vardeclist> ::= <varandtype> {;<varandtype>}
<varandtype> ::= <ident> {,<ident>} : <typespec>
<ident> ::= <letter> {<idchar>}
<idchar> ::= <letter> | <digit> | _
4

2 に答える 2

12

EBNF ( Extended Backus-Naur Form ) はISO 14977:1996であり、ISO から無料で PDF 形式で入手できます*。コンピュータ言語標準では広く使用されていません。それを説明する論文もあり、その論文にはEBNF表記を要約したこの表が含まれています。

         Table 1: Extended BNF
Extended BNF    Operator  Meaning
-------------------------------------------------------------
unquoted words            Non-terminal symbol
" ... "                   Terminal symbol
' ... '                   Terminal symbol
( ... )                   Brackets
[ ... ]                   Optional symbols
{ ... }                   Symbols repeated zero or more times
{ ... }-                  Symbols repeated one or more times†
=               in        Defining symbol
;               post      Rule terminator
|               in        Alternative
,               in        Concatenation
-               in        Except
*               in        Occurrences of
(* ... *)                 Comment
? ... ?                   Special sequence

演算子は、*先行する (符号なし) 整数と共に使用されます。可変数の繰り返しを許可していないようです。たとえば、最初の文字の後に1〜15文字を追加して、最大16文字の長さの識別子を作成します。このリス

標準では、開き括弧(開始グループ記号、閉じ括弧を終了グループ記号)と呼びます。開き角括弧は開始オプション記号で、閉じ角括弧は終了オプション記号です。開き括弧は繰り返し記号の開始であり、閉じ括弧は繰り返し記号の終了です。単一引用符は最初の引用符記号と呼ばれ、二重引用符は2 つ目の引用符記号と呼ばれます。[{}'"

* はい、無料ですが、必要に応じて 74 スイス フランを支払うこともできます。有料アイテムが入っているボックスの下のメモを見てください。


質問は、この「BNF」を EBNF に変換しようとしています。

<vardec> ::= var <vardeclist>;
<vardeclist> ::= <varandtype> {;<varandtype>}
<varandtype> ::= <ident> {,<ident>} : <typespec>
<ident> ::= <letter> {<idchar>}
<idchar> ::= <letter> | <digit> | _

BNF は正式に定義されていないため、その意味を (簡単に) 推測する必要があります。変換は日常的です (BNF が正式に定義されている場合、機械的なものになる可能性があります)。

vardec     = 'var', vardeclist, ';';
vardeclist = varandtype, { ';', varandtype };
varandtype = ident, { ',', ident }, ':', typespec;
ident      = letter, { idchar };
idchar     = letter | digit | '_';

山かっこは、非終端記号を囲むように削除する必要があります。定義記号::=は に置き換えられ=ます。;やなどの端子_は引用符で囲みます。,連結は明示的に;でマークされています。各ルールは で終了し;ます。元のグループ化と代替操作は、たまたま標準表記と一致します。コンマによる明示的な連結は、複数単語の非終端記号が明確であることを意味することに注意してください。


†</sup> 標準自体をざっと調べてみると、この{...}-表記法は標準の一部ではなく、論文の一部であることがわかります。ただし、jmmutがコメントで指摘しているように、標準では次の意味が定義されています{…}-

§5.8 構文用語

…</p>

syntactic-term が syntactic-factor であり、その後に except-symbol が続き、その後に syntactic-exception が続く場合、両方の条件を満たすシンボルの任意のシーケンスを表します。

a) それはsyntactic-factorによって表される一連のシンボルであり、

b) 構文例外によって表されるシンボルのシーケンスではありません。

…</p>

注 -{ "A" } -は、空の構文例外を持つ構文用語であるため、1 つまたは複数の A のシーケンスを表します。

于 2013-02-17T15:43:29.843 に答える
2

山かっこを削除し、すべての端子を引用符で囲みます。

vardec ::= "var" vardeclist;
vardeclist ::= varandtype { ";" varandtype }
varandtype ::= ident { "," ident } ":" typespec
ident ::= letter { idchar }
idchar ::= letter | digit | "_"
于 2013-02-17T14:46:54.070 に答える