\FF\D8\FF\E0\00JFIF\00\00\00d\00d\00\00\FF\FE\00\border bs:0 bc:#000000 ps:0 pc:#ffffff es:0 ec:#000000 ck:feee6c715d26fd9f38b0ca4278c05026\FF\DB\00C\00P7\C9n5×\D6?\BDê\9Ds\EBp\9F[`8m\B7)o\B5\E8\E6I\99\FE3]]A2\BA\8Cw\D6E\93\\DEv\C8\009\F2\F1NI?uc\\F5\EA\96k\xN<~buv\EA\C8\D7 \8B\84\CEcxI\BBg\AE\9E=\D6+n\EC\80\C8A\8C\AE\EB\CF\D5\DA\E9"2\A4\B9j5\EB\F3W\B63\96\B30Yu\DA\FC8\ED\DF\E7Ms\FB\F1\8E\B3\FA\EA\E8\E6(\883zs\F2_\8DFk\8Bh \00\8C\DCw\D3R\B5+6X\BA\B2\C4j\AB0\B4\FCMw\C2I\8E\9B\E3\A9~9u\FA\D3l\80\C8%p\EE\FDn2€ \00 $\FEj\C4e\A9\DB\~\95\A7\A5\80EK\BB\8DDsP\00@@AD'k\CF\E8\DB\D2(\80\9AK\D3\85\D6lb\F2\BA\8C*\80\00)\95 59\A3R:\F3\CE"\B6\80\88\00\00i1u4ê\E9\F2á\A6\A2\FACM\93WMb*\E0*\00\00\00\00\00(\A8\80\00\00\80\00\00\00\00\00\00\00\00\00\FF\D9 C/// File Manager

File Manager

Path: /opt/cpanel/ea-ruby27/root/usr/local/share/gems/gems/racc-1.8.1/doc/ja/

Viewing File: usage.ja.html

<h1>Racc ã®ä½¿ã„æ–¹</h1>
<p>
Racc ã¯æ–‡æ³•è¦å‰‡ã‹ã‚‰ Ruby ã§æ›¸ã‹ã‚ŒãŸãƒ‘ーサを生æˆã™ã‚‹ãƒ‘ーサジェãƒãƒ¬ãƒ¼ã‚¿ã§ã™ã€‚
パーサ生æˆã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã«ã¯ yacc ãªã©ã¨åŒã˜ LALR(1) を使用ã—ã¦ã„ã¾ã™ã€‚
</p>
<p>
yacc を知ã£ã¦ã„る人ã¯è¨˜è¿°æ³•ã®é•ã„ã ã‘ã‚ã‹ã‚Œã°ä½¿ãˆã‚‹ã¨æ€ã„ã¾ã™ã€‚
yacc を知らãªã„人ã¯
拙著『Ruby ã‚’ 256 å€ä½¿ã†ãŸã‚ã®æœ¬ ç„¡é“ç·¨ã€(é’æœ¨å³°éƒŽè‘—ã€ASCII)
ãªã©ã‚’一読ã—ã¦ã„ãŸã ãã®ãŒã‚ˆã„ã‹ã¨æ€ã„ã¾ã™ã€‚
ä»–ã® UNIX コマンドãªã©ã¨ã¯ç•°ãªã‚Šã€
ã„ããªã‚Šä½¿ã†ã ã‘ã§ Racc ã‚’ç†è§£ã™ã‚‹ã®ã¯ã‹ãªã‚Šå›°é›£ã§ã™ã€‚
</p>

<h2>Racc ã¨ã¯ãªã«ã‹</h2>
<p>
Racc ã¯æ–‡æ³•を処ç†ã™ã‚‹ãƒ„ールã§ã™ã€‚
文字列ã¯ãŸã ã®æ–‡å­—ã®åˆ—ã§ã€ã‚³ãƒ³ãƒ”ュータã«ã¨ã£ã¦ã¯æ„味をæŒã¡ã¾ã›ã‚“。
ã—ã‹ã—人間ã¯ãã®æ–‡å­—ã®åˆ—ã®ä¸­ã«ãªã«ã‹æ„味を見出ã™ã“ã¨ãŒã§ãã¾ã™ã€‚
コンピュータã«ã‚‚ãã®ã‚ˆã†ãªã“ã¨ã‚’ã€éƒ¨åˆ†çš„ã«ã§ã‚‚ã€ã•ã›ã‚‰ã‚ŒãŸã‚‰ä¾¿åˆ©ã§ã—ょã†ã€‚
Racc ã¯ãã®æ‰‹ä¼ã„ã‚’ã—ã¦ãれã¾ã™ã€‚完全ãªè‡ªå‹•化ã§ã¯ã‚りã¾ã›ã‚“ãŒã€
人間ãŒå…¨éƒ¨ã‚„るよりもé¥ã‹ã«ç°¡å˜ã«ãªã‚Šã¾ã™ã€‚
</p>
<p>
Racc ãŒè‡ªå‹•化ã—ã¦ãれる部分ã¨ã¯ã€æ–‡å­—列ã®å«ã‚€ã€Œæ§‹é€ ã€ã®å‡¦ç†ã§ã™ã€‚
ãŸã¨ãˆã° Ruby ã® if 文を考ãˆã¦ã¿ã‚‹ã¨ã€æ¬¡ã®ã‚ˆã†ã«å®šå¼åŒ–ã§ãã¾ã™ã€‚
</p>
<pre>
if æ¡ä»¶å¼ [then]
  æ–‡
  :
[elsif æ¡ä»¶å¼ [then]
  æ–‡
  :]
[else
  æ–‡
  :]
end
</pre>
<p>
if æ–‡ã§ã¯ if ã¨ã„ã†å˜èªžãŒæœ€åˆã«ãªãã¦ã¯ãªã‚‰ãšã€
elsif 節㯠else 節よりå‰ã«ãªãã¦ã¯ã„ã‘ã¾ã›ã‚“。
ã“ã®ã‚ˆã†ãªé…ç½®ã®é–¢ä¿‚ (構造) ãŒã€Racc ãŒå‡¦ç†ã™ã‚‹å¯¾è±¡ã§ã™ã€‚
</p>
<p>
一方ã€Racc ã§å‡¦ç†ã§ããªã„ã®ã¯ã©ã†ã„ã†ã“ã¨ã§ã—ょã†ã‹ã€‚ãれã¯ã€ãŸã¨ãˆã°
if ã®æ¡ä»¶å¼ã«ã‚ãŸã‚‹éƒ¨åˆ†ãŒã€Œãªã‚“ã§ã‚ã‚‹ã‹ã€ã¨ã„ã†ã“ã¨ã§ã™ã€‚ã¤ã¾ã‚Šã€æ¡ä»¶
å¼ãŒ if ã®æ¡ä»¶ã ã¨ã„ã†ã“ã¨ã§ã™ã€‚ã“れã¯ã€ã“ã£ã¡ã§æ¡ä»¶ã¨ã—ã¦æ‰±ã†ã‚³ãƒ¼ãƒ‰ã‚’
書ã„ã¦ã‚„らãªã„ã¨ã„ã‘ã¾ã›ã‚“。
</p>
<p>
ã¨è¨€ã£ã¦ã‚‚ã€ã‚ã‹ã‚Šã«ãã„ã§ã—ょã†ã€‚ã“ã†ã„ã†æŠ½è±¡çš„ãªã‚‚ã®ã¯å®Ÿéš›ã«ã„ã˜ã£ã¦
ã¿ã‚‹ã®ãŒä¸€ç•ªã§ã™ã€‚
</p>

<h2>実際ã®è©±</h2>
<p>
実際㫠Racc ã‚’ã©ã®ã‚ˆã†ã«ä½¿ã†ã‹ã¨ã„ã†è©±ã‚’ã—ã¾ã™ã€‚Racc ã«ã¯ç‹¬è‡ªã®ã‚½ãƒ¼ã‚¹
コードã¿ãŸã„ãªã‚‚ã®ãŒã‚ã£ã¦ã€ã“ã®ä¸­ã«å‡¦ç†ã—ãŸã„「構造ã€ã‚’記述ã—ã¦ãŠãã¾
ã™ã€‚ã“ã®ã‚½ãƒ¼ã‚¹ãƒ•ァイルを「文法ファイルã€ã¨å‘¼ã¶ã“ã¨ã«ã—ã¾ã—ょã†ã€‚ã“ã®æ–‡
法ファイルã®åå‰ãŒ parse.y ã¨ä»®å®šã™ã‚‹ã¨ã€ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ã‹ã‚‰ä»¥ä¸‹ã®ã‚ˆã†
ã«æ‰“ã¡ã“ã‚ã°ã€ãã®æ§‹é€ ã‚’処ç†ã™ã‚‹ãŸã‚ã®ã‚¯ãƒ©ã‚¹ã‚’å«ã‚“ã ãƒ•ァイルãŒå¾—られã¾
ã™ã€‚
</p>
<pre>
$ racc parse.y
</pre>
<p>
生æˆã•れるファイルã¯ãƒ‡ãƒ•ォルトã§ã¯ "ファイルå.tab.rb" ã§ã™ã€‚ä»–ã®åå‰
ã«ã—ãŸã„ãªã‚‰ã€-o オプションã§å¤‰æ›´ã§ãã¾ã™ã€‚
</p>
<pre>
$ racc parse.y -o myparser.rb
</pre>
<p>
ã“ã®ã‚ˆã†ã«ã—ã¦ä½œã£ãŸã‚¯ãƒ©ã‚¹ã€ã¾ãŸã¯ãã®ã‚ˆã†ãªå‡¦ç†ã‚’担当ã™ã‚‹ãƒ‘ートã€
ã®ã“ã¨ã¯ãƒ‘ーサ (parser) ã¨å‘¼ã¶ã“ã¨ã«ãªã£ã¦ã„ã¾ã™ã€‚è§£æžã™ã‚‹ãƒ¤ãƒ„ã€
ã¨ã„ã†ãらã„ã«é©å½“ã«ã¨ã‚‰ãˆã¦ãã ã•ã„。
</p>

<h2>文法ファイルを書ã</h2>
<p>
Racc ã¯æ–‡æ³•ファイルã‹ã‚‰ Ruby ã®ã‚¯ãƒ©ã‚¹ã‚’生æˆã™ã‚‹ãƒ„ールã ã¨è¨€ã„ã¾ã—ãŸã€‚
ãã®ã‚¯ãƒ©ã‚¹ã¯å…¨ã¦ Racc::Parser ã®ä¸‹ä½ã‚¯ãƒ©ã‚¹ã§ã€åå‰ã¯æ–‡æ³•ファイル中ã§
指定ã—ã¾ã™ã€‚以下ã€ã“ã“ã«æ›¸ãã¹ãã“ã¨ãŒã€Œãªã‚“ãªã®ã‹ã€ã‚’説明ã—ã¾ã™ã€‚
ã“ã“ã§ã¯å†…容ã«é‡ç‚¹ã‚’ç½®ãã®ã§ã€æ–‡æ³•ãƒ•ã‚¡ã‚¤ãƒ«è‡ªä½“ã®æ–‡æ³•ã®è©³ç´°ã¯
<a href="grammar.html">文法リファレンス</a>を見ã¦ãã ã•ã„。
</p>

<h3>文法</h3>
<p>
ã¾ãšã¯ã€å…¨ä½“ã®æ¦‚å½¢ã§ã™ã€‚
</p>
<pre>
class MyParser
rule

  if_stmt: IF expr then stmt_list elsif else END

  then   : THEN
         |

  elsif  :
         | ELSIF stmt_list

  else   :
         | ELSE stmt_list

  expr   : NUMBER
         | IDENT
         | STRING

  stmt_list : ãµã«ã‚ƒãµã«ã‚ƒ

end
</pre>
<p>
Ruby スクリプトã®ã‚ˆã†ã« class ã§ãƒ‘ーサクラスåを指定ã—ã€rule ... end 
ã®é–“ã«ãƒ‘ーサã«è§£æžã•ã›ãŸã„文法を記述ã—ã¾ã™ã€‚
</p>
<p>
文法ã¯ã€è¨˜å·ã®ä¸¦ã³ã§ã‚‚ã£ã¦è¡¨ã—ã¾ã™ã€‚rule ... end ã®é–“ã«ã‚るコロンã¨ãƒãƒ¼
以外ã®ã‚‚ã®ã€if_stmt IF expr then ãªã©ãŒå…¨ã¦ã€Œè¨˜å·ã€ã§ã™ã€‚ãã—ã¦ã‚³ãƒ­ãƒ³
ãŒæ—¥æœ¬èªžã§è¨€ã†ã€Œã€œã¯Ã—×ã ã€ã®ã€Œã¯ã€ã¿ãŸã„ãªã‚‚ã‚“ã§ã€ãã®å·¦ã®è¨˜å·ãŒå³ã®
記å·ã®åˆ—ã¨åŒã˜ã‚‚ã®ã‚’指ã™ã€ã¨ã„ã†ãµã†ã«å®šç¾©ã—ã¾ã™ã€‚ã¾ãŸã€ãƒãƒ¼ã¯ã€Œã¾ãŸã¯ã€
ã‚’æ„味ã—ã¾ã™ã€‚ãれã¨ã€å˜ç´”ã«ã‚³ãƒ­ãƒ³ã®å·¦ã®è¨˜å·ã®ã“ã¨ã‚’左辺ã€å³ã‚’å³è¾ºã¨ã‚‚
言ã„ã¾ã™ã€‚以下ã¯ã“ã¡ã‚‰ã®ã»ã†ã‚’使ã£ã¦èª¬æ˜Žã—ã¾ã—ょã†ã€‚
</p>
<p>
å°‘ã—æ³¨æ„ãŒå¿…è¦ãªç‚¹ã‚’è¿°ã¹ã¾ã™ã€‚ã¾ãšã€then ã®ã€ãƒãƒ¼ã®ã‚ã¨ã®å®šç¾© (è¦å‰‡) ã‚’
見ã¦ãã ã•ã„。ã“ã“ã«ã¯ä½•も書ã„ã¦ã„ãªã„ã®ã§ã€ã“れã¯ãã®é€šã‚Šã€Œç„¡ã€ã§ã‚ã£
ã¦ã‚‚ã„ã„ã€ã¨ã„ã†ã“ã¨ã‚’表ã—ã¦ã„ã¾ã™ã€‚ã¤ã¾ã‚Šã€then ã¯è¨˜å· THEN 一個ã‹ã€
ã¾ãŸã¯ãªã«ã‚‚ãªã—(çœç•¥ã™ã‚‹)ã§ã‚ˆã„ã€ã¨ã„ã†ã“ã¨ã§ã™ã€‚è¨˜å· then ã¯å®Ÿéš›ã® 
Ruby ã®ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã«ã‚ã‚‹ then ã¨ã¯åˆ‡ã‚Šé›¢ã—ã¦è€ƒãˆã¾ã—ょã†
(ãれã¯å®Ÿã¯å¤§æ–‡å­—ã®è¨˜å· THEN ãŒè¡¨ã—ã¦ã„ã¾ã™)。
</p>
<p>
ã•ã¦ã€ãã‚ãã‚「記å·ã€ã¨ã„ã†ã‚‚ã®ãŒãªã‚“ãªã®ã‹æ›¸ãã¾ã—ょã†ã€‚
ãŸã ã—順番ã«è©±ã‚’ã—ãªã„ã¨ã„ã‘ãªã„ã®ã§ã€ã¾ãšã¯èžã„ã¦ã„ã¦ãã ã•ã„。
ã“ã®æ–‡ç« ã®æœ€åˆã«ã€ãƒ‘ーサã¨ã¯æ–‡å­—ã®åˆ—ã‹ã‚‰æ§‹é€ ã‚’見出ã™éƒ¨åˆ†ã ã¨è¨€ã„ã¾ã—ãŸã€‚
ã—ã‹ã—文字ã®åˆ—ã‹ã‚‰ã„ããªã‚Šæ§‹é€ ã‚’探ã™ã®ã¯é¢å€’ãªã®ã§ã€å®Ÿéš›ã«ã¯ã¾ãš
文字ã®åˆ—ã‚’å˜èªžã®åˆ—ã«åˆ†å‰²ã—ã¾ã™ã€‚ãã®æ™‚点ã§ã‚¹ãƒšãƒ¼ã‚¹ã‚„ã‚³ãƒ¡ãƒ³ãƒˆã¯æ¨ã¦ã¦
ã—ã¾ã„ã€ä»¥é™ã¯ç´”粋ã«ãƒ—ログラムã®ä¸€éƒ¨ã‚’ãªã™éƒ¨åˆ†ã ã‘を相手ã«ã—ã¾ã™ã€‚
ãŸã¨ãˆã°æ–‡å­—列ã®å…¥åŠ›ãŒæ¬¡ã®ã‚ˆã†ã ã£ãŸã¨ã™ã‚‹ã¨ã€
</p>
<pre>
if flag then   # item found.
  puts 'ok'
end
</pre>
<p>
å˜èªžã®åˆ—ã¯æ¬¡ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚
</p>
<pre>
if flag then puts 'ok' end
</pre>
<p>
ã“ã“ã§ã€å·¥å¤«ãŒå¿…è¦ã§ã™ã€‚ã©ã†ã‚„ら flag ã¯ãƒ­ãƒ¼ã‚«ãƒ«å¤‰æ•°åã ã¨æ€ã‚れã¾ã™ãŒã€
変数åã¨ã„ã†ã®ã¯ä»–ã«ã‚‚ã„ã‚ã„ã‚ã‚りã¾ã™ã€‚ã—ã‹ã—åå‰ãŒ i ã ã‚ã†ãŒ a ã ã‚
ã†ãŒ vvvvvvvvvvvv ã ã‚ã†ãŒã€ã€Œæ§‹é€ ã€ã¯åŒã˜ã§ã™ã€‚ã¤ã¾ã‚ŠåŒã˜æ‰±ã„ã‚’ã•れる
ã¹ãã§ã™ã€‚変数 a を書ã‘る場所ãªã‚‰ b も書ã‘ãªãã¦ã¯ã„ã‘ã¾ã›ã‚“。ã ã£ãŸã‚‰
一時的ã«åŒã˜åå‰ã§èª­ã‚“ã§ã‚‚ã„ã„ã˜ã‚ƒã‚“。ã¨ã„ã†ã“ã¨ã§ã€ã“ã®å˜èªžã®åˆ—を以下
ã®ã‚ˆã†ã«èª­ã¿ã‹ãˆã¾ã—ょã†ã€‚
</p>
<pre>
IF IDENT THEN IDENT STRING END
</pre>
<p>
ã“れãŒã€Œè¨˜å·ã€ã®åˆ—ã§ã™ã€‚パーサã§ã¯ã“ã®è¨˜å·åˆ—ã®ã»ã†ã‚’扱ã„ã€æ§‹é€ ã‚’見付ã‘
ã¦ã„ãã¾ã™ã€‚
</p>
<p>
ã•らã«è¨˜å·ã«ã¤ã„ã¦è¦‹ã¦ã„ãã¾ã—ょã†ã€‚
記å·ã¯äºŒç¨®é¡žã«åˆ†ã‘られã¾ã™ã€‚「左辺ã«ã‚る記å·ã€ã¨ã€Œãªã„記å·ã€ã§ã™ã€‚
左辺ã«ã‚る記å·ã¯ã€Œéžçµ‚端ã€è¨˜å·ã¨è¨€ã„ã¾ã™ã€‚ãªã„ã»ã†ã¯ã€Œçµ‚端ã€è¨˜å·ã¨
言ã„ã¾ã™ã€‚最åˆã®ä¾‹ã§ã¯çµ‚端記å·ã¯ã™ã¹ã¦å¤§æ–‡å­—ã€éžçµ‚端記å·ã¯å°æ–‡å­—ã§
書ã„ã¦ã‚ã‚‹ã®ã§ã€ã‚‚ã†ä¸€åº¦æˆ»ã£ã¦ä¾‹ã®æ–‡æ³•を見ã¦ãã ã•ã„。
</p>
<p>
ãªãœã“ã®åŒºåˆ†ãŒé‡è¦ã‹ã¨è¨€ã†ã¨ã€å…¥åŠ›ã®è¨˜å·åˆ—ã¯ã™ã¹ã¦çµ‚端記å·ã ã‹ã‚‰ã§ã™ã€‚
一方ã€éžçµ‚端記å·ã¯ãƒ‘ーサã®ä¸­ã§ã ã‘ã€çµ‚端記å·ã®åˆ—ã‹ã‚‰ã€Œä½œã‚Šã ã™ã€ã“ã¨ã«
よã£ã¦å§‹ã‚ã¦å­˜åœ¨ã—ã¾ã™ã€‚例ãˆã°æ¬¡ã®è¦å‰‡ã‚’ã‚‚ã†ä¸€åº¦è¦‹ã¦ãã ã•ã„。
</p>
<pre>
  expr   : NUMBER
         | IDENT
         | STRING
</pre>
<p>
expr 㯠NUMBER ã‹ IDENT ã‹ STRING ã ã¨è¨€ã£ã¦ã„ã¾ã™ã€‚逆ã«è¨€ã†ã¨ã€
IDENT 㯠expr ã«ã€Œãªã‚‹ã“ã¨ãŒã§ãã¾ã™ã€ã€‚文法上 expr ãŒå­˜åœ¨ã§ãã‚‹
場所㫠IDENT ãŒæ¥ã‚‹ã¨ã€ãれ㯠expr ã«ãªã‚Šã¾ã™ã€‚例ãˆã° if ã®æ¡ä»¶å¼ã®
部分㯠expr ã§ã™ã‹ã‚‰ã€ã“ã“ã« IDENT ãŒã‚る㨠expr ã«ãªã‚Šã¾ã™ã€‚ãã®
よã†ã«æ–‡æ³•çš„ã«ã€Œå¤§ãã„ã€è¨˜å·ã‚’作ã£ã¦ã„ã£ã¦ã€æœ€çµ‚çš„ã«ä¸€å€‹ã«ãªã‚‹ã¨ã€
ãã®å…¥åŠ›ã¯æ–‡æ³•を満ãŸã—ã¦ã„ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚実際ã«ã•ã£ãã®å…¥åŠ›ã§
試ã—ã¦ã¿ã¾ã—ょã†ã€‚入力ã¯ã“ã†ã§ã—ãŸã€‚
</p>
<pre>
IF IDENT THEN IDENT STRING END
</pre>
<p>
ã¾ãšã€IDENT ㌠expr ã«ãªã‚Šã¾ã™ã€‚
</p>
<pre>
IF expr THEN IDENT STRING END
</pre>
<p>
次㫠THEN ㌠then ã«ãªã‚Šã¾ã™ã€‚
</p>
<pre>
IF expr then IDENT STRING END
</pre>
<p>
IDENT STRING ãŒãƒ¡ã‚½ãƒƒãƒ‰ã‚³ãƒ¼ãƒ«ã«ãªã‚Šã¾ã™ã€‚ã“ã®å®šç¾©ã¯ã•ãã»ã©ã®ä¾‹ã«ã¯
ãªã„ã§ã™ãŒã€å®Ÿã¯çœç•¥ã•れã¦ã„ã‚‹ã‚“ã ã¨è€ƒãˆã¦ãã ã•ã„。ãã—ã¦ã„ã‚ã„ã‚ãª
éŽç¨‹ã‚’経ã¦ã€æœ€çµ‚çš„ã«ã¯ stmt_list (æ–‡ã®ãƒªã‚¹ãƒˆ)ã«ãªã‚Šã¾ã™ã€‚
</p>
<pre>
IF expr then stmt_list END
</pre>
<p>
elsif 㨠else ã¯çœç•¥ã§ãã‚‹ã€ã¤ã¾ã‚Šç„¡ã‹ã‚‰ç”Ÿæˆã§ãã¾ã™ã€‚
</p>
<pre>
IF expr then stmt_list elsif else END
</pre>
<p>
最後㫠if_stmt を作りã¾ã™ã€‚
</p>
<pre>
if_stmt
</pre>
<p>
ã¨ã„ã†ã“ã¨ã§ã²ã¨ã¤ã«ãªã‚Šã¾ã—ãŸã€‚
ã¤ã¾ã‚Šã“ã®å…¥åŠ›ã¯æ–‡æ³•çš„ã«æ­£ã—ã„ã¨ã„ã†ã“ã¨ãŒã‚ã‹ã‚Šã¾ã—ãŸã€‚
</p>

<h3>アクション</h3>
<p>
ã“ã“ã¾ã§ã§å…¥åŠ›ã®æ–‡æ³•ãŒæ­£ã—ã„ã‹ã©ã†ã‹ã‚’確èªã™ã‚‹æ–¹æ³•ã¯ã‚ã‹ã‚Šã¾ã—ãŸãŒã€
ã“れã ã‘ã§ã¯ãªã‚“ã«ã‚‚ãªã‚Šã¾ã›ã‚“。最åˆã«èª¬æ˜Žã—ãŸã‚ˆã†ã«ã€ã“ã“ã¾ã§ã§ã¯
構造ãŒè¦‹ãˆãŸã ã‘ã§ã€ãƒ—ログラムã¯ã€Œæ„味ã€ã‚’ç†è§£ã§ãã¾ã›ã‚“。ãã—ã¦ãã®
部分㯠Racc ã§ã¯è‡ªå‹•処ç†ã§ããªã„ã®ã§ã€äººé–“ãŒæ›¸ãã€ã¨ã‚‚言ã„ã¾ã—ãŸã€‚
ãれを書ãã®ãŒä»¥ä¸‹ã«èª¬æ˜Žã™ã‚‹ã€Œã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã€ã¨ã„ã†éƒ¨åˆ†ã§ã™ã€‚
</p>
<p>
å‰é …ã§ã€è¨˜å·ã®åˆ—ãŒã ã‚“ã ã‚“ã¨å¤§ããªå˜ä½ã«ã¾ã¨ã‚られã¦ã„ãéŽç¨‹ã‚’見ã¾ã—ãŸã€‚
ãã®ã¾ã¨ã‚る時ã«ã€åŒæ™‚ã«ãªã«ã‹ã‚’やらã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ãれãŒ
アクションã§ã™ã€‚アクションã¯ã€æ–‡æ³•ファイルã§ä»¥ä¸‹ã®ã‚ˆã†ã«æ›¸ãã¾ã™ã€‚
</p>
<pre>
class MyParser
rule

  if_stmt: IF expr then stmt_list elsif else END
             { puts 'if_stmt found' }

  then   : THEN
             { puts 'then found' }
         |
             { puts 'then is omitted' }

  elsif  :
             { puts 'elsif is omitted' }
         | ELSIF stmt_list
             { puts 'elsif found' }

  else   :
             { puts 'else omitted' }
         | ELSE stmt_list
             { puts 'else found' }

  expr   : NUMBER
             { puts 'expr found (NUMBER)' }
         | IDENT
             { puts 'expr found (IDENT)' }
         | STRING
             { puts 'expr found (STRING)' }

  stmt_list : ãµã«ã‚ƒãµã«ã‚ƒ

end
</pre>
<p>
見ã¦ã®ã¨ãŠã‚Šã€è¦å‰‡ã®ã‚ã¨ã« { 㨠} ã§å›²ã‚“ã§æ›¸ãã¾ã™ã€‚
アクションã«ã¯ã ã„ãŸã„好ããªã‚ˆã†ã« Ruby ã‚¹ã‚¯ãƒªãƒ—ãƒˆãŒæ›¸ã‘ã¾ã™ã€‚
</p>
<p>
(ã“ã®ç¯€ã€æœªå®Œ)
</p>
<hr>

<p>
yacc ã§ã® <code>$$</code> 㯠Racc ã§ã¯ãƒ­ãƒ¼ã‚«ãƒ«å¤‰æ•° <code>result</code>
ã§ã€<code>$1,$2...</code> ã¯é…列 <var>val</var>ã§ã™ã€‚
<code>result</code> 㯠<code>val[0]</code> ($1) ã®å€¤ã«åˆæœŸåŒ–ã•れã€
アクションを抜ã‘ãŸã¨ãã® <code>result</code> ã®å€¤ãŒå·¦è¾ºå€¤ã«ãªã‚Šã¾ã™ã€‚
Racc ã§ã¯ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ä¸­ã® <code>return</code> ã¯ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‹ã‚‰æŠœã‘ã‚‹ã ã‘ã§ã€
パース自体ã¯çµ‚ã‚りã¾ã›ã‚“。アクション中ã‹ã‚‰ãƒ‘ースを終了ã™ã‚‹ã«ã¯ã€
メソッド <code>yyaccept</code> を使ã£ã¦ãã ã•ã„。
</p>
<p>
演算å­ã®å„ªå…ˆé †ä½ã€ã‚¹ã‚¿ãƒ¼ãƒˆãƒ«ãƒ¼ãƒ«ãªã©ã® yacc ã®ä¸€èˆ¬çš„ãªæ©Ÿèƒ½ã‚‚用æ„ã•れã¦
ã„ã¾ã™ã€‚ãŸã ã—ã“ã¡ã‚‰ã‚‚å°‘ã—æ–‡æ³•ãŒé•ã„ã¾ã™ã€‚
</p>
<p>
yacc ã§ã¯ç”Ÿæˆã•れãŸã‚³ãƒ¼ãƒ‰ã«ç›´æŽ¥è»¢å†™ã•れるコードãŒã‚りã¾ã—ãŸã€‚
Racc ã§ã‚‚åŒã˜ã‚ˆã†ã«ã€ãƒ¦ãƒ¼ã‚¶æŒ‡å®šã®ã‚³ãƒ¼ãƒ‰ãŒæ›¸ã‘ã¾ã™ã€‚
Racc ã§ã¯ã‚¯ãƒ©ã‚¹ã‚’生æˆã™ã‚‹ã®ã§ã€ã‚¯ãƒ©ã‚¹å®šç¾©ã®å‰/中/後ã®ä¸‰å€‹æ‰€ãŒã‚りã¾ã™ã€‚
Racc ã§ã¯ãれを上ã‹ã‚‰é †ç•ªã« header inner footer ã¨å‘¼ã‚“ã§ã„ã¾ã™ã€‚
</p>

<h3>ユーザãŒç”¨æ„ã™ã¹ãコード</h3>
<p>
パースã®ã‚¨ãƒ³ãƒˆãƒªãƒã‚¤ãƒ³ãƒˆã¨ãªã‚‹ãƒ¡ã‚½ãƒƒãƒ‰ã¯äºŒã¤ã‚りã¾ã™ã€‚ã²ã¨ã¤ã¯ 
<code>do_parse</code>ã§ã€ã“ã¡ã‚‰ã¯ãƒˆãƒ¼ã‚¯ãƒ³ã‚’ 
<code>Parser#next_token</code> ã‹ã‚‰å¾—ã¾ã™ã€‚ã‚‚ã†ã²ã¨ã¤ã¯ 
<code>yyparse</code> ã§ã€ã“ã¡ã‚‰ã¯ã‚¹ã‚­ãƒ£ãƒŠã‹ã‚‰ <code>yield</code> ã•れ
ã‚‹ã“ã¨ã«ã‚ˆã£ã¦ãƒˆãƒ¼ã‚¯ãƒ³ã‚’å¾—ã¾ã™ã€‚ユーザå´ã§ã¯ã“ã®ã©ã¡ã‚‰ã‹(両方ã§ã‚‚ã„ã„
ã‘ã©)ã‚’èµ·å‹•ã™ã‚‹ç°¡å˜ãªãƒ¡ã‚½ãƒƒãƒ‰ã‚’ inner ã«æ›¸ã„ã¦ãã ã•ã„。ã“れらメソッド
ã®å¼•æ•°ãªã©ã€è©³ã—ã„ã“ã¨ã¯ãƒªãƒ•ァレンスを見ã¦ãã ã•ã„。
</p>
<ul>
<li><a href="parser.html#Racc%3a%3aParser-do_parse">do_parse</a>
<li><a href="parser.html#Racc%3a%3aParser-yyparse">yyparse</a>
</ul>
<p>
ã©ã¡ã‚‰ã®ãƒ¡ã‚½ãƒƒãƒ‰ã«ã‚‚共通ãªã®ã¯ãƒˆãƒ¼ã‚¯ãƒ³ã®å½¢å¼ã§ã™ã€‚å¿…ãšãƒˆãƒ¼ã‚¯ãƒ³ã‚·ãƒ³ãƒœãƒ«
ã¨ãã®å€¤ã®äºŒè¦ç´ ã‚’æŒã¤é…列を返ã™ã‚ˆã†ã«ã—ã¾ã™ã€‚ã¾ãŸã‚¹ã‚­ãƒ£ãƒ³ãŒçµ‚了ã—ã¦ã€
ã‚‚ã†é€ã‚‹ã‚‚ã®ãŒãªã„å ´åˆã¯ <code>[false,<var>ãªã«ã‹</var>]</code> ã‚’è¿”ã—
ã¦ãã ã•ã„。ã“れã¯ä¸€å›žè¿”ã›ã°å分ã§ã™ (逆ã«ã€<code>yyparse</code> を使
ã†å ´åˆã¯äºŒå›žä»¥ä¸Š <code>yield</code> ã—ã¦ã¯ã„ã‘ãªã„)。
</p>
<p>
パーサã¯åˆ¥ã«æ–‡å­—列処ç†ã«ã ã‘使ã‚れるもã®ã§ã¯ã‚りã¾ã›ã‚“ãŒã€å®Ÿéš›å•題ã¨ã—
ã¦ã€ãƒ‘ーサを作る場é¢ã§ã¯ãŸã„ã¦ã„文字列ã®ã‚¹ã‚­ãƒ£ãƒŠã¨ã‚»ãƒƒãƒˆã§ä½¿ã†ã“ã¨ãŒå¤š
ã„ã§ã—ょã†ã€‚Ruby ãªã‚‰ã‚¹ã‚­ãƒ£ãƒŠãã‚‰ã„æ¥½å‹ã§ä½œã‚Œã¾ã™ãŒã€é«˜é€Ÿãªã‚¹ã‚­ãƒ£ãƒŠã¨
ãªã‚‹ã¨å®Ÿã¯é›£ã—ã‹ã£ãŸã‚Šã—ã¾ã™ã€‚ãã“ã§é«˜é€Ÿãªã‚¹ã‚­ãƒ£ãƒŠã‚’作æˆã™ã‚‹ãŸã‚ã®ãƒ©ã‚¤
ブラリも作ã£ã¦ã„ã¾ã™ã€‚詳ã—ãã¯
<a href="#WritingScanner">「スキャナを作るã€ã®é …</a>を見ã¦ãã ã•ã„。
</p>
<p>
Racc ã«ã¯ error トークンを使ã£ãŸã‚¨ãƒ©ãƒ¼å›žå¾©æ©Ÿèƒ½ã‚‚ã‚りã¾ã™ã€‚yacc ã®
<code>yyerror()</code> 㯠Racc ã§ã¯
<a href="parser.html#Racc%3a%3aParser-on_error"><code>Racc::Parser#on_error</code></a>
ã§ã€ã‚¨ãƒ©ãƒ¼ãŒèµ·ããŸãƒˆãƒ¼ã‚¯ãƒ³ã¨ãã®å€¤ã€å€¤ã‚¹ã‚¿ãƒƒã‚¯ã€ã®ä¸‰ã¤ã®å¼•æ•°ã‚’ã¨ã‚Šã¾ã™ã€‚
<code>on_error</code> ã®ãƒ‡ãƒ•ォルトã®å®Ÿè£…ã¯ä¾‹å¤–
<code>Racc::ParseError</code> を発生ã—ã¾ã™ã€‚
</p>
<p>
ユーザãŒã‚¢ã‚¯ã‚·ãƒ§ãƒ³ä¸­ã§ãƒ‘ースエラーを発見ã—ãŸå ´åˆã¯ã€ãƒ¡ã‚½ãƒƒãƒ‰
<a href="parser.html#Racc%3a%3aParser-yyerror"><code>yyerror</code></a>
を呼ã¹ã°ãƒ‘ーサãŒã‚¨ãƒ©ãƒ¼å›žå¾©ãƒ¢ãƒ¼ãƒ‰ã«å…¥ã‚Šã¾ã™ã€‚
ãŸã ã—ã“ã®ã¨ã <code>on_error</code>ã¯å‘¼ã°ã‚Œã¾ã›ã‚“。
</p>

<h3>パーサを生æˆã™ã‚‹</h3>
<p>
ã“れã ã‘ã‚れã°ã ã„ãŸã„書ã‘ã‚‹ã¨æ€ã„ã¾ã™ã€‚ã‚ã¨ã¯ã€æœ€åˆã«ç¤ºã—ãŸæ–¹æ³•ã§æ–‡æ³•
ファイルを処ç†ã—ã€Ruby スクリプトを得ã¾ã™ã€‚
</p>
<p>
ã†ã¾ãã„ã‘ã°ã„ã„ã®ã§ã™ãŒã€å¤§ãã„ã‚‚ã®ã ã¨æœ€åˆã‹ã‚‰ã¯ã†ã¾ãã„ã‹ãªã„ã§ã—ょ
ã†ã€‚racc ã« -g オプションをã¤ã‘ã¦ã‚³ãƒ³ãƒ‘イルã—ã€@yydebug ã‚’ true ã«ã™ã‚‹
ã¨ãƒ‡ãƒãƒƒã‚°ç”¨ã®å‡ºåŠ›ãŒå¾—られã¾ã™ã€‚デãƒãƒƒã‚°å‡ºåŠ›ã¯ãƒ‘ーサ㮠@racc_debug_out 
ã«å‡ºåŠ›ã•れã¾ã™(デフォルト㯠stderr)。ã¾ãŸã€racc ã« -v オプションをã¤ã‘
ã‚‹ã¨ã€çŠ¶æ…‹é·ç§»è¡¨ã‚’読ã¿ã‚„ã™ã„å½¢ã§å‡ºåŠ›ã—ãŸãƒ•ァイル(*.output)ãŒå¾—られã¾ã™ã€‚
ã©ã¡ã‚‰ã‚‚デãƒãƒƒã‚°ã®å‚考ã«ãªã‚‹ã§ã—ょã†ã€‚
</p>


<h2>作ã£ãŸãƒ‘ーサをé…布ã™ã‚‹</h2>
<p>
Racc ã®ç”Ÿæˆã—ãŸãƒ‘ーサã¯å‹•作時ã«ãƒ©ãƒ³ã‚¿ã‚¤ãƒ ãƒ«ãƒ¼ãƒãƒ³ãŒå¿…è¦ã§ã™ã€‚
具体的ã«ã¯ parser.rb 㨠cparse.so ã§ã™ã€‚
ãŸã ã— cparse.so ã¯å˜ã«ãƒ‘ースを高速化ã™ã‚‹ãŸã‚ã®ãƒ©ã‚¤ãƒ–ラリãªã®ã§
å¿…é ˆã§ã¯ã‚りã¾ã›ã‚“。ãªãã¦ã‚‚å‹•ãã¾ã™ã€‚
</p>
<p>
ã¾ãš Ruby 1.8.0 以é™ã«ã¯ã“ã®ãƒ©ãƒ³ã‚¿ã‚¤ãƒ ãŒæ¨™æº–添付ã•れã¦ã„ã‚‹ã®ã§ã€
Ruby 1.8 ãŒã‚る環境ãªã‚‰ã°ãƒ©ãƒ³ã‚¿ã‚¤ãƒ ã«ã¤ã„ã¦è€ƒæ…®ã™ã‚‹å¿…è¦ã¯ã‚りã¾ã›ã‚“。
Racc 1.4.x ã®ãƒ©ãƒ³ã‚¿ã‚¤ãƒ ã¨ Ruby 1.8 ã«æ·»ä»˜ã•れã¦ã„るランタイムã¯
完全互æ›ã§ã™ã€‚
</p>
<p>
å•題㯠Ruby 1.8 を仮定ã§ããªã„å ´åˆã§ã™ã€‚ 
Racc をユーザã¿ã‚“ãªã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ã¦ã‚‚らã†ã®ã‚‚一ã¤ã®æ‰‹ã§ã™ãŒã€
ã“れã§ã¯ä¸è¦ªåˆ‡ã§ã™ã€‚ãã“ã§Racc ã§ã¯å›žé¿ç­–を用æ„ã—ã¾ã—ãŸã€‚
</p>
<p>
racc ã« -E オプションをã¤ã‘ã¦ã‚³ãƒ³ãƒ‘イルã™ã‚‹ã¨ã€
パーサ㨠racc/parser.rb ã‚’åˆä½“ã—ãŸãƒ•ァイルを出力ã§ãã¾ã™ã€‚
ã“れãªã‚‰ã°ãƒ•ァイルã¯ä¸€ã¤ã ã‘ãªã®ã§ç°¡å˜ã«æ‰±ãˆã¾ã™ã€‚
racc/parser.rb ã¯æ“¬ä¼¼çš„ã« require ã—ãŸã‚ˆã†ãªæ‰±ã„ã«ãªã‚‹ã®ã§ã€
ã“ã®å½¢å¼ã®ãƒ‘ーサãŒè¤‡æ•°ã‚ã£ãŸã¨ã—ã¦ã‚‚クラスやメソッドãŒè¡çªã™ã‚‹ã“ã¨ã‚‚ã‚りã¾ã›ã‚“。
ãŸã ã— -E を使ã£ãŸå ´åˆã¯ cparse.so ãŒä½¿ãˆã¾ã›ã‚“ã®ã§ã€
å¿…ç„¶çš„ã«ãƒ‘ーサã®é€Ÿåº¦ã¯è½ã¡ã¾ã™ã€‚
</p>


<h2><a name="WritingScanner">ãŠã¾ã‘: スキャナを書ã</a></h2>
<p>
パーサを使ã†ã¨ãã¯ã€ãŸã„ã¦ã„文字列をトークンã«åˆ‡ã‚Šã‚ã‘ã¦ãれるスキャナ
ãŒå¿…è¦ã«ãªã‚Šã¾ã™ã€‚ã—ã‹ã—実㯠Ruby ã¯æ–‡å­—åˆ—ã®æœ€åˆã‹ã‚‰ãƒˆãƒ¼ã‚¯ãƒ³ã«åˆ‡ã‚Šã‚ã‘
ã¦ã„ãã¨ã„ã†ä½œæ¥­ãŒã‚ã¾ã‚Šå¾—æ„ã§ã¯ã‚りã¾ã›ã‚“。
正確ã«è¨€ã†ã¨ã€ç°¡å˜ã«ã§ãã‚‹ã®ã§ã™ãŒã€ãれãªã‚Šã®ã‚ªãƒ¼ãƒãƒ¼ãƒ˜ãƒƒãƒ‰ãŒã‹ã‹ã‚Šã¾ã™ã€‚
</p>
<p>
ãã®ã‚ªãƒ¼ãƒãƒ¼ãƒ˜ãƒƒãƒ‰ã‚’回é¿ã—ã¤ã¤ã€
手軽ã«ã‚¹ã‚­ãƒ£ãƒŠã‚’作れるよã†ã« strscan ã¨ã„ã†ãƒ‘ッケージを作りã¾ã—ãŸã€‚
Ruby 1.8 以é™ã«ã¯æ¨™æº–添付ã•れã¦ã„ã¾ã™ã—ã€
<a href="http://i.loveruby.net/ja/">筆者ã®ãƒ›ãƒ¼ãƒ ãƒšãƒ¼ã‚¸</a>ã«ã¯
å˜ä½“パッケージãŒã‚りã¾ã™ã€‚
</p>