• ベストアンサー

BNF(バッカス・ナウア・記法)

BNFについてですが、 <expression> ::= <expression> + <term> | <term> <term> ::= <term> * <primary> | <primary> <primary> ::= (<exprssion>) | <identifier> <identifier> ::= a という、数式の定義があるとき、(((a))) という記号列は得ることが出来ますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Largo_sp
  • ベストアンサー率19% (105/538)
回答No.2

可能だと思いますよ... 順に追っていくと... <identifier> ::= a <primary> = <identifier> = a <expression> =<term> = <primary> =a で、元に戻って、 <primary> = (<exprssion>) = (a) となるので、これを3回繰り返すと、(((a)))になりますよね....

tiruda
質問者

お礼

ご親切にありがとうございます。<expression>から、aという終端記号まで置換できることがよく分かりました(^^)

その他の回答 (1)

  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

できます。 だけでは不親切なので、ヒントだけ。 一つの記号列がいろいろな非終端記号(と言ったかな)に 当てはまることがあります。 たとえば、「a」は <identifier>であり<primary>であり<term>であり <expression>です。

tiruda
質問者

お礼

ありがとうございましたm(__)m複数の非終端記号が1つの文字列にあてはまることを、忘れてました。

関連するQ&A

  • BNF(バッカス)記法について

    次のBNFで定義されるビット列Sであるものは、どれか。 <S>::=01|0<S>1 ア、000111 イ、010010 ウ、010101 エ、011111 正解:ア このように<変数>は、左辺と同じ変数を右辺で用いることが出来ます。 0<S>1を考えるには、まず<S>が使われていない「01」を代入します。 すると「0011」です。と記載されています。 自力で調べたのですが、 BNF(バッカス)記法で書かれた問題が読めません。 何故「01」を代入すると「0011」になるのでしょうか。 何故「ア」が正解になるのでしょうか。 お手数お掛けしますが、ご存知の方おられましたら、ご教授お願いします。 以上、よろしくお願い致します。

  • BNF記法について

    最近質問させていただいたものですが、また分からな いことがあり、質問させてください。 ある、アルゴリズムの問題集をやっていて、BNF記法に 従った数式を解析して計算するというものでした。 BNFの定義として、 式=項 | 式 加法演算子 項 項=因子| 項 乗法演算子 因子 因子=数 加法演算子='+'|'-' 乗法演算子='*'|'/' となっています。 そのテキストで、例として、 項=3*4/5 というのがありました。これは理解できました。しかし、 式=1+2+3*4/5-6 というのが理解できません。 式=式 加法演算子 項 と、項=項 乗法演算子  因子 というのを再帰的に当てはめていくのだと思うのです が、式として成立させるのは定義からして無理だと 思うのですが。1+2+3*4/5-6を式として解釈するには どのようにしたらよいかお教えください。よろしく お願いいたします。 ちなみに、1+2+3*4/5-6は、問題集に載っているアルゴリズムで問題なく解けました。  

  • 拡張BNFの解釈を教えて

    <P>::=<P><P>|'('<P>')'|'['<P>'}'|'<'<P>'>'|'a'|'b'|'c' に関して、<P>の表す記号列集合を{<P>}とし、記号列Wが{<P>}に属する事をw∈{<P>}と表す。次の内の何れが誤りですか。 1.'a'∈{<P>} 2.'(a)'∈{<P>} 3.'<a><b>'∈{<P>} 4.{<P>}に属する記号列の長さは奇数長のものもある。 5.{<P>}に属する記号列は左から読んでも右から読んでも同じである。

  • 拡張BNF記法について

    BNF記法で四則演算の表記がよくわからなかったのですが、 例えば、3+4を拡張BNF記法で表記する場合はどうしたらいいんでしょうか? '3','+','4'でいいのでしょうか? BNF記法は初めてやるので全然わからないんですよ・・・ ネットで探しても、わかりやすいのが見つからなくてこまってます>< 是非教えてほしいです。 あと、できれば(2+3)*4の表記も教えてもらえると助かります^^;

  • エクセルで特殊記号を普通の文字に認識させたい

    お世話になります。 A列にサイト名、B列にURLが入っています。 C列に次のような文字列が出るように式を入れたいのですが、 エラーでうまくいきません。 <ahref="(Bの文字列)"target="_blank">(Aの文字列)</a> <"などの特殊記号を数式ととらえているようです。 C列にどのような数式を入れれば改善されるでしょうか?

  • バッカス-ナウア記法について

    授業で習ったのですが詳しく説明してもらえずよく理解できませんでした。 BN記法の形、具体例教えてほしいです。 よろしくお願いします。

  • Evaluate()に文字列の形式の数式を渡すには

    VB.NETでEvaluate()関数を使って、プログラム実行中に決まる数式を評価させたいのですが、下記の(A)のように数式を" "で囲まない形で渡せば正しく評価されるのですが、(B)のように数式が文字列の形になっていると、このまま、文字列を渡してもうまくいきません。(B)のような形になってしまっている数式をEvaluate()関数で評価させるためには、(B)から(A)の形に持っていきたいのですが、どのようにすればよいのかがよく分かりません。 数式の構造自体がプログラムの実行中に文字列の形で処理させて生成されるのですが、このように文字列の形になっている数式を、Evaluate()関数で評価させるためには、どのようにすればよいのでしょうか。 ---------------------------------------- Imports Microsoft.Office.Interop Module Module1  Sub Main()   Dim xlApp As New Excel.Application   Dim i1 As Integer   Dim i2 As Integer   Dim term_i As String   Dim ans_i As Integer   i1 = 2   i2 = 3   term_i = i1 + i2 + 5 ' (A)   term_i = "i1 + i2 + 5" ' (B)   ans_i = xlApp.Evaluate(term_i)   MsgBox(ans_i)  End Sub End Module ---------------------------------------- よろしくお願いします。(WindowsXP,VB2010)

  • 構文図についての問題です。

    全然分からなく困っています。どうか解答、解説をよろしくお願いします。問題は、以下です。 以下のプログラムは、整数の数式を入力して、式の値を求めて表示するプログラムである。このプログラムが対象とする数式の構文を、BNFか構文図で書け。 #include <stdio.h> #include <stdlib.h> #include <ctype.h> static int ch; void error(char *s) { fprintf(stderr, "%s\n", s); exit(EXIT_FAILURE); } void nextch() { do { if ((ch = getchar()) == EOF) return; }while (ch == ' ' || ch == '\t'); } double number() { double x, a; int sign = '+'; if (ch == '+' || ch == '-') { sign = ch; nextch(); } if (! isdigit(ch)) error("Not a number or '(' is required."); x = ch - '0'; nextch(); while (isdigit(ch)) { x = 10 * x + ch - '0'; nextch(); } if (ch == '.') { a = 1; nextch(); while (isdigit(ch)) { x += (a /= 10) * (ch - '0'); nextch(); } } return sign == '-' ? -x : x; } double expression(); double factor() { double x; if (ch != '(') return number(); nextch(); x = expression(); if (ch != ')') error("')' is required,"); nextch(); return x; } double term() { double x, y; x = factor(); while (1) { if (ch == '*') { nextch(); x *= factor(); } else if (ch == '/') { nextch(); y = factor(); if (y == 0) error("Zero division"); x /= y; } else break; } return x; } double expression() { double x; x = term(); while (1) { if (ch == '+') { nextch(); x += term(); } else if (ch == '-') { nextch(); x -= term(); } else break; } return x; } int main() { double x; nextch(); x = expression(); if (ch != '\n') error("Syntax error"); printf("%g\n", x); return EXIT_SUCCESS; }

  • 文字の合致で合計個数を表示

    A列文字とB列文字を連ねた文字がC列の文字に合致した場合、その個数合計をD列に示したいのですがその際、A列記号の数字は無視するものとします。 どなたかD列セル数式入力が解る方宜しくお願いします。

  • Excel 条件付き書式◆ 同じ行の特定のセルを指定するには

    A列には、ずらーっと、日付の数値が入っています。 B列には、「その日の行動スケジュール」の文字列が入っています。 ”今日”になったら、その日付に該当するB列の「行動スケジュール」だけ文字の色を変えたいと思いました。 このとき、列全体を範囲指定して、「条件付き書式」を設定しようと思ったのですが、数式の書き方がわかりません。 まず、B列のBのところをクリックして列全体を指定した上で、「条件付き書式」の設定のダイアログを出し、「数式が」を選択すればいいだろうというところまではわかります。 しかし、数式において、どのように記述すると、”B列の特定のセルと同じ行にあるA列のセル”だけを選択できるようになるのかがかわかりません。 おそらく、下の●のところに、同じ行にあるA列のセルだけを指定するための記号が入ると思うのですが、手本がどこにも見つかりません。 =●●=today()

専門家に質問してみよう