質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1944閲覧

Lemon Parserでヒアドキュメントを表現するには?

sounisi5011

総合スコア697

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2015/06/05 02:31

編集2015/06/05 02:33

Lemon Parserの.yファイルで、ヒアドキュメント構文を表現するための記述はどのように書けばいいのでしょうか?

PHP_ParserGeneratorを使用し、「PHPを解析する」構文解析器を作成したいと考えています。

PHP_ParserGeneratorはLemon ParserをPHPに移植したものなので、Lemon Parserに順序した.yファイルを作成することで構文解析器を生成します。
.yファイルの記述については、以下に記載されています。
The Lemon Parser Generator (日本語版)

上記ドキュメントを読む限り、何とかなりそうな気がしてきました。
が、ヒアドキュメント構文は例外です。私には、どのように記述すればよいものか分かりません。

参考までに、以下がヒアドキュメント構文になります。

lang

1$str = <<<EOD 2Example of string 3spanning multiple lines 4using heredoc syntax. 5EOD; 6 7$str = <<<HTML 8<div>example</div> 9HTML;

<<<に続き、英数字及びアンダースコアで構成される任意のID、改行でヒアドキュメントが開始します。
その後にある、開始行と同じ値の任意のIDと;のみが存在する行が文字列の終わりで、開始行からその行までの間にある文字列が変数に格納されます。

ヒアドキュメント構文が.yファイルで表現できそうにない最大の理由は、任意の文字列から任意の文字列まで、という指定が困難であることです。
実際に記述する場合、ヒアドキュメント構文の任意のIDをトークン1つとして表現することになると考えていますが、
私がドキュメントを読んだ限り、あるトークンと同じ値のトークンを参照するような構文が見当たりません。
そもそも、トークンに記号などの値を割り当てるのは字句解析器の役割であって、構文解析器そのものはトークンの内容は解釈しないものと思います。
つまり、Lemon Parserではヒアドキュメント構文を記述するのは不可能、となってしまいます。

私には、Lemon Parserでヒアドキュメント構文を表現するにはどうすればよいのかまるで分かりません。
Lemon Parserの.yファイルで、ヒアドキュメント構文を表現するための記述はどのように書けばいいのでしょうか?

なお、「PHPを解析する」構文解析器としてnikic/PHP-Parserが存在しますが、PHP以外の構文も含められる柔軟な形式のファイルを構文解析する事が最終目的のため、自作する必要があります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

この分野に詳しいわけでもなければ Lemon Parser を使ったこともありませんが。。。

言語のパーサーは以下の2つのフェーズで成り立ちます。

  1. 字句解析器で入力文字列をトークン列に分割する
  2. 構文解析器でトークン列を構文解析する

「任意の文字列から任意の文字列まで」は、普通は字句解析のフェーズで行うだろうと思います。

PHP のソースでもヒアドキュメントは字句解析の時点で解析されています(ぶっちゃけ何やっているかよくわかっていませんが、たぶんそんな感じです)。

例えば以下のような入力であれば、

lang

1$str = <<<HTML 2<div>example</div> 3HTML;

字句解析の段階で以下のようなトークン列に分割します。

  • 変数 $str
  • 代入演算子 =
  • ヒアドキュメントの開始 <<<HTML
  • ヒアドキュメントの中身 <div>example</div>
  • ヒアドキュメントの終了 HTML;

質問の内容から、字句解析器と構文解析器をバラバラに使うものであると理解されているような印象を受けましたが、前述のように別々の役割があって一緒に使うものです。なので、構文解析器だけで言語パーサを作ることはできません。

(その辺りのことを理解された上での質問なのであればすみません)

投稿2015/06/05 14:29

ngyuki

総合スコア4514

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sounisi5011

2015/06/06 05:00

質問を書いている段階で何となくそのような予感はしていましたが、やはりそうですか。認識を誤っていたようです。 ヒアドキュメントの解析は字句解析の段階で行うものですよね。 --- 字句解析器としてはPHP_LexerGeneratorがあるのですが、これはPCRE正規表現を指定できるので、後方参照でヒアドキュメントに一致するような正規表現を記述できます。 PHP_LexerGeneratorなら、ヒアドキュメントを表現できそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問