JPH05189242A - パーサ自動生成方法 - Google Patents

パーサ自動生成方法

Info

Publication number
JPH05189242A
JPH05189242A JP275192A JP275192A JPH05189242A JP H05189242 A JPH05189242 A JP H05189242A JP 275192 A JP275192 A JP 275192A JP 275192 A JP275192 A JP 275192A JP H05189242 A JPH05189242 A JP H05189242A
Authority
JP
Japan
Prior art keywords
action
parser
backtrack
grammar
state
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP275192A
Other languages
English (en)
Inventor
Yoshima Ikeuchi
義真 池内
Noriyasu Mori
教安 森
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Hitachi Ltd
Original Assignee
Hitachi Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Hitachi Ltd filed Critical Hitachi Ltd
Priority to JP275192A priority Critical patent/JPH05189242A/ja
Publication of JPH05189242A publication Critical patent/JPH05189242A/ja
Pending legal-status Critical Current

Links

Landscapes

  • Devices For Executing Special Programs (AREA)
  • Stored Programmes (AREA)

Abstract

(57)【要約】 【構成】計算機システム201は、システムバス210
に接続されたCPU202,主記憶装置203,入出力装置
207よりなる。入出力装置207は外部記憶装置21
1に接続され、外部記憶装置には、本システムの入力と
なる文法データ208および本システムの出力となるL
Rパーサ209が格納され、主記憶装置には、LRパー
サ生成プログラム204が格納され、CPUはこのLR
パーサ生成プログラムを実行して目的のLRパーサを生
成する。主記憶装置内には、文法データ格納テーブル2
05および作業用データ領域206があり、LRパーサ
生成プログラムにより使用される。 【効果】文法中にコンフリクトが含まれる場合、コンフ
リクトを解消しないままでも正しくパージングを行うパ
ーサを自動生成することができる。

Description

【発明の詳細な説明】
【0001】
【産業上の利用分野】本発明はプログラムを自動生成す
る方法に係り、特に、パーサを自動生成する方法に関す
る。
【0002】
【従来の技術】ユーザが入力したデータを受け取り、そ
のデータに基づいて処理を行うプログラムは、まず、入
力されたデータが所定の形式、即ち、構文に従っている
かを解析しなければならない。例えば、コンパイラは、
入力されたプログラムが、そのプログラミング言語の定
める構文(文法)に従っているかどうかをまず解析す
る。このような解析を構文解析またはパージング(parsi
ng)とよび、これを行うプログラムを構文解析プログラ
ムまたはパーサ(parser)と呼ぶ。
【0003】一方、入力データの構文を形式的(数学
的)に定義する方法として、バッカス記法(BNF)と
いうものが知られている。バッカス記法は、実は文脈自
由文法(context free grammar)と呼ばれる文法の記法
とほとんど等しい。文脈自由文法は、非終端記号の集
合,終端記号の集合,生成規則の集合、および開始記号
と呼ばれる特別な非終端記号、の四組により定義され
る。
【0004】生成規則(production)はどれも A → α の形をしている。Aは非終端記号、αは非終端記号また
は終端記号の0個以上の列であり、その直感的な意味
は、「Aは、αという記号列から構成される」というこ
とである。また、 A → α A → β A → γ のような、左辺が同一であるような一連の生成規則は、 A → α|β|γ と略記される。例えば、符号付きの数の構文は次のよう
に定義できる。
【0005】数 → 符号 数字列 符号 → +|− 数字列 → 数字 数字列 数字 → 1|2|3|4|5|6|7|8|9|0 ここで、数,符号,数字列,数字のように、生成規則の
左辺に現れる記号を非終端記号(nonterminal)、そう
でない記号(+,−,1,2,…)を終端記号(termin
al)と呼ぶ。また、数のような、その文法で一番大きな
構文要素を表す記号を開始記号(start symbol)と呼
ぶ。
【0006】入力データの構文を、文脈自由文法を用い
て定義すれば、その入力データに対するパーサを、文法
から自動的に生成することができることが一般に知られ
ている。そのなかで特にLLまたはLR構文解析法に基
づくパーサ(以降、単にLLパーサ,LRパーサと呼
ぶ)を生成する方法が有名である。LLおよびLR構文
解析法、およびそのパーサを生成する方法についてはエ
イホ,ウルマン共著「コンパイラ」(1986年、培風
館発行)第163頁から第217頁に記載がある。
【0007】LLまたはLRパーサは、決定性のプッシ
ュダウン・オートマトン、即ち、スタックを備えた決定
性有限状態オートマトンとして動作する。オートマトン
については前述の文献の第80頁から第86頁に記載が
ある。オートマトンは、現在の状態と次の入力記号によ
って次にとるべきアクションを決定する(状態遷移もア
クションの一つと考える)。例えば、LRパーサであれ
ば、行うアクションは、入力記号をシフト(shift)する
か、ある生成規則でリデュース(reduce、還元)するか、
である。
【0008】LLまたはLRパーサの生成方法は、全て
の文脈自由文法に対して適用できるのではなく、それぞ
れ適用できる文法について制限がある。この制限を越え
た文法に対してパーサを生成しようとした場合は、コン
フリクトという状況が起こる。
【0009】コンフリクトとは、オートマトンを考えた
ときに、現在の状態と入力記号から次のアクションが一
意に決定できない状況のことをさす。すなわち、行える
アクションが複数存在している状況である。制限を越え
た文法からオートマトンを生成しようとしたときには、
次のアクションが一意に決まらないような、状態と入力
記号の対が存在することになる。
【0010】プログラミング言語等の構文をBNFすな
わち文脈自由文法を用いて記述した場合、その文法にコ
ンフリクトが生じることがしばしば起こる。しかし、そ
のようなコンフリクトを生じる場合でも、競合している
アクションの中のどれか一つのアクションを行うように
しておけば、そのようにして生成されたパーサは、文法
を記述した人の意図しているのと同じ動作をすることが
多い。
【0011】そこで、文法を入力とし、パーサの生成を
計算機を用いて自動的に行うシステム(パーサ・ジェネ
レータと呼ばれる)では、文法にコンフリクトがあった
場合にも、競合しているアクションの中からある規則に
よって一つのアクションを選択することによって行うア
クションを一意に決定している(これを、コンフリクト
の解消と呼ぶ)ことが多い。
【0012】
【発明が解決しようとする課題】従来のパーサ・ジェネ
レータでは、入力された文法にコンフリクトが生じたと
き、それを人手によってコンフリクトの生じない文法に
書き替えてやらなければならなかった。しかし、この作
業は通常多大な労力を必要とする。例えば、次のような
文法が与えられたとする。
【0013】 (ここで、「文字列」が終端記号である。)この時、入
力記号が「今富 利久登 沖田」であった場合のパーサ
の動作を考える。
【0014】まず、パーサは「今富」を読み込み「姓」
に還元する。この時点でパーサは、「姓」を「名前」に
還元するべきか、次の入力を待つべきかが判断できな
い。このような二つの合法的な操作がある場合、パーサ
のとるべき道をどちらかに決定する方法はないので、構
文則作成者の意思と違うアクションをとることがよくあ
る。そういう場合の解析結果は、アクション候補のない
状態に来る可能性が高い。この例の場合、「姓」を「名」
として還元せずにシフトすると、入力が「今富利久登」
となったときに、「名前」に還元される。そして次に
「沖田」が入力されると「姓」に還元されるが、次の入
力はないので、「姓」は「名前」に還元される。そし
て、採るべき動作がなくなって、構文に間違いがないに
もかかわらず、曖昧さがあるために構文解析は失敗して
しまう。
【0015】本発明の目的は曖昧さのある文法であって
も構文解析が正しく行われるパーサ自動生成方法を提供
することにある。
【0016】
【課題を解決するための手段】本発明では、入出力装置
および記憶装置が接続された計算機を用い、LLもしく
はLRパーサのような、現在の内部状態と終端記号に基
づいて次のアクションを決定するオートマトンとして動
作するパーサを生成する方法が与えられる。
【0017】本方法では、まず入力装置から文法データ
を入力し、これを前記記憶装置に記憶蓄積する。このと
きの文法データには、バックトラックするか否か、及
び、バックトラックする位置を指示する情報を含んでい
る。次に記憶蓄積された文法データをもとにLLまたは
LRパーサにおける内部状態集合を生成する。次にその
内部状態と終端記号の各々の対に対して、行われるアク
ションの候補を生成する。そして、アクション候補が複
数ある場合、すなわち、コンフリクトが生じた場合に
は、一定の基準によって次のアクションを決定する。も
し、パージング時に、アクション候補がない状態に来て
しまった場合、一番最近の、アクション候補が複数あっ
て、かつ、バックトラック指定されている状態まで戻っ
て、以前にとられていないアクションの中から、一定の
基準によって次のアクションを決定し、そこからパージ
ングをやり直す。
【0018】パージング時に、アクション候補がない状
態に来てしまった場合、どの状態からパージングをやり
直すかは、ユーザが、バックトラック位置を文法データ
の一部として記述することにより決定する。
【0019】なお、ユーザは、入力した文法にコンフリ
クトが含まれているのは最初は分からないのが、普通で
ある。従って、上記の情報(バックトラック位置の指
定)は、一般的には、コンフリクトがあることがわかっ
た後で、文法データにつけ加えればよいようにしてお
く。
【0020】
【作用】次の文法が与えられたとする。
【0021】 (ここで、「文字列」が終端記号である。)この時、入
力記号が「今富 利久登 沖田」であった場合の本発明
のパーサの動作を考える。
【0022】まず、パーサは「今富」を読み込み「姓」
に還元する。この時点でパーサは、「姓」を「名前」に
還元するべきか、次の入力を待つべきかが判断できな
い。そこでシフトしたとすると、入力が「今富 利久
登」となったときに、「名前」に還元される。そして次
に「沖田」が入力されると「姓」に還元されるが、次の
入力は無いので、「姓」は「名前」に還元される。そし
て、とるべき動作が無くなってしまう。従来、この時点
で、構文解析は失敗したということになるが、本発明で
は、このアクション候補がない状態に来た時点で、一番
最近コンフリクトが起こった状態(「姓」を「名前」に
還元するか、シフトするか)に戻り、まだ選ばれていな
いアクション(「姓」を「名前」に還元)を選びなおし
てパージングを再開する。その結果、次の入力「利久
登」は、「姓」に還元され、「沖田」は、「名」に還元
される。その結果、「今富 利久登 沖田」は「名前」
「姓」「名」と解釈されて「名前リスト」に還元され、
パージングは成功する。
【0023】本発明では、パージング時にアクション候
補がない状態に来た場合、直前のコンフリクトが起こっ
た位置から、パージングをやりなおすようなパーサを生
成することができる。
【0024】また、バックトラック位置の指定があった
場合は、指定がある位置からだけ、パージングをやり直
すようなパーサを生成することができる。
【0025】
【実施例】以下、本発明の一実施例を図面を用いて説明
する。
【0026】図2は、本発明に基づくLRパーサ・ジェ
ネレータを実現する計算機システムの構成図である。本
実施例の計算機システム201は、システムバス210
に接続されたCPU202,主記憶装置203,入出力
装置207より構成される。また、入出力装置207は
外部記憶装置211に接続されている。外部記憶装置に
は、本システムの入力となる文法データ208および本
システムの出力となるLRパーサ209が格納される。
主記憶装置には、LRパーサ生成プログラム204が格
納されており、CPUはこのLRパーサ生成プログラム
を実行することにより、目的のLRパーサを生成する。
主記憶装置内にはまた、文法データ格納テーブル20
5、および作業用データ領域206があり、LRパーサ
生成プログラムにより使用される。
【0027】図1は、LRパーサ生成プログラムの処理
の大まかな流れの一例を示すフローチャートである。ま
ず、ステップ101で文法データ208を読み込み、そ
れを文法データ格納テーブル205に格納する。次に格
納されたデータをもとにLR状態集合を生成する(ステ
ップ102)。次にLR状態と終端記号の対にたいして
アクションの候補を求める(ステップ103)。そして
求められたアクションの候補数が1であるかどうかを調
べ(ステップ104)、1であればその候補を最終的な
アクションとして登録する(ステップ105)。アクシ
ョン候補数が1でなければ、0であるかどうかを調べ
(106)、0であれば動的に一番最近登録されたバッ
クトラック位置のアクション候補の中から一つをアクシ
ョンとして登録する(ステップ107)。アクション候
補数が複数であれば、バックトラック指示情報があるか
どうかを調べ(108)、なければ動的解消をアクショ
ンとして登録し(111)、あればそのアクションにバ
ックトラック位置指定情報があるかどうかを調べ(10
9)、なければ動的解消をアクションとして登録し(1
11)、あればバックトラック先の位置としてLR状態
と終端記号の対をバックトラック位置格納テーブルに登
録し(ステップ110)、次にとるアクションを動的に
決定することをアクションとして登録する(ステップ1
11)。次に、ステップ112で、処理すべきLR状態
と終端記号の対がまだ残っているかどうかを調べ、残っ
ていればステップ103から繰り返す。残っていなけれ
ばLRパーサとコンフリクト情報を出力し(ステップ1
13,114)、処理を終了する。
【0028】図3は、本パーサ・ジェネレータへの入力
となる文法データの一例を示したものである。なお、本
実施例の以降の説明はすべてこのデータをもとに行う。
文法データは、バックトラックの指定,バックトラック
する位置の指定,終端記号の指定,開始記号の指定、お
よび生成規則の指定の三つの部分からなる。
【0029】301はバックトラックを行うという指定
である。302はバックトラックする位置の指定で、状
態番号5がアクション候補として上がった場合、その位
置へバックトラックを行うことの指定である。この番号
は、パーサ・ジェネレータの出力するコンフリクト情報
を参照して指定する。303は終端記号の指定であり、
ID,NUMBER,‘:=’,‘(’,‘)’が終端
記号であることを示している。304は開始記号の指定
であり、stmtが開始記号であることを示している。30
5はそれより後の部分(306から312)に生成規則
が書いてあることを示している。
【0030】306から312は生成規則の指定であ
り、306はproc_name(非終端記号),‘(’(終端記
号),exp(非終端記号),‘)’(終端記号)の順に来
たときstmtに還元することを示している。307はvar
(非終端記号)、‘:=’(終端記号),exp(非終端記
号)の順に来たときstmtに還元することを示している。
【0031】308はID(終端記号)が来たときproc_
nameに還元することを示している。
【0032】309はNUMBER(終端記号)が来た
ときexpに還元することを示している。310はvar(非
終端記号)が来たときexpに還元することを示してい
る。311はID(終端記号)が来たときvarに還元する
ことを示している。312はID(終端記号),‘(’
(終端記号),exp(非終端記号),‘)’(終端記号)
の順に来たときvar に還元することを示している。
【0033】この構文は曖昧であるので、コンフリクト
情報がファイルに出力される。図4は、コンフリクト情
報を示したものである。終端記号が‘(’で(40
6)、proc_name −> ID .,var −> ID
.,var −> ID .‘(’ exp ‘)’ の3
つのアクションがアクション候補として上がった状態の
とき(403,404,405)、コンフリクトが起こ
ることを示している。また、402のstate 5はこの状
態の状態番号は5であるということを示している。図3
のバックトラック位置指定情報(302)は、この状態
番号で指定してある。従来のパーサ・ジェネレータで
は、これを曖昧さのない構文に書き直したものを入力に
しなければならない。
【0034】図3の文法データを曖昧さのない構文に書
き直したものを図5に示す。この文法データは、一般に
使用されるものと比べてかなり小さいので、コンフリク
トが簡単に解消されているが、一般の言語で使用される
ような大きさの文法では、コンフリクトを解消すること
は大変難しい作業である。
【0035】図6,図7は、文法データ格納テーブル2
05の一構成例を示す図である。本テーブルは図1のス
テップ101の処理により作成される。文法データ格納
テーブルはシンボルテーブル(図6)と生成規則テーブ
ル(図7)よりなる。シンボルテーブルは文法中に出現
する各記号(終端/非終端記号)について、その綴り6
01,記号コード602,終端/非終端の区別を表す情
報603を格納する。記号コードは各記号を一意に識別
するために本システムがつける番号である(文法データ
中の出現順に1からつける)。終端/非終端の区別を表
す情報は、Tが終端記号を、Nが非終端記号を表してい
る。
【0036】生成規則テーブルは各生成規則について、
その生成規則コード701,生成規則の両辺の記号列7
02を格納している。生成規則コードは各生成規則を一
意に識別するために本システムが付ける番号である。生
成規則両辺の記号列はその生成規則を構成する記号のコ
ードを左辺から右辺の順に並べたものである。右辺の終
わりは終了コード0によって識別する。
【0037】図6に示したテーブルには、入力した文法
データにはない記号「S」と「$」、および生成規則
「S −> stmt $」が含まれている。記号Sは拡張開
始記号、$は終了記号と呼ばれ、また、もとの文法の開
始記号をsとしたとき、生成規則「S −> s $」は
拡張生成規則と呼ばれている。一般にLR構文解析手法
では、対象となる文法に上記の記号と拡張生成規則を加
えて拡張文法(augmentedgrammar)を作り、その文法をも
とにパーサを生成する。本実施例でも、文法データを入
力した後、テーブルに以上の記号と生成規則をさらにつ
け加えることによって、拡張文法を生成している。
【0038】次に、図1のステップ102で行われる、
LR状態集合の生成についてさらに詳しく説明する。本
実施例で生成するのは、LRパーサのなかでも、特にS
LR(1)パーサと呼ばれるものである(もちろん本発
明はこれに限定されるものではない)。SLR(1)パ
ーサでのLR状態はLR(0)項の集合として定義され
る。LR(0)項とは、生成規則の右辺のいずれかの位
置にドット(・)を付加したものである。例えば「A
−> X Y Z」という生成規則からは次の四つのL
R(0)項が得られる(以降、LR(0)項のことを単
に項と呼ぶ)。
【0039】 A −> ・ X Y Z A −> X ・ Y Z A −> X Y ・ Z A −> X Y Z ・ 項は構文解析のある時点で、生成規則のどの部分までを
既に見たか(ドットの部分まで見た)を示している。
【0040】項は、計算機内部では、生成規則コード
と、ドットの位置を表わす整数の対として表現できる。
また、項の集合はこれらの対をリスト(ポインタ)でつ
なげることによって表現できる。これを示したのが図
8,図9である。
【0041】図9に示すような、三つの項(901〜9
03)からなるLR状態があるとき、この項の集合は図
8に示すデータ構造により表現できる。ここで、801
は項「proc_name −> ID ・」を、802は項「va
r −> ID ・」を、803は項「var −> ID ・
‘(’ exp‘)’」を表している。そして、804が生
成規則コードを、805がドットの位置を表わしてい
る。また806が、その次の項を表わすデータへのポイ
ンタである。ドットの位置は、それが右辺の左端にある
とき0、それから一つ右にずれるごとに1を加えた数値
で表されている。
【0042】図10は、拡張文法からLR状態集合を生
成する処理、すなわち図1ステップ102の処理をさら
に詳しく説明したフローチャートである。まず、ステッ
プ1001で状態の集合Tを空集合にセットする。次
に、拡張生成規則に基づく項「S −> ・ s $」の
閉包(closure)を計算し、それを最初のLR状態として
登録する(ステップ1002)。閉包の定義およびその
計算方法については、前述の文献の182頁に記載があ
る。次に、いま登録したLR状態を集合Tに加える(ス
テップ1003)。そしてTが空集合であるかどうかを
調べ(ステップ1004)、そうであれば終了する(終
了した時点で登録されているLR状態をすべて集めたも
のが求めるLR状態集合である)。Tが空集合でない場
合は、Tから状態を一つ取り出し、それをtとする(ス
テップ1005)(このときtはTからは取り除く)。
そして記号集合Xを、拡張文法に現れるすべての記号の
集合にセットする(ステップ1006)。次にXが空集
合であるかを調べ(ステップ1007)、そうであれば
ステップ1004に進む。そうでなければXから記号を
一つ取り出し、それをxとする(ステップ1007)
(この時xはXからは取り除く)。次に関数GOTO
(t,x)の値を計算する(ステップ1009)。GOT
O関数の値の計算方法については上記文献の183頁に
記載がある。次にいま計算したGOTO(t,x)がT
に含まれるかを調べ(ステップ1010)、含まれている
場合はステップ1007に進む。含まれていない場合は
それを新たなLR状態として登録する(ステップ101
1)とともに、集合Tにくわえ(ステップ1012)、
そしてステップ1007に進む。
【0043】図11,図12,図13,図14は、図1
0のフローチャートに従って図3の文法のLR状態集合
を求めた結果である。図11,図12,図13,図14
において、「:」の左側の数字は各状態を一意に識別す
るための番号(状態番号)である。「:」の右側には同
様の状態(ドットの位置まで見た状態)を構成する項の
集合が示されている(項は一行に一つずつ書かれてい
る)。例えば、状態1は、まだ何も見ていない状態で、
「S −> ・ stmt $」以下六つの項からなることが
わかる。状態2は、var まで見た状態で、同様の状態は
他にないので「stmt −> var・‘:=’exp」の一つ
の項からなる。同様に、全ての状態を示した(状態16
まである)。
【0044】図15は、あるLR状態と終端記号の対に
対応するアクションを求める処理、すなわち図1のステ
ップ103の処理をさらに詳しく説明したフローチャー
トである。このフローチャートは、状態がs,入力(終
端)記号がaであるときのアクションの候補を求めるも
のである。本パーサ・ジェネレータが生成するのはLR
パーサであるので、ここで求められるアクションの候補
は、「シフト」,「リデュースp」(pは生成規則),
「アクセプト」のいずれかである。これらのアクション
の詳しい意味については、前述の文献の176頁から1
77頁に記載がある。まず、ステップ1501で、s中
に「A −> α ・ a β」という項が存在するかを
調べる。ここでAは任意の非終端記号、αおよびβは空
列を含む任意の記号列である。存在する場合はaが$で
あるかを調べ(ステップ1502)、そうであれば「アクセプ
ト」をアクション候補の一つとして登録する(ステップ
1503)。$でない場合は「シフト」を登録する(ス
テップ1504)。いずれの場合も次にステップ150
5に進む。ステップ1505では、s中に「A−> α
・」という項が存在し、かつaがAの後続集合(Follo
w(A))に含まれているかどうかを調べる。後続集合の
定義(算出方法)は前述の文献の166頁から167頁に
記載がされている。そうである場合には「リデュース
p」(pは「A −> α」の生成規則コード、図5参
照)をアクション候補として登録する(ステップ150
6)。
【0045】図16は、図15のフローチャートに従っ
て、図3の文法の、各LR状態と終端記号の対に対して
求められるアクション候補を表の形で示したものであ
る。表の縦軸にはLR状態番号(図11,図12,図1
3,図14の「:」の左に書かれている番号)が、横軸
には終端記号がとられている。例えば、1601は、状
態1で入力記号がIDであるときのアクションの候補は
「シフト」であることを示している。この図より、状態
番号が5で、入力記号が‘(’であるとき(1602で示さ
れるエントリ)を除いて、アクション候補の数は、1か
0であることがわかる。
【0046】図17は、図1のフローチャートのステッ
プ104からステップ109に従って、各LR状態と終
端記号の対にたいして得られる最終的なアクションを示
したものであり、図16の各エントリと一対一に対応し
ている。アクション候補数が1のものは図1のステップ
104およびステップ105に従って、その候補が最終
的なアクションになっている。アクション候補数が0の
ものは、一番最近バックトラック位置格納テーブルに格
納されたLR状態と終端記号の「まだ選ばれていないア
クションをアクション候補とする」というアクション
(1701)をいれる。1701のようなアクションを
「BT(バックトラック)設定」とここでは読んでい
る。一方、[状態5,‘(’]に対応するエントリには
もともと「シフト」と「リデュース3」の二つのアクシ
ョン候補が入っていたが(即ち、コンフリクトが生じて
いる)、ここには、「アクション候補の中から一つを動
的に選んで実行する」というアクション(1702)を
いれる。これと同時にこのときのLR状態と終端記号を
バックトラック位置格納テーブルに格納する。1702
のようなアクションを「競合解消(conflict resolutio
n)」とここでは呼んでいる。競合解消の次の数字は、
異なる競合解消アクションを識別するためのもの(競合
解消アクション識別コード)である。このコードは1か
ら順につけられている(この例では一つしかない)。
【0047】図18は、各競合解消アクションについ
て、さらに詳しい情報を納めたテーブルである。本テー
ブルには、各競合解消アクションについて、競合解消ア
クション識別コード1801,競合しているアクション
の数1802,その中で未実行のものの数1803,そ
の内容1804が格納されている。競合しているアクシ
ョンの内容は、アクションと、そのアクションが行われ
たかどうかを示すフラグよりなる。本テーブルではアク
ションが上段に、フラグが下段に記述されている。本テ
ーブルの中味を、生成されるLRパーサといっしょに
(パーサの一部として)出力し、パージング時にパーサ
から参照できるようにしておけば、そのパーサはコンフ
リクトがある場合まだ選ばれていないアクションを動的
に選ぶことができるようになる。
【0048】図19は、パージング時にアクション候補
が複数あった場合に、そのLA状態番号1901と終端
記号1902をスタック方法で格納したバックトラック
位置格納テーブルである。パージングにアクション候補
のない状態に来た場合に、このテーブルの一番上にある
状態を次のアクション候補とする。
【0049】図20,図21,図22は生成されるパー
サプログラムの一例を示したものである。このプログラ
ムはC言語で記述されている。C言語の詳細な説明は、
例えばカーニハン他著「プログラミング言語C」(19
81年、共立出版社)に記載されている。
【0050】図20において、(1)〜(9)は定数名
の定義である。本パーサプログラムでは、アクション
は、例えば、シフトは0というように、整数値としてコ
ード化されている。(3)〜(9)はそれらアクション
コードの定義である。(11)〜(55)はパーサの本
体となる関数parse()の定義である。(13)〜(15)
は変数の宣言で、それぞれここで初期化されている。do
neはループ制御用の、tは入力記号用の、sは状態番号
用の変数である。(14)で使われているgettoken()は
次の入力記号を取り出す関数である。パーサは次のよう
に動作する。まず(17)で状態番号を、関数push()
を用いてスタックにプッシュする。次に、doneがFAL
SEの間、(18)〜(54)のあいだをくりかえす。
(19)では関数pop()によりスタックのトップを取
り出しそれをsに代入する。(20)では関数actio
n()により状態s,入力記号tのときのアクションコ
ードを求め、その値によって分岐をする。
【0051】アクションコードがERRORの時(2
1)は、エラー処理ルーチンerrorhandle()を呼び出
す。アクションコードがACCEPTの時(24)はdo
neをTRUEにする。
【0052】アクションコードがSHIFTの時(2
7)は関数GOTO(s,t)により次に遷移する状態
番号を求め、これをスタックにプッシュし、さらに次の
入力記号をtにセットする。アクションコードがRED
UCE1である時(31)は、一番の生成規則の右辺の
長さ分、すなわち、四つ分だけスタックをポップし、そ
こでトップになった状態と、左辺の記号コード、すなわ
ち3とから次の状態番号をGOTO()を使って求め、
それをプッシュする。アクションコードが他のリデュー
スの時(35)〜(43)も同様である。
【0053】アクションコードがCONFLICT1の
時(44)は、まず、関数BackTrackInfo()により、
バックトラック指示情報があるかどうかを調べる(4
5)。あればこの関数はTRUEを返す。そのときはさ
らに、BackTrackPosiInfo(s, t)により、現在の
状態(入力記号と状態番号)がバックトラック位置とし
て指定されているかどうかを調べる(46)。指定され
ていれば、現在の状態をバックトラック位置格納テーブ
ル(図19)に格納する関数setBackTrackTbl()をコ
ール(47)した後、コンフリクトを解消する関数confl
ictResolution()(48)をコールし次の動作を決め
る。バックトラック指示情報またはバックトラック位置
指定情報がない場合はバックトラック位置格納テーブル
に格納せずにそのまま次の動作を決める。関数conflict
Resolution()は、現在の状態(入力記号と状態番号)
を受け取り、競合解消アクション情報テーブル(図1
8)を見て、競合しているアクションのうち、未使用の
アクションの中から一つを次のアクションとして返し、
その返したアクションのアクションが行われたかどうか
を示すフラグ(1804)をON(使用)にし、未使用
競合アクションの数(1803)を1減らす。
【0054】アクションコードがSET_BACKTRACK のとき
(50)は、バックトラック位置格納テーブルのトップ
にある(スタック形式で格納してある)状態(入力記号
(topBtTblS())と状態番号(topBtTblT()))から
次の状態番号をconflictResolution()を使って求め、
それをプッシュする。バックトラック位置格納テーブル
に何も入ってない場合は、topBtTblS(),topBtTbl
T()ともに−1を返し、conflictResolution()はそ
れらを引数に取った場合、次の状態をERRORとして
返す。
【0055】
【発明の効果】本発明によれば、文法中にコンフリクト
が含まれている場合に、コンフリクトを解消しないまま
でも正しくパージングを行うようなパーサを自動生成す
ることができる。
【図面の簡単な説明】
【図1】LRパーサ生成プログラムの処理の大まかな流
れの一例を示すフローチャート。
【図2】本発明に基づくLRパーサ・ジェネレータを実
現する計算機システムのブロック図。
【図3】本パーサ・ジェネレータへの入力となる文法デ
ータの一例を示す説明図。
【図4】図3の入力に対する本パーサ・ジェネレータの
出力するコンフリクト情報を示す説明図。
【図5】図3の文法データを曖昧さのない文法データに
書き換えた説明図。
【図6】文法データ格納テーブル(シンボルテーブル)
の一構成例を示す説明図。
【図7】文法データ格納テーブル(生成規則テーブル)
の一構成例を示す説明図。
【図8】項の集合を計算機内部で表現する場合のデータ
構造の例を示すブロック図。
【図9】項の集合を一例を示す説明図。
【図10】拡張文法からLR状態集合を生成する処理の
フローチャート。
【図11】図3の文法のLR状態集合を示す説明図。
【図12】図3の文法のLR状態集合を示す説明図。
【図13】図3の文法のLR状態集合を示す説明図。
【図14】図3の文法のLR状態集合を示す説明図。
【図15】あるLR状態と終端記号の対に対応するアク
ションの候補を求める処理のフローチャート。
【図16】図3の文法の、各LR状態と終端記号の対に
対して求められるアクションの候補を示す説明図。
【図17】図3の文法の、各LR状態と終端記号の対に
対して求められる最終的なアクションを示す説明図。
【図18】各競合解消アクションについての情報を納め
たテーブルの例を示す説明図。
【図19】バックトラックの戻り先の情報を納めたテー
ブルの例を示す説明図。
【図20】生成されるパーサプログラムの一例を示す説
明図。
【図21】生成されるパーサプログラムの一例を示す説
明図。
【図22】生成されるパーサプログラムの一例を示す説
明図。
【符号の説明】
202…CPU、203…主記憶装置、204…LRパ
ーサ生成プログラム、205…文法データ格納テーブ
ル、207…入出力装置、208…文法データ、209
…LRパーサ、210…システムバス。

Claims (7)

    【特許請求の範囲】
  1. 【請求項1】構文則上で解析がどこまで進んだかを示す
    内部状態と、入力記号とに基づいて次にとるアクション
    を決定して動作するパーサを、入出力装置および記憶装
    置が接続された計算機を用いて自動生成する方法であっ
    て、 前記入力装置から文法データを入力し、これを前記記憶
    装置に記憶蓄積するステップと、 前記内部状態集合を生成するステップと、 前記内部状態と終端記号の各々の対に対して、行われる
    アクションの候補を生成するステップと、 前記アクション候補から次にとるアクションを選択する
    ステップとからなり、次にとるアクションを選択するス
    テップは、(a)前記アクション候補が複数ある場合に
    は、そのときの前記内部状態と前記終端記号の対をバッ
    クトラック位置として前記記憶装置に動的に記憶蓄積
    し、まだ選ばれていないアクションの中から、次にとる
    アクションを動的に決定する(b)前記アクション候補が
    一つの場合には、それを次にとるアクションとする(c)
    前記アクション候補が無い場合には、一番最近記憶され
    た前記バックトラック位置を次のアクション候補とする
    ことを特徴とするパーサ自動生成方法。
  2. 【請求項2】請求項1において、前記文法データは、バ
    ックトラックするか否かを指示するバックトラック指示
    情報を含み、前記バックトラック指示情報に基づいて、
    バックトラックするパーサを生成するか否かを決定する
    パーサ自動生成方法。
  3. 【請求項3】請求項1において、前記文法データは、バ
    ックトラックする位置を指定するバックトラック位置指
    定情報を含み、前記バックトラック位置指定情報に基づ
    いて、バックトラックする位置を決定するパーサ自動生
    成方法。
  4. 【請求項4】請求項2で示した前記バックトラック指示
    情報、及び、請求項3で示した前記バックトラック位置
    指定情報の両方に基づいて、バックトラックするパーサ
    を生成するか否か、及び、バックトラックする位置を決
    定するパーサ自動生成方法。
  5. 【請求項5】請求項1において、前記アクション候補が
    複数ある場合に、まだ選ばれていないアクションがない
    場合、その状態から見て一番最近記憶された前記バック
    トラック位置を次にとるアクション候補とするステップ
    をもったパーサ自動生成方法。
  6. 【請求項6】請求項2において、パーサを生成する際
    に、前記アクション候補数が複数の状態があった場合、
    前記内部状態と終端記号の対すべてを、コンフリクト情
    報としてファイルに出力し、それを見てバックトラック
    位置を指定するパーサ自動生成方法。
  7. 【請求項7】文法Lの範囲で構文解析を行うことの出来
    るパーサを、自動生成することの出来るパーサ自動生成
    方法を使って、バックトラックの機能を付け加えること
    によって、文法Lを含むことのできるより広い文法L′
    の範囲で構文解析を行うことを特徴とするパーサ自動生
    成方法。
JP275192A 1992-01-10 1992-01-10 パーサ自動生成方法 Pending JPH05189242A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP275192A JPH05189242A (ja) 1992-01-10 1992-01-10 パーサ自動生成方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP275192A JPH05189242A (ja) 1992-01-10 1992-01-10 パーサ自動生成方法

Publications (1)

Publication Number Publication Date
JPH05189242A true JPH05189242A (ja) 1993-07-30

Family

ID=11538055

Family Applications (1)

Application Number Title Priority Date Filing Date
JP275192A Pending JPH05189242A (ja) 1992-01-10 1992-01-10 パーサ自動生成方法

Country Status (1)

Country Link
JP (1) JPH05189242A (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2005301537A (ja) * 2004-04-09 2005-10-27 Meidensha Corp 自動運転システムおよびこのシステムにおける運転パターンの作成・変更方法

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2005301537A (ja) * 2004-04-09 2005-10-27 Meidensha Corp 自動運転システムおよびこのシステムにおける運転パターンの作成・変更方法

Similar Documents

Publication Publication Date Title
US10664655B2 (en) Method and system for linear generalized LL recognition and context-aware parsing
JP3599775B2 (ja) ハイフネーション規則に関する有限状態符号化システム
JPS61103247A (ja) 翻訳プログラム作成システム
US6785643B2 (en) Chart parsing using compacted grammar representations
CA2289066A1 (en) Command parsing and rewrite system
JPS6375835A (ja) 目的コ−ド、プログラム・リスト及び設計文書を生成する装置
WO2002033582A2 (en) Method for analyzing text and method for builing text analyzers
US20040154009A1 (en) Structuring program code
JPH0567144A (ja) 前編集支援方法およびその装置
US20030046055A1 (en) Method and apparatus for factoring unambiguous finite state transducers
US20030004705A1 (en) Method and apparatus for factoring ambiguous finite state transducers
US7065753B2 (en) Method, system and computer program for syntax validation
US20030233640A1 (en) Structuring program code
US7107205B2 (en) Method and apparatus for aligning ambiguity in finite state transducers
US20030033135A1 (en) Method and apparatus for extracting infinite ambiguity when factoring finite state transducers
JPH05189242A (ja) パーサ自動生成方法
US20020120437A1 (en) Method and apparatus for reducing the intermediate alphabet occurring between cascaded finite state transducers
CN106663094B (zh) 用于线性广义ll识别和上下文感知解析的方法和系统
Mossin Partial evaluation of general parsers
WO1996017310A1 (en) System and process for creating structured documents
US20020198702A1 (en) Method and apparatus for factoring finite state transducers with unknown symbols
US20020152062A1 (en) Method and apparatus for extracting short runs of ambiguity from finite state transducers
JPH06124211A (ja) プログラム解析装置
Hanneforth A practical algorithm for intersecting weighted context-free grammars with finite-state automata
JP2500737B2 (ja) 構文解析によるエラ―リカバリ機能を持つ構文解析装置