• 検索結果がありません。

コンビネータパーサによる構文解析器における言語指向のエラー報告

N/A
N/A
Protected

Academic year: 2021

シェア "コンビネータパーサによる構文解析器における言語指向のエラー報告"

Copied!
1
0
0

読み込み中.... (全文を見る)

全文

(1)

愛知県立大学情報科学部 平成29年度 卒業論文要旨

コンビネータパーサによる構文解析器における言語指向のエラー報告

情報科学科 伊東 忠彦 指導教員:大久保 弘崇

1

はじめに

言語処理系の実装者はその構文を解析するパーサを作成する.

このとき,

Yacc[1]

や

Parsec[2]

といったパーサ作成支援系を利 用することが一般的である.パーサは,構文誤りのために受理 できない入力が与えられたとき構文エラーを報告する.パーサ 作成支援系が提供するエラー報告機能は,解析の継続が不可能 になった位置,受理できなかったトークン,期待した入力などか らなる.このエラー報告の内容そのものはパーサにバグがない 限り正しいが,言語処理系の利用者に提示するものとしては十 分でない場合がある.

パーサ作成支援系は与えられた構文規則の粒度で動作しエ ラー報告を行う.一方利用者は対象言語の構造の粒度で思考す る.この粒度の違いが適切でないエラー報告につながる.利用 者は構文誤りを修正する必要があり,エラー報告はその助けと なる情報を持つべきである.そのような視点でのエラー報告を 本研究では「言語指向」と呼ぶ.

言語指向のエラー報告を行うパーサを作成するためには,パー サの作成者が適切な情報を構文に注釈付けしたり,構文エラー 時の異常系処理を丁寧に実装する必要がある.また,パーサ作 成支援系もその作業を支援するべきである.

本論文ではパーサコンビネータライブラリの

Parsec

に焦点を あて,ライブラリが提供するエラーコンビネータを利用した場 合の,エラー報告の改善の方法を検証する.

2 Parsec

Parsec

は,

Haskell

で記述されたパーサコンビネータライブ ラリである.小さなパーサを

Haskell

の関数として作成し,それ らをコンビネータで組み合わせて複雑な構文を受理するパーサ を構築する.

Parsec

の マ ニ ュ ア ル に は ,エ ラ ー 報 告 を す る 際 に は

<?>

,

unexpected

,

fail

という

3

種類のコンビネータを用いるよ

う記述されている.その中の

unexpected

コンビネータは以下 のような型であり,検出された時点で解析を失敗させ,エラー メッセージを引数にとった文字列に置き換えることができる.

String -> GenParser tok st a

3

実験

Parsec

を用いて,エラー処理を行わず純粋に構文を受理す

るだけのパーサ

(

素のパーサと呼ぶ

)

を作成し,このパーサに

unexpected

コンビネータを用いて言語指向のエラー報告をさ

せる動作を追加し,結果を分析する.対象言語には

picoC[3]

を 選択した.これは,本学の情報科学応用実験におけるコンパイ ラ作成実験で対象としている

C

言語のサブセットである.

3.1

言語指向でないエラー報告

素の

picoC

パーサは,予期しないトークンを検出するとその

時点で構文解析を中止し,中止の原因となったトークンと予期 していたトークンを報告する.これは

Parsec

が提供するパーサ 視点のエラー報告機能である.

リスト

1

式文を解析するパーサ部分

1 do{

e

<−

exprparser

2

; semi

3

; n

<−

stmtparser

4

;

return

(StmtExpr e n)

5 }

リスト

2

セミコロンの付け忘れがある

picoC

プログラム

1 int

one()

{

2 int

a;

3

a = 1

4 return

a;

5 }

例えば,

picoC

における式文はリスト

1

のような

Haskell

プロ グラムで解析される.リスト

2

のような,代入式においてセミ コロンを付け忘れたソースを与えると,以下のようなエラー報 告が得られる.

unexpected "r"

expecting operator or ";"

このメッセージは付け忘れたセミコロンではなく,それより後 のエラーとは無関係のトークンに注目しており,構文誤りを修 正する助けとして不十分である.

3.2

言語指向のエラー報告

こうした利用者の誤り方が予測できる場合に,言語指向のエ ラー報告を実現する方法を考える.

3.1

節の例においては,リス ト

1

の

semi

に

semi <|> unexpected "letter other than ;.

前の式に

;

は付いていますか

?"

と注釈付けすることで,中止の原因であるトークンを報告する だけでなく,足りないトークンの確認を含めたエラーメッセー ジに置き換える.これにより,利用者への助けとなる情報を持 たせたエラー報告に近づける.

4

おわりに

本研究では

unexpected

コンビネータを利用したエラー報告 の改善方法の検証をし,コンビネータを加える前と加えた後の メッセージを比較して考察を行った.今後の課題として,この エラー処理の差し込み方の妥当性を計測して比較する方法を確 立することなどが挙げられる.

参考文献

[1] Johnson, Stephen C. Yacc: Yet another compiler- compiler. Vol. 32. Murray Hill, NJ: Bell Laboratories, 1975.

[2] Leijen, Daan. ”Parsec, a fast combinator parser.” (2001).

[3]

情報科学応用実験指導書 情報システムコース,愛知県立大 学,

2016.

参照

関連したドキュメント

生活のしづらさを抱えている方に対し、 それ らを解決するために活用する各種の 制度・施 設・機関・設備・資金・物質・

るものとし︑出版法三一条および新聞紙法四五条は被告人にこの法律上の推定をくつがえすための反證を許すもので

このように,先行研究において日・中両母語話

近畿、中国・四国で前年より増加した。令和 2(2020)年の HIV 感染者と AIDS 患者を合わせた新規報告数に占 める AIDS 患者の割合を地域別にみると、東京都では

解析の教科書にある Lagrange の未定乗数法の証明では,

しかし,物質報酬群と言語報酬群に分けてみると,言語報酬群については,言語報酬を与

 リスク研究の分野では、 「リスク」 を検証する際にその対になる言葉と して 「ベネフ ィッ ト」

本文書の目的は、 Allbirds の製品におけるカーボンフットプリントの計算方法、前提条件、デー タソース、および今後の改善点の概要を提供し、より詳細な情報を共有することです。