タグ

yaccに関するiwwのブックマーク (5)

  • PHP_LexerGeneratorとPHP_ParserGeneratorを利用して PHPで独自の言語を実装する方法

    はじめに 計算機用言語の処理には決まった方法があります。文字列で与えられた言語は、字句解析によってトークンに分けられ、構文解析によってトークン同士が結びつけられ、意味解析によって解釈されます。 字句解析を行うプログラムが字句解析器(lexer)、構文解析と意味解析を行うのが構文解析器(parser)です。字句解析器としてはlexあるいはflex、構文解析器としてはyaccあるいはbisonが有名で、資料も豊富にありますが、いずれもC言語で利用することを想定したソフトウェアです。 PHPで利用できる字句解析器としてはPHP_LexerGeneratorが、構文解析器としてはPHP_ParserGeneratorがあります。稿では、簡易電卓を実装するという例を通じてPHP_LexerGeneratorとPHP_ParserGeneratorの使い方を紹介します。 必要な環境 XAMPP fo

    PHP_LexerGeneratorとPHP_ParserGeneratorを利用して PHPで独自の言語を実装する方法
  • SQL::Statement - SQL解析および処理エンジン

    SQL::Statementモジュール(日語チョー訳) by Hippo2000(2001/5/15) SQL::Statementなのです。DBD::File、DBD::CSVのエンジンなのです。DBIと組み合わせて簡単になんちゃってRDBを作ることができます。(DBD::Excelもその例(^^)) 原の著作権はJochen Wiedmannさんがお持ちです。Jochen Wiedmann さんにはメールで了解をいただきました。 なお内容等が間違っていたら修正します。ご連絡ください。 目次 名前 概要 説明 parserオブジェクトの作成 問い合わせの解析 問い合わせ情報の抽出 WHERE節の評価 問い合わせの評価 SQL文法 CREATE DROP INSERT DELETE UPDATE SELECT インストール 内部実装 Perl に依存しないC部分 Perl

    iww
    iww 2011/11/30
  • ◇BNFは間違っている:繰り返しを再帰で表すべきではない - 万象酔歩

    構文を規定するのにBNF表記を用いることは良くあります。 しかし良く知られているようにBNFには繰り返しが表現できないという 根的で致命的な欠点があります。 このため、リスト構造は再帰で誤魔化されてBNF化されます。 これは一般的に行われていますが、来の文法モデルとは異なった ものとなります。 リストモデルとBNF表記 例えば名前をカンマでつないだ構文があるとします。 A,B,C,D これは想定する構文モデルでの構文木はつぎのように考えられます。 name_list name=A , name=B , name=C , name=D この構文をごく一般的に使われるBNFで表すと name_list ::= name | namelist "," name という形となります。 一見これで構文構造を表せるように思えます。しかし、このBNFに則った 形で構文解析を行うと、構文木は次のように

    ◇BNFは間違っている:繰り返しを再帰で表すべきではない - 万象酔歩
  • http://www.contrib.andrew.cmu.edu/~shadow/sql/sql2bnf.aug92.txt

    This file contains a depth-first tree traversal of the BNF for the language done at about 27-AUG-1992 11:03:41.64. The specific version of the BNF included here is: ANSI-only, SQL2-only. ::= | ::= | | ::= | ::= A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z ::= a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t |

    iww
    iww 2011/11/30
  • 第9章 速習yacc

    概要 パーサとスキャナ プログラム言語のパーサの書きかたは昔からしつこく研究されてきており、 かなりしっかりした定石がある。よほど変な(または曖昧な)文法でない 限り、定石にのっていけば解決できるものだ。 まず最底辺には文字列を単語(トークンとも言う)の列に切り出す部 分がある。これをスキャナ(scanner)とかレクサ(lexer)と言 う。日語で言うと字句解析器だが、言いにくいのでスキャナと呼ぼう。 スキャナというものが出てくる根底にはそもそも「単語の区切りには空白ある でしょ」という常識がある。そして実際にたいていのプログラミング 言語はそういう仕様になっている。そのほうが楽だからだ。 例えば古いFortranでは空白が意味を持たなかった。つまり空白を入れても 単語区切りとは限らないし、変数の途中で何の前触れもなく空白を挿入したり することもできた。ところが解析が恐ろしく面倒なもの

  • 1