最大35,000円進呈!IPoEはOCN光

C++を勉強中で、小さなソフトをいくつか作ったのですが、パーサという概念があることを知りました。

構文解析をするという点ではコンパイラと同じようなものに感じるのですが、パーサとコンパイラはどのように違うのでしょうか??

詳しい方いらっしゃいましたらご教示頂けると幸いです。

このQ&Aに関連する最新のQ&A

A 回答 (6件)

パーサはコンパイラの一部ですね。

Unix であれば yacc というプログラムでパーサの作成ができます。(最近は、bison とかいうらしいが、やはり yacc と呼ばなくては)

コンパイラの内部では、パーサの出力をコードジェネレータに渡します。自分でコンパイラを作れるようになれば、自然に理解できるようになるでしょう。
    • good
    • 0

parser(パーザー)が、近い発音だと思います。



パーザーは、コンパイラの一部です。

コンパイラは、おおまかにいって、

字句解析
構文解析
意味解析・式生成
式簡略化
コード生成
コード最適化
アセンブラソース出力

ですが、パーザーというのは、構文解析の部分のことです。
今日では、手書きでパーザーを書くということは、少なくなって、bisonなどで、文法記述をして、パーザーを生成させることが多いです。
    • good
    • 0
この回答へのお礼

回答くださった方々ありがとうございましたm(_ _)m
とても参考になりました。

お礼日時:2008/08/07 22:11

#4


構文解析の後の意味解析が抜けている。
プリプロセッサとかも抜けているけどまぁ大雑把なら抜けててもいいかな。
    • good
    • 0

非常に大雑把なコンパイラの動作:


1. レクサ (字句解析器) でソースを「トークン」という単位に分割する.
2. パーザ (構文解析器) でトークン列から「ソースファイルの構造」を組み立てる.
<ここまでがフロントエンドで以下はバックエンド>
3. ソースファイルの構造をもとに生成物であるオブジェクトファイルを作る.
3'. 必要に応じてオプティマイザで最適化.
だから, コンパイラの一部をとりだしたのがパーザ.
なお, yacc と bison は別物なので, bison を yacc と呼ぶのはよくないと思います>#2.
    • good
    • 0

パーサ(parser)とは構文解析器のことです。



例えば

printf("0123456789\n");

というコードがあった場合、 printf という関数に対して
"0123456789\n" という値(引数)を渡しているということを全体の
文法から分析・分解してコンパイラに渡します。
(簡単に大まかに説明していますが正確には微妙に異なります)

コンパイラが直接上記の事を行えるわけではないんです。
逆に言えばパーサを変えれば論理上は同じコンパイラでも文法を
変更することができるともいえます。

参考URL:http://ja.wikipedia.org/wiki/%E6%A7%8B%E6%96%87% …
    • good
    • 0

パーザ(パーサ)はコンパイラの一部。

    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qステップ数について

私の知人が会社面接にて「ソフトウェア関係の仕事がしたいです」と
言ったところ,会社側の人に「ステップ数はどれぐらいのプログラムを
書いたことがあるのか」とたずねられ,回答に困ってしまったそうです.
彼はC言語しかやったことがないそうで,ステップ数と聞けば繰り返し
何回ループさせたか,ということがステップ数だと思っていたそうなん
ですが(っというか私もそうなんですが...),会社の人の言ってる
ステップ数とはどうやら違う感じがしたらしく,「ステップ数とはなん
ですか」と聞いたところ,それで話しは終わってしまったそうです.
後から調べてみたところ,fortran ではステップ数という言葉が出て来る
ようなのですが,C言語ではあまりステップ数ということばを使わない
ので,会社の人の発言の意味が良く分かりません.
誰かご存知の方がいましたら,教えて頂けないでしょうか.

Aベストアンサー

こんちゃっsohですっ。

ソフトウェア関係の会社面接で「ステップ数」を聞かれた場合
「ソースコードの行数」
の意味になるんですが、これ、コメントは含まないんですよね。
実コード部のみのステップを測るソフトとかどっかにあるんですけどいまどきこんなん計測するやついねーよって
わしもい~っつも思いますわ。

C言語だから使わないとじゃなく、いまどき使わないが一番正確ですかね(失笑
でもちょっと古めの会社とか営業の人はステップで計るくらいしか思いつかないみたいなんですよねぇ
むかぁしは1000ステップでいくらって歩合制も敷いてた事もあったんですよ
だから
while() {
}
ってかかずに
while()
{
}
ってかいてみたりとか。
関数も
int hoe(int a,int b,int c)
じゃなくて

int hoe(
int a,
int b,
int c)

とか
ばっかばかしいよね。

Qテキストボックスに初期値を入れる

<form>

<input type= "text" name ="forward" value = "$a[0]">

</form>

$a[0]には整数が入っています。
上記テキストボックスに変数$a[0]の値を入れたいのですが上記プログラムではうまくいきませんでした。どうすればテキストボックスの初期値に&a[0]の中身が入るようになるのでしょうか?お願いいたします。

Aベストアンサー

value="<?=$a[0]?>"
としてみてください。

Q数値かどうかの判定方法

$aに代入されているものが数値かどうかを判定するにはどのようにしたらよいのでしょうか?

Aベストアンサー

$a =~ /^[0-9]*$/
上記の場合、*は「直前のパターンの0回以上の繰り返し」の意味なので、0から9がなくても、つまり$aが空でもマッチしてしまいます。
なので、
$a =~ /^[0-9]+$/
としましょう。
(+は「直前のパターンの1回以上の繰り返し」)
また、0-9は\dで表すこともできるので
$a =~ /^\d+$/
と書くこともできます。

Q「ミリ秒」これの時間の単位が解りません。

スライドショー等のソフトによく使われている
「ミリ秒」これの時間の単位が解りません。
例えば3000ミリ秒、5000ミリ秒とは、
いったい何秒の事なんですか。
出来れば計算方法教えて頂けますか。

Aベストアンサー

3000ミリでしたら小数点を左に3つ動かすと、ミリが消えて「秒」になります。
マイクロは左に6つ、
ナノは左に9つ、
キロは右に3つ、
メガは右に6つ、
ギガは右に9つということになります。

Q[ソフトウェア設計]処理の流れは、アクティビティ図?フローチャート?どちらで書くべきか。

VCですでに組まれているソフトの設計を設計書として文書にする作業をしています。
(現状あるソフト設計を別のソフトの設計に継承するため、このような作業が発生しました。すでに組まれているソフトには設計書がありませんので、参照はできません。)
この場合、ソースコードに記載されている処理の流れは、UMLのアクティビティ図で書けるのでしょうか?
参考書でアクティブ図を勉強しましたが、プログラムの処理の流れ(基本情報技術者試験の擬似言語で記載されているような処理)をそのまま書いたような図は見つかりませんでした。一般的には、プログラムの処理の流れは、アクティブティ図では、書かないのでしょうか?
そのような処理は、フローチャートで書くべきなのでしょうか?
シーケンス図も一緒に書いていますので、できたらUMLで統一し、アクティブティ図で書きたいのです。
設計書は、今まで記載していなかったので、ノウハウがありません。
知識がおありの方がおられましたら、ご教授お願いいたします。

Aベストアンサー

そのレベルの処理フローは、UML的にはシーケンス図で表現するものだとは思いますが、それはもう書かれているのですよね。

普通、アクティビティ図で書くのは、普通もう少し上流のフローかと。アクティビティ図でも書けなくはないと思いますが、書きにくいと思います。

あえてUMLで書くなら、コミュニケーション図(UML1.xだとコラボレーション図)が近いでしょうか。
でも、設計がオブジェクト指向的じゃないものをこれにまとめると、分かりにくいんですよね。

いずれにしろ、UMLはオブジェクトが単位にあるので、既存VCのアプリがオブジェクト設計としてダメダメだったりすると、UMLにすること自体がすごい大変かも。

# VC(特にMFC)のアプリはそういうところが目立たなかったりしてたので、似非オブジェクト指向なものも多いのが現実。
# UMLの図と対応できない/しにくいということは、大体はOO的に設計が汚いってことなんですけどね。


そういう場合は、割り切ってフローチャートもやむなしかも。(個人的には不要と思いますが)

そんなものの設計を継承すると、新規の部分もダメ設計になることは見えてるので、根本的に流用元として使うという構想自体が廃案になるのかもしれませんが。

あと、基本情報処理の擬似フローみたいな図って、多分書いてもあんまり意味ないですよ。
それみて分かるような人はソース見ても大体分かりますし、ソースにコメント追加したほうが早いかも…(苦笑
(ソース自体ではなく)設計を流用するということは、もっと大局的な/抽象的なフローが欲しいのでは?
シーケンス図(+ステートチャート図とか)で十分(にならないといけない)気がします。

そのレベルの処理フローは、UML的にはシーケンス図で表現するものだとは思いますが、それはもう書かれているのですよね。

普通、アクティビティ図で書くのは、普通もう少し上流のフローかと。アクティビティ図でも書けなくはないと思いますが、書きにくいと思います。

あえてUMLで書くなら、コミュニケーション図(UML1.xだとコラボレーション図)が近いでしょうか。
でも、設計がオブジェクト指向的じゃないものをこれにまとめると、分かりにくいんですよね。

いずれにしろ、UMLはオブジェクトが単位にあ...続きを読む

QDOSコマンドでのワイルドカードの使い方

コマンドプロンプトにて
下記のコードを作っているのですが
) else if not "%%i"=="--*" (
の部分で、「--」を含んだ場合は処理しないように
したくワイルドカードを設定してみたのですが
うまく判断されません。
ワイルドカードは使えないのでしょうか?

rem //グループ一覧取得
echo "">>"%LOGFILE%" 2>&1
echo "グループ一覧">>"%LOGFILE%" 2>&1
for /f "tokens=1" %%i in ('net localgroup') do (
if "%%i"=="コマンドは正常に終了しました。" (
echo "グループ一覧取得完了"
) else if not "%%i"=="--*" (
rem //ファイル出力処理
echo "%%i">>"%LOGFILE%" 2>&1
)
)

Aベストアンサー

if 文の文字列比較でワイルドカードは使えません。
発想をかえて、net localgroup コマンドの実行結果から"--"を含んだ行を取り除く方法に変えてはどうでしょうか? find /V "--" で "--"を除いた行が表示されます。

rem //グループ一覧取得
echo "">>"%LOGFILE%" 2>&1
echo "グループ一覧">>"%LOGFILE%" 2>&1
for /f "tokens=1" %%i in ('net localgroup^|find /v "--"') do (
if "%%i"=="コマンドは正常に終了しました。" (
echo "グループ一覧取得完了"
) else (
rem //ファイル出力処理
echo "%%i">>"%LOGFILE%" 2>&1
)
)

QMacターミナルで実行中のプログラムを中止するには?

Macのターミナルでプログラムを走らせているとき、
実行中のプログラムを一時停止したり中断・終了させるには
どうしたらいいでしょう?

Unixだと、Control+s とか Control +c とかでできますよね。
Macだと、それではできないみたいなんです。

基本的な質問ですみませんが、どなたか教えていただけないでしょうか。

Aベストアンサー

ごく普通にControl + Cで中断できますよ。

もしかしてControlキーをcommandやcapslockと押し間違えているとかいうことはありませんか?

QVBA 実行時エラー1004 rangeメソッドは失敗しました。globalオブジェクトのエラー

始めまして、VBA初心者のものです。
ただいまエクセルでグラフを作成しています。作業自体は単純作業の繰り返しなのでVBAを用いてやりたいのですが、マクロを実行したときに実行時エラー’1004’rangeメソッドは失敗しました。’_global’オブジェクトとメッセージが出て、実行できません。 デバックをすると以下の5行目で黄色のバーが出ていました。自分なりに原因を考えたのですがrangeの関係するところに、Range("A8:A1587,e8:e1587")というような変数を用いないやり方でやると上手くいくので、変数に関する定義がまずいと思うのですが、それ以上の事は分かりません。どなたか、分かる方がおりましたら、よろしくお願いします。また、プログラムは以下のようになります。

Sub 繰り返し()
'繰り返し
Dim s As Integer
For s = 0 To 17
Range("cells(8,1):cells(1580,1),cells(8,s+2):cells(1580,s+2)").Select
Range("cells(8,s+2)").Activate
Charts.Add
ActiveChart.ChartType = xlXYScatter
ActiveChart.SetSourceData Source:=Sheets("20081216_210647").Range( _
"cells(8,1):cells(1580,1),cells(8,s+2):cells(1580,s+2)"), PlotBy:=xlColumns
ActiveChart.SeriesCollection(1).Name = "=""0810p2x"""
ActiveChart.Location Where:=xlLocationAsNewSheet, Name:="0810p2x"
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "0810p2x"
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "t"
.Axes(xlValue, xlPrimary).HasTitle = False
End With
Next
End Sub

始めまして、VBA初心者のものです。
ただいまエクセルでグラフを作成しています。作業自体は単純作業の繰り返しなのでVBAを用いてやりたいのですが、マクロを実行したときに実行時エラー’1004’rangeメソッドは失敗しました。’_global’オブジェクトとメッセージが出て、実行できません。 デバックをすると以下の5行目で黄色のバーが出ていました。自分なりに原因を考えたのですがrangeの関係するところに、Range("A8:A1587,e8:e1587")というような変数を用いないやり方でやると上手くいくので、変数に関する定義...続きを読む

Aベストアンサー

>ご指摘を受けたところを書き換えて回してみた結果、書き換えた箇所
>でエラーがでます。(実行時エラー’1004’’cells’メソッドは失敗
>しました。’global’オブジェクト)
>しかし、何が原因でエラーになるか自分では分かりません。

≪例1≫
Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、RangeとかCellsの上位オブジェクトであるシート名が省略されています。
ActiveSheet.Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
マクロ実行時に、Activeな(Excelで表示されている)シートが上位オブジェクトとして、自動的に認識されます。

≪例2≫
Sheets("Sheet2").Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、Rangeのみシート名が記述されています。
Sheets("Sheet2").Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
Activeなシートが、Sheet2の場合はエラーになりません。
しかし、ActiveなシートがSheet2以外の場合、エラーが発生します。
直前に、
Sheets("Sheet1").Select
などとしていれば、ActiveシートがSheet1になっていますから、エラーになります。

Sheets("Sheet2").Range(Sheets("Sheet2").Cells(8, 1), Sheets("Sheet2").Cells(1587, 2)).Select
と書いておけば安心です。
Withステートメントを使えばスッキリ纏めることができます。
With Sheets("Sheet2")
  .Range(.Cells(8, 1), .Cells(1587, 2)).Select
End With

# Sheets("Sheet2")の上位オブジェクトが省略されていることにも気がついてください。

>そこで自分で基礎を勉強したいのですが推薦できる参考書などがござ
>いましたら、教えていただけませんか?
私自身は、入門書程度の雑誌を1冊買っただけです。どれが良いとかはよく分かりません。
「マクロの記録」を活用して、参考コードを取得し、汎用性のあるコードに編集しています。
新しい単語があれば、文字カーソルを単語の上に置き、F1キーを押してVBAのヘルプを必ず見るようにしています。
躓いた時は、Web検索して欲しい情報を得たり、あるいは、こうした掲示板で先輩方のお力をお借りしています。

Excel(エクセル)VBA入門:目次
http://oshiete1.goo.ne.jp/kotaeru_reply.php3?q=4651404
エクセル入門・初級編
http://www.kenzo30.com/excel_kiso.htm

>ご指摘を受けたところを書き換えて回してみた結果、書き換えた箇所
>でエラーがでます。(実行時エラー’1004’’cells’メソッドは失敗
>しました。’global’オブジェクト)
>しかし、何が原因でエラーになるか自分では分かりません。

≪例1≫
Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、RangeとかCellsの上位オブジェクトであるシート名が省略されています。
ActiveSheet.Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
マクロ実行時に、Activeな...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング