パーサの例とは? わかりやすく解説

パーサの例

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/06/03 01:09 UTC 版)

再帰下降構文解析」の記事における「パーサの例」の解説

以下の文法LL(1)形式EBNFの例である(ニクラウス・ヴィルトPL/0言語)。単純化のため、identnumber終端記号とされている: program = block "." . block = ["const" ident "=" number {"," ident "=" number} ";"] ["var" ident {"," ident} ";"] {"procedure" ident ";" block ";"} statement . statement = [ident ":=" expression | "call" ident | "begin" statement {";" statement} "end" | "if" condition "then" statement | "while" condition "do" statement ] . condition = "odd" expression | expression ("="|"#"|"<"|"<="|">"|">=") expression . expression = ["+"|"-"] term {("+"|"-") term} . term = factor {("*"|"/") factor} . factor = ident | number | "(" expression ")" . 終端記号引用符囲まれている(identnumber以外)。各非終端記号文法規則定義されている。 以下に示す予言的パーサ上記文法正確に反映している点に注意されたい。各非終端記号対応したプロシージャ存在している。構文解析トップダウン的に行われ、全非終端記号処理されるまで行われる入力コードプログラム部分)の先頭単語大域変数 sym格納されている。そして大域関数 getsym を使うことで sym更新するtypedef enum {ident, number, lparen, rparen, times, slash, plus, minus, eql, neq, lss, leq, gtr, geq, callsym, beginsym, semicolon, endsym, ifsym, whilesym, becomes, thensym, dosym, constsym, comma, varsym, procsym, period, oddsym} Symbol;Symbol sym;void getsym(void);void error(const char msg[]);void expression(void);int accept(Symbol s) { if (sym == s) { getsym(); return 1; } return 0;}int expect(Symbol s) { if (accept(s)) return 1; error("expect: unexpected symbol"); return 0;}void factor(void) { if (accept(ident)) { ; } else if (accept(number)) { ; } else if (accept(lparen)) { expression(); expect(rparen); } else { error("factor: syntax error"); getsym(); }}void term(void) { factor(); while (sym == times || sym == slash) { getsym(); factor(); }}void expression(void) { if (sym == plus || sym == minus) getsym(); term(); while (sym == plus || sym == minus) { getsym(); term(); }}void condition(void) { if (accept(oddsym)) { expression(); } else { expression(); if (sym == eql || sym == neq || sym == lss || sym == leq || sym == gtr || sym == geq) { getsym(); expression(); } else { error("condition: invalid operator"); getsym(); } }}void statement(void) { if (accept(ident)) { expect(becomes); expression(); } else if (accept(callsym)) { expect(ident); } else if (accept(beginsym)) { do { statement(); } while (accept(semicolon)); expect(endsym); } else if (accept(ifsym)) { condition(); expect(thensym); statement(); } else if (accept(whilesym)) { condition(); expect(dosym); statement(); }}void block(void) { if (accept(constsym)) { do { expect(ident); expect(eql); expect(number); } while (accept(comma)); expect(semicolon); } if (accept(varsym)) { do { expect(ident); } while (accept(comma)); expect(semicolon); } while (accept(procsym)) { expect(ident); expect(semicolon); block(); expect(semicolon); } statement();}void program(void) { getsym(); block(); expect(period);}

※この「パーサの例」の解説は、「再帰下降構文解析」の解説の一部です。
「パーサの例」を含む「再帰下降構文解析」の記事については、「再帰下降構文解析」の概要を参照ください。

ウィキペディア小見出し辞書の「パーサの例」の項目はプログラムで機械的に意味や本文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。 お問い合わせ



英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「パーサの例」の関連用語

パーサの例のお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



パーサの例のページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
Text is available under GNU Free Documentation License (GFDL).
Weblio辞書に掲載されている「ウィキペディア小見出し辞書」の記事は、Wikipediaの再帰下降構文解析 (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。

©2024 GRAS Group, Inc.RSS