Article View: fj.lang.implementation
Article #81Re: language with yacc
From: MAEDA Atusi/前田敦司
Date: Mon, 24 Feb 1997 00:00
Date: Mon, 24 Feb 1997 00:00
49 lines
2581 bytes
2581 bytes
JavaCCという,Javaを出力する構文(および字句)解析部生成系があるみたいで
す(http://www.suntest.com/JavaCC/ 旧称Jack).
こいつは LL(k) (for unbounded k) パーザを出力するのですが,LALR(1)と比
較した得失として,
* 表現力は同じである.
* LALR(1)で書けてLL(k)で使えないルールは左再帰だけだが,逆にLL(k)で書
けてLALR(1)で書けないルールはたくさんある.
* 拡張BNFが使えるので,たいていの左再帰はもっと自然に繰り返しで書ける.
* top-down parserは,
・デバッグしやすい.
・non-terminalの混ざった構文木を出力できる.
・継承属性,合成属性の両方が使える.
と主張しています.
>>>>> "kono" == Shinji Kono <kono@ie.u-ryukyu.ac.jp> writes:
In article <4042.856603150@rananim.ie.u-ryukyu.ac.jp> kono@ie.u-ryukyu.ac.jp (Shinji Kono) writes:
kono> 河野 真治@琉球大情報工学です。
kono> In article <TAKUO.97Feb22170316@gryphon.jaist.ac.jp> ,
kono> takuo@jaist.ac.jp (Takuo Watanabe) writes
takuo> たしかに再帰降下法は簡単でよいのですが,安直に文法を作って安直にコーディ
takuo> ングするとすぐに左再帰でひっかかりますよね.もちろん文法をちょっと変換
takuo> すれば解決するのですが,今度は書いたプログラムがえらくみにくくなってし
takuo> まいます.
kono> expr()
kono> {
kono> term();
kono> while(last_token!=EOF) {
kono> case '*':
kono> term();
kono> break; ...
kono> みたいな形で書けば、特に、みにくくもなく左再帰はできます。と
kono> いうか左再帰の方が一般的だから常にこの形で書くわけです。
JavaCCだと,
void Expr() : {}
{
Term() (("+" | "-" | "*" | "/") Term() )* <EOF>
}
みたいに,繰り返しで書けるみたいです.
前田敦司
Technical Details
Message-ID:
<MAD.97Feb24231943@tanzanite.math.keio.ac.jp>Path:
arc1-ca.pugleaf.net!unknown!not-for-mailReferences:
<TAKUO.97Feb22170316@gryphon.jaist.ac.jp>Show Full Headers
Complete Article Headers
X-Google-Language: Japanese,JIS X-Google-Thread: 10692b,a940e572f466c255 X-Google-Attributes: gid10692b,public From: mad@math.keio.ac.jp (MAEDA Atusi/前田敦司) Subject: Re: language with yacc Date: 1997/02/24 Message-ID: <MAD.97Feb24231943@tanzanite.math.keio.ac.jp> X-Deja-AN: 221064245 Sender: news@sync.cs.keio.ac.jp References: <TAKUO.97Feb22170316@gryphon.jaist.ac.jp> Content-Type: text/plain; charset=ISO-2022-JP Organization: Faculty of Sci. and Tech., Keio Univ., Yokohama, Japan. Mime-Version: 1.0 (generated by tm-edit 7.66) Reply-To: mad@math.keio.ac.jp Newsgroups: fj.lang.implementation