\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: grammar.ja.rdoc

= è¦å‰‡ãƒ•ァイル文法リファレンス

== 文法ã«é–¢ã™ã‚‹å‰ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¨ã®éžäº’æ›

  * (1.2.5) ユーザーコードを連çµã™ã‚‹æ™‚ã€å¤–部ファイルよりも
            埋ã‚ã“ã‚“ã§ã‚るコードを先ã«é€£çµã—ã¾ã™ã€‚
  * (1.1.6) æ–°ã—ã„ディレクティブ options ãŒè¿½åŠ ã•れã¾ã—ãŸã€‚
  * (1.1.5) 予約語 token ã®æ„味ãŒå¤‰æ›´ã«ãªã‚Šã¾ã—ãŸã€‚
  * (0.14) ãƒ«ãƒ¼ãƒ«ã®æœ€å¾Œã®ã‚»ãƒŸã‚³ãƒ­ãƒ³ãŒçœç•¥å¯èƒ½ã«ãªã‚Šã¾ã—ãŸã€‚
           ã¾ãŸã€token prechigh ãªã©ãŒäºˆç´„語ã§ãªããªã‚Šã¾ã—ãŸã€‚
  * (10.2) prepare ㌠header ã« driver ㌠footer ã«ãªã‚Šã¾ã—ãŸã€‚
           今ã¯ãã®ã¾ã¾ã§ã‚‚使ãˆã¾ã™ãŒã€2.0 ã‹ã‚‰ã¯å¯¾å¿œã—ã¾ã›ã‚“。
  * (0.10) class ã«å¯¾å¿œã™ã‚‹ end ãŒãªããªã‚Šã¾ã—ãŸã€‚
  * (0.9) ダサダサã®ãƒ”リオド方å¼ã‚’ã‚„ã‚㦠{ 㨠} ã§å›²ã‚€ã‚ˆã†ã«ã—ã¾ã—ãŸã€‚

== å…¨ä½“ã®æ§‹é€ 

トップレベルã¯ã€è¦å‰‡éƒ¨ã¨ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚³ãƒ¼ãƒ‰éƒ¨ã«åˆ†ã‘られã¾ã™ã€‚
ユーザーコード部ã¯ã‚¯ãƒ©ã‚¹å®šç¾©ã®å¾Œã«æ¥ãªã‘れã°ã„ã‘ã¾ã›ã‚“。

=== コメント

文法ファイルã«ã¯ã€ä¸€éƒ¨ä¾‹å¤–を除ã„ã¦ã€ã»ã¨ã‚“ã©ã©ã“ã«ã§ã‚‚コメントを
書ãã“ã¨ãŒã§ãã¾ã™ã€‚コメントã¯ã€Rubyã® #.....(行末) スタイルã¨ã€
Cã® /*......*/ スタイルを使ã†ã“ã¨ãŒã§ãã¾ã™ã€‚

=== è¦å‰‡éƒ¨

è¦å‰‡éƒ¨ã¯ä»¥ä¸‹ã®ã‚ˆã†ãªå½¢ã‚’ã—ã¦ã„ã¾ã™ã€‚
--
class クラスå [< スーパークラス]
  [演算å­é †ä½]
  [トークン宣言]
  [オプション]
  [expect]
  [トークンシンボル値ãŠãã‹ãˆ]
  [スタートè¦å‰‡]
rule
  文法記述
--
"クラスå"ã¯ã“ã“ã§å®šç¾©ã™ã‚‹ãƒ‘ーサクラスã®åå‰ã§ã™ã€‚
ã“れã¯ãã®ã¾ã¾Rubyã®ã‚¯ãƒ©ã‚¹åã«ãªã‚Šã¾ã™ã€‚

ã¾ãŸ M::C ã®ã‚ˆã†ã«ã€Œ::ã€ã‚’使ã£ãŸåå‰ã‚’使ã†ã¨ã€ã‚¯ãƒ©ã‚¹å®šç¾©ã‚’
モジュール M ã®ä¸­ã«ãƒã‚¹ãƒˆã•ã›ã¾ã™ã€‚ã¤ã¾ã‚Š class M::C ãªã‚‰ã°
--
module M
  class C < Racc::Parser
    ã„ã‚ã„ã‚
  end
end
--
ã®ã‚ˆã†ã«å‡ºåŠ›ã—ã¾ã™ã€‚

ã•らã«ã€Ruby ã¨åŒã˜æ§‹æ–‡ã§ã‚¹ãƒ¼ãƒ‘ークラスを指定ã§ãã¾ã™ã€‚
ãŸã ã—ã“ã®æŒ‡å®šã‚’ã™ã‚‹ã¨ãƒ‘ーサã®å‹•作ã«é‡å¤§ãªå½±éŸ¿ã‚’与ãˆã‚‹ã®ã§ã€
特ã«å¿…è¦ãŒãªã„é™ã‚ŠæŒ‡å®šã—ã¦ã¯ã„ã‘ã¾ã›ã‚“。ã“れã¯å°†æ¥ã®æ‹¡å¼µã®
ãŸã‚ã«ç”¨æ„ã—ãŸã‚‚ã®ã§ã€ç¾åœ¨æŒ‡å®šã™ã‚‹å¿…然性ã¯ã‚ã¾ã‚Šã‚りã¾ã›ã‚“。

=== 文法ã®è¨˜è¿°

racc ã§ç”Ÿæˆã™ã‚‹ãƒ‘ーサãŒç†è§£ã§ãる文法を記述ã—ã¾ã™ã€‚
文法ã¯ã€äºˆç´„語 rule 㨠end ã®é–“ã«ã€ä»¥ä¸‹ã®ã‚ˆã†ãªæ›¸å¼ã§æ›¸ãã¾ã™ã€‚
--
トークン: トークンã®ä¸¦ã³ アクション

トークン: トークンã®ä¸¦ã³ アクション
        | トークンã®ä¸¦ã³ アクション
        | トークンã®ä¸¦ã³ アクション
             (å¿…è¦ãªã ã‘åŒã˜ã‚ˆã†ã«ã¤ã¥ã‘ã‚‹)
--
アクション㯠{ } ã§å›²ã¿ã¾ã™ã€‚アクションã§ã¯ Ruby ã®æ–‡ã¯ã»ã¨ã‚“ã©
使ãˆã¾ã™ãŒã€ä¸€éƒ¨ã ã‘ã¯éžå¯¾å¿œã§ã™ã€‚対応ã—ã¦ã„ãªã„ã‚‚ã®ã¯ä»¥ä¸‹ã®ã¨ãŠã‚Šã€‚

  * ヒアドキュメント
  * =begin ... =end 型コメント
  * スペースã§å§‹ã¾ã‚‹æ­£è¦è¡¨ç¾
  * ã”ãã¾ã‚Œã« % ã®æ¼”ç®—ã€‚æ™®é€šã«æ¼”ç®—å­ã®ã¾ã‚りã«ã‚¹ãƒšãƒ¼ã‚¹ã‚’入れã¦ã„れã°å•題ãªã—

ã“ã®ã‚ãŸã‚Šã«é–¢ã—ã¦ã¯å®Œå…¨ãªå¯¾å¿œã¯ã¾ãšç„¡ç†ã§ã™ã€‚ã‚ãらã‚ã¦ãã ã•ã„。

左辺ã®å€¤($$)ã¯ã€ã‚ªãƒ—ションã«ã‚ˆã£ã¦è¿”ã—æ–¹ãŒã‹ã‚りã¾ã™ã€‚ã¾ãšãƒ‡ãƒ•ォルトã§ã¯
ローカル変数 result (ãã®ãƒ‡ãƒ•ォルト値㯠val[0])㌠左辺値を表ã—ã€ã‚¢ã‚¯ã‚·ãƒ§ãƒ³
ブロックを抜ã‘ãŸæ™‚ã® result ã®å€¤ãŒå·¦è¾ºå€¤ã«ãªã‚Šã¾ã™ã€‚ã¾ãŸã¯æ˜Žç¤ºçš„ã« return
ã§è¿”ã—ãŸå ´åˆã‚‚ã“ã®å€¤ã«ãªã‚Šã¾ã™ã€‚一方ã€options ã§ no_result_var を指定ã—ãŸ
å ´åˆã€å·¦è¾ºå€¤ã¯ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ãƒ–ãƒ­ãƒƒã‚¯ã®æœ€å¾Œã®æ–‡ã®å€¤ã«ãªã‚Šã¾ã™ (Ruby ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¨
åŒã˜)。

ã©ã¡ã‚‰ã®å ´åˆã§ã‚‚アクションã¯çœç•¥ã§ãã€çœç•¥ã—ãŸå ´åˆã®å·¦è¾ºå€¤ã¯å¸¸ã« val[0] ã§ã™ã€‚

ä»¥ä¸‹ã«æ–‡æ³•記述ã®å…¨ä½“ã®ä¾‹ã‚’ã—ã‚ã—ã¾ã™ã€‚
--
rule
  goal: def ruls source
        {
          result = val
        }

  def : /* none */
        {
          result = []
        }
      | def startdesig
        {
          result[0] = val[1]
        }
      | def
          precrule   # ã“れã¯ä¸Šã®è¡Œã®ç¶šã
        {
          result[1] = val[1]
        }
(ç•¥)
--
アクション内ã§ã¯ç‰¹åˆ¥ãªæ„味をもã£ãŸå¤‰æ•°ãŒã„ãã¤ã‹ä½¿ãˆã¾ã™ã€‚
ãã®ã‚ˆã†ãªå¤‰æ•°ã‚’以下ã«ç¤ºã—ã¾ã™ã€‚括弧ã®ä¸­ã¯ yacc ã§ã®è¡¨è¨˜ã§ã™ã€‚

  * result ($$)

左辺ã®å€¤ã€‚åˆæœŸå€¤ã¯ val[0] ã§ã™ã€‚

  * val ($1,$2,$3…)

å³è¾ºã®è¨˜å·ã®å€¤ã®é…列。Ruby ã®é…列ãªã®ã§å½“然インデックスã¯ã‚¼ãƒ­ã‹ã‚‰å§‹ã¾ã‚Šã¾ã™ã€‚
ã“ã®é…åˆ—ã¯æ¯Žå›žä½œã‚‰ã‚Œã‚‹ã®ã§è‡ªç”±ã«å¤‰æ›´ã—ãŸã‚Šæ¨ã¦ãŸã‚Šã—ã¦æ§‹ã„ã¾ã›ã‚“。

  * _values (...,$-2,$-1,$0)

値スタック。Racc コアãŒä½¿ã£ã¦ã„るオブジェクトãŒãã®ã¾ã¾æ¸¡ã•れã¾ã™ã€‚
ã“ã®å¤‰æ•°ã®æ„味ãŒã‚ã‹ã‚‹äººä»¥å¤–ã¯<em>絶対ã«</em>変更ã—ã¦ã¯ã„ã‘ã¾ã›ã‚“。

ã¾ãŸã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã®ç‰¹åˆ¥ãªå½¢å¼ã«ã€åŸ‹ã‚ã“ã¿ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã¨ã„ã†ã‚‚ã®ãŒã‚りã¾ã™ã€‚
ã“れã¯ãƒˆãƒ¼ã‚¯ãƒ³åˆ—ã®é€”中ã®å¥½ããªã¨ã“ã‚ã«è¨˜è¿°ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
以下ã«åŸ‹ã‚ã“ã¿ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã®ä¾‹ã‚’示ã—ã¾ã™ã€‚
--
target: A B { puts 'test test' } C D { normal action }
--
ã“ã®ã‚ˆã†ã«è¨˜è¿°ã™ã‚‹ã¨ A B を検出ã—ãŸæ™‚点㧠puts ãŒå®Ÿè¡Œã•れã¾ã™ã€‚
ã¾ãŸã€åŸ‹ã‚ã“ã¿ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã¯ãれ自体ãŒå€¤ã‚’æŒã¡ã¾ã™ã€‚ã¤ã¾ã‚Šã€ä»¥ä¸‹ã®ä¾‹ã«ãŠã„ã¦
--
target: A { result = 1 } B { p val[1] }
--
最後ã«ã‚ã‚‹ p val[1] ã¯åŸ‹ã‚ã“ã¿ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã®å€¤ 1 を表示ã—ã¾ã™ã€‚
B ã®å€¤ã§ã¯ã‚りã¾ã›ã‚“。

æ„味的ã«ã¯ã€åŸ‹ã‚ã“ã¿ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã¯ç©ºã®è¦å‰‡ã‚’æŒã¤éžçµ‚端記å·ã‚’追加ã™ã‚‹ã“ã¨ã¨
å…¨ãåŒã˜åƒãã‚’ã—ã¾ã™ã€‚ã¤ã¾ã‚Šã€ä¸Šã®ä¾‹ã¯æ¬¡ã®ã‚³ãƒ¼ãƒ‰ã¨å®Œå…¨ã«åŒã˜æ„味ã§ã™ã€‚
--
target  : A nonterm B { p val[1] }
nonterm : /* 空ã®è¦å‰‡ */ { result = 1 }
--

=== 演算å­å„ªå…ˆé †ä½

ã‚るトークン上ã§ã‚·ãƒ•ト・還元è¡çªãŒãŠã“ã£ãŸã¨ãã€ãã®ãƒˆãƒ¼ã‚¯ãƒ³ã«
演算å­å„ªå…ˆé †ä½ãŒè¨­å®šã—ã¦ã‚ã‚‹ã¨è¡çªã‚’解消ã§ãã‚‹å ´åˆãŒã‚りã¾ã™ã€‚
ãã®ã‚ˆã†ãªã‚‚ã®ã¨ã—ã¦ç‰¹ã«æœ‰åãªã®ã¯æ•°å¼ã®æ¼”ç®—å­ã¨ if...else æ§‹æ–‡ã§ã™ã€‚

優先順ä½ã§è§£æ±ºã§ãる文法ã¯ã€ã†ã¾ã文法をãã¿ã‹ãˆã¦ã‚„れã°
優先順ä½ãªã—ã§ã‚‚åŒã˜åŠ¹æžœã‚’å¾—ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã—ã‹ã—ãŸã„ã¦ã„ã®
å ´åˆã¯å„ªå…ˆé †ä½ã‚’設定ã—ã¦è§£æ±ºã™ã‚‹ã»ã†ãŒæ–‡æ³•ã‚’ç°¡å˜ã«ã§ãã¾ã™ã€‚

シフト・還元è¡çªãŒãŠã“ã£ãŸã¨ãã€Racc ã¯ã¾ãšãã®è¦å‰‡ã«é †ä½ãŒè¨­å®š
ã•れã¦ã„ã‚‹ã‹èª¿ã¹ã¾ã™ã€‚è¦å‰‡ã®é †ä½ã¯ã€ãã®è¦å‰‡ã§ä¸€ç•ªã†ã—ã‚ã«ã‚ã‚‹
終端トークンã®å„ªå…ˆé †ä½ã§ã™ã€‚ãŸã¨ãˆã°
--
target: TERM_A nonterm_a TERM_B nonterm_b
--
ã®ã‚ˆã†ãªè¦å‰‡ã®é †ä½ã¯TERM_Bã®å„ªå…ˆé †ä½ã«ãªã‚Šã¾ã™ã€‚ã‚‚ã—TERM_Bã«
優先順ä½ãŒè¨­å®šã•れã¦ã„ãªã‹ã£ãŸã‚‰ã€å„ªå…ˆé †ä½ã§è¡çªã‚’解決ã™ã‚‹ã“ã¨ã¯
ã§ããªã„ã¨åˆ¤æ–­ã—ã€ã€ŒShift/Reduce conflictã€ã‚’報告ã—ã¾ã™ã€‚

演算å­ã®å„ªå…ˆé †ä½ã¯ã¤ãŽã®ã‚ˆã†ã«æ›¸ã„ã¦å®šç¾©ã—ã¾ã™ã€‚
--
prechigh
  nonassoc PLUSPLUS
  left     MULTI DIVIDE
  left     PLUS MINUS
  right    '='
preclow
--
prechigh ã«è¿‘ã„行ã«ã‚ã‚‹ã»ã©å„ªå…ˆé †ä½ã®é«˜ã„トークンã§ã™ã€‚上下をã¾ã‚‹ã”ã¨
ã•ã‹ã•ã¾ã«ã—㦠preclow...prechigh ã®é †ç•ªã«æ›¸ãã“ã¨ã‚‚ã§ãã¾ã™ã€‚left
ãªã©ã¯å¿…ãšè¡Œã®æœ€åˆã«ãªã‘れã°ã„ã‘ã¾ã›ã‚“。

left right nonassoc ã¯ãれãžã‚Œã€Œçµåˆæ€§ã€ã‚’表ã—ã¾ã™ã€‚çµåˆæ€§ã«ã‚ˆã£ã¦ã€
åŒã˜é †ä½ã®æ¼”ç®—å­ã®è¦å‰‡ãŒè¡çªã—ãŸå ´åˆã«ã‚·ãƒ•ト還元ã®ã©ã¡ã‚‰ã‚’ã¨ã‚‹ã‹ãŒ
決ã¾ã‚Šã¾ã™ã€‚ãŸã¨ãˆã°
--
a - b - c
--
ãŒ
--
(a - b) - c
--
ã«ãªã‚‹ã®ãŒå·¦çµåˆ (left) ã§ã™ã€‚å››å‰‡æ¼”ç®—ã¯æ™®é€šã“れã§ã™ã€‚
一方
--
a - (b - c)
--
ã«ãªã‚‹ã®ãŒå³çµåˆ (right) ã§ã™ã€‚代入ã®ã‚¯ã‚ªãƒ¼ãƒˆã¯æ™®é€š right ã§ã™ã€‚
ã¾ãŸã“ã®ã‚ˆã†ã«æ¼”ç®—å­ãŒé‡ãªã‚‹ã®ã¯ã‚¨ãƒ©ãƒ¼ã§ã‚ã‚‹å ´åˆã€éžçµåˆ (nonassoc) ã§ã™ã€‚
C 言語㮠++ ã‚„å˜é …ã®ãƒžã‚¤ãƒŠã‚¹ãªã©ãŒã“れã«ã‚ãŸã‚Šã¾ã™ã€‚

ã¨ã“ã‚ã§ã€èª¬æ˜Žã—ãŸã¨ãŠã‚Šé€šå¸¸ã¯é‚„å…ƒã™ã‚‹è¦å‰‡ã®æœ€å¾Œã®ãƒˆãƒ¼ã‚¯ãƒ³ãŒé †ä½ã‚’
決ã‚ã‚‹ã®ã§ã™ãŒã€ã‚ã‚‹è¦å‰‡ã«é™ã£ã¦ãã®ãƒˆãƒ¼ã‚¯ãƒ³ã¨ã¯é•ã†é †ä½ã«ã—ãŸã„ã“ã¨ã‚‚
ã‚りã¾ã™ã€‚例ãˆã°ç¬¦å·å転ã®ãƒžã‚¤ãƒŠã‚¹ã¯å¼•ãç®—ã®ãƒžã‚¤ãƒŠã‚¹ã‚ˆã‚Šé †ä½ã‚’高ã
ã—ãªã„ã¨ã„ã‘ã¾ã›ã‚“。ã“ã®ã‚ˆã†ãªå ´åˆ yacc ã§ã¯ %prec を使ã„ã¾ã™ã€‚
racc ã§ã¯ã‚¤ã‚³ãƒ¼ãƒ«è¨˜å·ã‚’使ã£ã¦åŒã˜ã“ã¨ã‚’ã§ãã¾ã™ã€‚
--
prechigh
  nonassoc UMINUS
  left '*' '/'
  left '+' '-'
preclow
(ç•¥)
exp: exp '*' exp
   | exp '-' exp
   | '-' exp     = UMINUS    # ã“ã“ã ã‘é †ä½ã‚’上ã’ã‚‹
--
ã“ã®ã‚ˆã†ã«è¨˜è¿°ã™ã‚‹ã¨ã€'-' exp ã®è¦å‰‡ã®é †ä½ãŒ UMINUS ã®é †ä½ã«ãªã‚Šã¾ã™ã€‚
ã“ã†ã™ã‚‹ã“ã¨ã§ç¬¦å·å転㮠'-' 㯠'*' よりも順ä½ãŒé«˜ããªã‚‹ã®ã§ã€
æ„図ã©ãŠã‚Šã«ãªã‚Šã¾ã™ã€‚

=== トークン宣言

トークン(終端記å·)ã®ã¤ã¥ã‚Šã‚’é–“é•ãˆã‚‹ã¨ã„ã†ã®ã¯ã‚ˆãã‚ã‚‹ã“ã¨ã§ã™ãŒã€
発見ã™ã‚‹ã®ã¯ãªã‹ãªã‹é›£ã—ã„ã‚‚ã®ã§ã™ã€‚1.1.5 ã‹ã‚‰ã¯ãƒˆãƒ¼ã‚¯ãƒ³ã‚’明示的ã«
宣言ã™ã‚‹ã“ã¨ã§ã€å®£è¨€ã«ãªã„トークン / 宣言ã«ã ã‘ã‚るトークンã«å¯¾ã—ã¦
警告ãŒå‡ºã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã—ãŸã€‚yacc ã® %token ã¨ä¼¼ã¦ã„ã¾ã™ãŒæœ€å¤§ã®é•ã„ã¯
racc ã§ã¯å¿…é ˆã§ã¯ãªãã€ã—ã‹ã‚‚エラーã«ãªã‚‰ãšè­¦å‘Šã ã‘ã€ã¨ã„ã†ç‚¹ã§ã™ã€‚

トークン宣言ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«æ›¸ãã¾ã™ã€‚
--
token A B C D
        E F G H
--
トークンã®ãƒªã‚¹ãƒˆã‚’複数行ã«ã‚ãŸã£ã¦æ›¸ã‘ã‚‹ã“ã¨ã«æ³¨ç›®ã—ã¦ãã ã•ã„。
racc ã§ã¯ä¸€èˆ¬ã«ã€Œäºˆç´„語ã€ã¯è¡Œã®å…ˆé ­ã«æ¥ãŸæ™‚ã ã‘予約語ã¨ã¿ãªã•れるã®ã§
prechigh ãªã©ã‚‚シンボルã¨ã—ã¦ä½¿ãˆã¾ã™ã€‚ãŸã ã—深淵ãªç†ç”±ã‹ã‚‰ end ã ã‘ã¯
ã©ã†ã‚„ã£ã¦ã‚‚予約語ã«ãªã£ã¦ã—ã¾ã„ã¾ã™ã€‚

=== オプション

racc ã®ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ã‚ªãƒ—ションã®ä¸€éƒ¨ã‚’ファイル中ã«ãƒ‡ãƒ•ォルト値
ã¨ã—ã¦è¨˜è¿°ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
--
options オプション オプション …
--
ç¾åœ¨ã“ã“ã§ä½¿ãˆã‚‹ã®ã¯

  * omit_action_call

空ã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³å‘¼ã³å‡ºã—ã‚’çœç•¥ã™ã‚‹

  * result_var

変数 result を使ã†

ã§ã™ã€‚
ãれãžã‚Œ no_ ã‚’é ­ã«ã¤ã‘ã‚‹ã“ã¨ã§æ„味をå転ã§ãã¾ã™ã€‚

=== expect

実用ã«ãªã‚‹ãƒ‘ーサã¯ãŸã„ã¦ã„無害㪠shift/reduce conflict ã‚’å«ã¿ã¾ã™ã€‚
ã—ã‹ã—文法ファイルを書ã„ãŸæœ¬äººã¯ãれを知ã£ã¦ã„ã‚‹ã‹ã‚‰ã„ã„ã§ã™ãŒã€
ãƒ¦ãƒ¼ã‚¶ãŒæ–‡æ³•ファイルを処ç†ã—ãŸæ™‚ã«ã€Œconflictã€ã¨è¡¨ç¤ºã•れãŸã‚‰
ä¸å®‰ã«æ€ã†ã§ã—ょã†ã€‚ãã®ã‚ˆã†ãªå ´åˆã€ä»¥ä¸‹ã®ã‚ˆã†ã«æ›¸ã„ã¦ãŠãã¨
shift/reduce conflict ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’抑制ã§ãã¾ã™ã€‚
--
expect 3
--
ã“ã®å ´åˆ shift/reduce conflict ã¯ã´ã£ãŸã‚Šä¸‰ã¤ã§ãªã‘れã°ã„ã‘ã¾ã›ã‚“。
三ã¤ã§ãªã„å ´åˆã¯ã‚„ã¯ã‚Šè¡¨ç¤ºãŒå‡ºã¾ã™ (ゼロã§ã‚‚出ã¾ã™)。
ã¾ãŸ reduce/reduce conflict ã®è¡¨ç¤ºã¯æŠ‘制ã§ãã¾ã›ã‚“。

=== トークンシンボル値ã®å¤‰æ›´

トークンシンボルを表ã™å€¤ã¯ã€ãƒ‡ãƒ•ォルトã§ã¯

  * 文法中ã€å¼•用符ã§ã‹ã“ã¾ã‚Œã¦ã„ãªã„ã‚‚ã® (RULEã¨ã‹XENDã¨ã‹)
    →ãã®åå‰ã®æ–‡å­—列を intern ã—ã¦å¾—られるシンボル (1.4 ã§ã¯ Fixnum)
  * 引用符ã§ã‹ã“ã¾ã‚Œã¦ã„ã‚‹ã‚‚ã®(':'ã¨ã‹'.'ã¨ã‹)
    →ãã®æ–‡å­—列ãã®ã¾ã¾

ã¨ãªã£ã¦ã„ã¾ã™ãŒã€ãŸã¨ãˆã°ä»–ã®å½¢å¼ã®ã‚¹ã‚­ãƒ£ãƒŠãŒã™ã§ã«å­˜åœ¨ã™ã‚‹å ´åˆãªã©ã¯ã€
ã“れã«ã‚ã‚ã›ãªã‘れã°ãªã‚‰ãšã€ã“ã®ã¾ã¾ã§ã¯ä¸ä¾¿ã§ã™ã€‚ã“ã®ã‚ˆã†ãªå ´åˆã«ã¯ã€
convert 節を加ãˆã‚‹ã“ã¨ã§ã€ãƒˆãƒ¼ã‚¯ãƒ³ã‚·ãƒ³ãƒœãƒ«ã‚’表ã™å€¤ã‚’変ãˆã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
以下ãŒãã®ä¾‹ã§ã™ã€‚
--
convert
  PLUS 'PlusClass'      #→ PlusClass
  MIN  'MinusClass'     #→ MinusClass
end
--
デフォルトã§ã¯ãƒˆãƒ¼ã‚¯ãƒ³ã‚·ãƒ³ãƒœãƒ« PLUS ã«å¯¾ã—ã¦ã¯ãƒˆãƒ¼ã‚¯ãƒ³ã‚·ãƒ³ãƒœãƒ«å€¤ã¯
:PLUS ã§ã™ãŒã€ä¸Šã®ã‚ˆã†ãªè¨˜è¿°ãŒã‚ã‚‹å ´åˆã¯ PlusClass ã«ãªã‚Šã¾ã™ã€‚
変æ›å¾Œã®å€¤ã¯ false・nil 以外ãªã‚‰ãªã‚“ã§ã‚‚使ãˆã¾ã™ã€‚

変æ›å¾Œã®å€¤ã¨ã—ã¦æ–‡å­—列を使ã†ã¨ãã¯ã€æ¬¡ã®ã‚ˆã†ã«å¼•用符をé‡ã­ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
--
convert
  PLUS '"plus"'       #→ "plus"
end
--
ã¾ãŸã€ã€Œ'ã€ã‚’使ã£ã¦ã‚‚生æˆã•れ㟠Ruby ã®ã‚³ãƒ¼ãƒ‰ä¸Šã§ã¯ã€Œ"ã€ã«ãªã‚‹ã®ã§
注æ„ã—ã¦ãã ã•ã„。ãƒãƒƒã‚¯ã‚¹ãƒ©ãƒƒã‚·ãƒ¥ã«ã‚ˆã‚‹ã‚¯ã‚ªãƒ¼ãƒˆã¯æœ‰åйã§ã™ãŒã€ãƒãƒƒã‚¯
ã‚¹ãƒ©ãƒƒã‚·ãƒ¥ã¯æ¶ˆãˆãšã«ãã®ã¾ã¾æ®‹ã‚Šã¾ã™ã€‚
--
PLUS '"plus\n"'          #→ "plus\n"
MIN  "\"minus#{val}\""   #→ \"minus#{val}\"
--

=== スタートè¦å‰‡

パーサをã¤ãã‚‹ãŸã‚ã«ã¯ã€ã©ã®è¦å‰‡ãŒã€Œæœ€åˆã®ã€è¦å‰‡ã‹ã€ã¨ã„ã†ã“ã¨ã‚’ Racc ã«ãŠã—ãˆã¦
やらãªã‘れã°ã„ã‘ã¾ã›ã‚“。ãã‚Œã‚’æ˜Žç¤ºçš„ã«æ›¸ãã®ãŒã‚¹ã‚¿ãƒ¼ãƒˆè¦å‰‡ã§ã™ã€‚スタートè¦å‰‡ã¯
次ã®ã‚ˆã†ã«æ›¸ãã¾ã™ã€‚
--
start real_target
--
start ã¯è¡Œã®æœ€åˆã«ã“ãªã‘れã°ã„ã‘ã¾ã›ã‚“。ã“ã®ã‚ˆã†ã«æ›¸ãã¨ã€ãƒ•ァイルã§
一番最åˆã«å‡ºã¦ãã‚‹ real_target ã®è¦å‰‡ã‚’スタートè¦å‰‡ã¨ã—ã¦ä½¿ã„ã¾ã™ã€‚
çœç•¥ã—ãŸå ´åˆã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«ã®æœ€åˆã®è¦å‰‡ãŒã‚¹ã‚¿ãƒ¼ãƒˆè¦å‰‡ã«ãªã‚Šã¾ã™ã€‚普通ã¯
最åˆã®è¦å‰‡ã‚’一番上ã«ã‹ãã»ã†ãŒæ›¸ãã‚„ã™ãã€ã‚ã‹ã‚Šã‚„ã™ããªã‚Šã¾ã™ã‹ã‚‰ã€
ã“ã®è¨˜æ³•ã¯ã‚ã¾ã‚Šã¤ã‹ã†å¿…è¦ã¯ãªã„ã§ã—ょã†ã€‚

=== ユーザーコード部

ユーザーコードã¯ã€ãƒ‘ãƒ¼ã‚µã‚¯ãƒ©ã‚¹ãŒæ›¸ãã“ã¾ã‚Œã‚‹ãƒ•ァイルã«ã€
アクションã®ä»–ã«ã‚‚コードをå«ã‚ãŸã„時ã«ä½¿ã„ã¾ã™ã€‚ã“ã®ã‚ˆã†ãªã‚‚ã®ã¯
書ãã“ã¾ã‚Œã‚‹å ´æ‰€ã«å¿œã˜ã¦ä¸‰ã¤å­˜åœ¨ã—ã€ãƒ‘ーサクラスã®å®šç¾©ã®å‰ãŒ
headerã€ã‚¯ãƒ©ã‚¹ã®å®šç¾©ä¸­(ã®å†’é ­)㌠innerã€å®šç¾©ã®å¾ŒãŒ footer ã§ã™ã€‚
ユーザコードã¨ã—ã¦æ›¸ã„ãŸã‚‚ã®ã¯å…¨ã手を加ãˆãšã«ãã®ã¾ã¾é€£çµã•れã¾ã™ã€‚

ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚³ãƒ¼ãƒ‰éƒ¨ã®æ›¸å¼ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™ã€‚
--
---- 識別å­
  ruby ã®æ–‡
  ruby ã®æ–‡
  ruby ã®æ–‡

---- 識別å­
  ruby ã®æ–‡
     :
--
行ã®å…ˆé ­ã‹ã‚‰å››ã¤ä»¥ä¸Šé€£ç¶šã—ãŸã€Œ-ã€(マイナス)ãŒã‚ã‚‹ã¨ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚³ãƒ¼ãƒ‰ã¨
ã¿ãªã•れã¾ã™ã€‚識別å­ã¯ä¸€ã¤ã®å˜èªžã§ã€ãã®ã‚ã¨ã«ã¯ã€Œ=ã€ä»¥å¤–ãªã‚‰ä½•ã‚’
書ã„ã¦ã‚‚ã‹ã¾ã„ã¾ã›ã‚“。