
Yacc --    ஢

⨢ . ᮭ

ॢ  ᪨  Copyright (C) Alexey Mahotkin 1995-1997
                                     
                             Bell Laboratories
                       Murray Hill, New Jersey 07974

$Id: yacc-rus.txt,v 1.2 1998/07/05 20:19:13 alexm Exp $                       




室   ணࠬ 筮   ; 
ᠬ ,   ୮ ணࠬ,  ந  
। "室 ",   ਭ. 室   
, ⠪,   ணࠬ஢  ⮩, ⠪ 
᫥⥫쭮 ᥫ.  ᮦ,  ।⢠  ࠭祭,
᫮  ᯮ짮,   ᯮᮡ ஢ ᢮ 室  
ࠢ쭮.

Yacc ᯥ稢 饥 ।⢮  ᠭ 室  
ணࠬ. 짮⥫ Yacc 㪠뢠  室    ,
뢠  ᯮ  ⠪ .  ८ࠧ뢠 ⠪
ᯥ䨪樨  ணࠬ, ন騥   ;  㤮
ࠡ뢠 ⮩ ணࠬ   ࠢ (flow control) 
ਫ.

ணࠬ , ந  뢠 ᠭ 짮⥫
楤,  ᫥ item.  ࠧ, 짮⥫ 
। 室  ᢮ ணࠬ  窨 ७ ⤥ 室
ᨬ   窨 ७ 権  ᮪ ஢, ⠪  
 ᥫ. 짮⥫᪠ 楤 ⠪  ࠡ뢠 ⠪
᪨ ᮡ,  ᮣ襭    த
ப,  筮     ࠬ᪨ ᠭ.

 ᠭ  ७ᨬ C.  ਭ ᯥ䨪権 祭  騩:
ࠬ⨪ LALR(1)  ࠢ ࠭ ᫥.

   ࠬ C, APL, Pascal, RATFOR  ..,  ⠪
ᯮ짮   ࠤ樮 몮,   ⮭
⮬⮢, ᪮쪨 몮  ⮫ ஢, ⥬ ࠢ
㬥⮢  ⥬ ⫠ ࠭.

31  1978 . 

:    ஢

                            Stephen C. Johnson

                             Bell Laboratories
                       Murray Hill, New Jersey 07974


0. 

 ᯥ稢 饥 ।⢮  ਤ  室 
 ணࠬ. 짮⥫  ⮢ ᯥ䨪  ;
 砥  ᥡ ࠢ, 뢠騥  室 , ,
뢠,  ᯮ  ࠢ,  ஢ 楤 
⮣ . ⥬   㭪, ஫  .
 㭪, 뢠 ᨭ⠪᪨ ஬, 뢠 짮⥫
஢ 楤 ⮣  (᪨ )   祭
 item (⮪)  室 ⮪.  ⮪ ࣠ 
ᮮ⢥⢨  ࠢ  室 , 뢠 ࠬ᪨
ࠢ;     ࠢ ᯮ, 뢠 짮⥫᪨
  ⮣ ࠢ,  ⢨; ⢨ ᯮᮡ  祭 
ᯮ짮 祭 㣨 ⢨.

 ᠭ  ७ᨬ  C, ⢨  室 ணࠬ ⠪
 C.  ⮣,  ᨭ⠪᪨ ᮣ襭  ⥪  C.

᭮ ᯥ䨪権    ࠬ᪨ ࠢ. 
ࠢ 뢠 ⨬     . Hਬ, ࠬ᪮
ࠢ  룫拉 ⠪:

date : month_name day ',' year ;

 date, month_name, day  year ।⠢ ᮡ , ।⠢騥
   ; ।⥫쭮 month_name, day  year ।
- .  "," 祭   窨;  , 
窨    ⥪ ᠬ  ᥡ. 稥  窠  ⮩
㦠    ९  ࠢ     祭 
஫ 室 .  ࠧ,   । 

July 4, 1776

㤥 ᮮ⢥⢮ 㪠 ࠢ.

    믮 ᪨ ஬. 楤
짮⥫ ⠥ 室 ⮪, ᯮ   ஢ 
।  ⮪ .  ᪨ 稭 , ᯮ
஬ 뢠 ନ묨 ᨬ.   ࠧ㬥
ନ ᨬ 筮  뢠 ⮪.

 ਭ⨨ 襭, ᯮ   ᯮ ᪨
  ࠬ᪨ ࠢ,  ᫨誮 让 ᢮ ⢨.
Hਬ,  襯ਢ ਬ  ᯮ짮 ᫥騥 ࠢ:

month_name : 'J' 'a' 'n' ;
month_name : 'F' 'e' 'b' ;
. . .
month_name : 'D' 'e' 'c' ;

᪮   㤥 ᯮ ⮫쪮 ⤥ 㪢, 
month_name 㤥 ନ ᨬ.  ஢ ࠢ 
  ६     ⮫쪮 ᫮ ᯥ䨪樨,   
ᬮ   ࠢ. 筮 ᪨  ᯮ 
楢  頥 ਧ ⮣,   month_name;  ⮬ 砥
month_name 㤥 ⮪.

ࠫ ᨬ, ⠪  "," ⠪  室 १ ᪨
  ⠪  ⮪.

 ᯥ䨪樨 祭 . ⭮⥫쭮 (realively [???])  
 襯ਢ ਬ ࠢ

date : month '/' day '/' year ;

饥

7 / 4 / 1776

 ⢥ ᨭ  

July 4, 1776

 設⢥ 砥   ࠢ    ⠢  ࠡ
⥬  묨 ᨫﬨ  ⥫쭮 ᭮ ࠧ襭
 室 .

室    ᮮ⢥⢮ ᯥ䨪.  訡 
। ⮫쪮 ࠭, ᪮쪮   ⥭ ᫥-ࠢ; ⠪
ࠧ,  ⮫쪮  ⥫쭮 ⥯  ⭮ ⥭ 
ࠡ  ࠢ묨 묨,   娥     㦥.
ࠡ⪠ 訡, ᯥ稢   ᯥ䨪権 室 ,
   ࠢ   த  
᫥ ய᪠  .

    ⪠뢠 ஢   묨 ࠬ
ᯥ䨪権. Hਬ, ᯥ䨪樨   ⨢稢묨,  
ॡ  魮 堭 ᯮ, 祬 ,  㯥 .
 砩 砥 訡  ஥஢; 砨 ண ⨯ 
  ᪮४஢    ⮣ ᪮ 
   ९뢠  ࠬ᪨ ࠢ.    
 ࠡ뢠   ᯥ䨪樨, ࠢ  묨
⥬   ;  ⮣, 樨,  ᫮ 
ࠡ⪨   ᫮ ⠪   . H 짮⥫
ᮮ頫,  樯 㫨஢  ᯥ䨪権   
室  뢠 訡  楯樨  ࠧࠡ⪥  ࠭ ⠤
ࠧࠡ⪨.

,   ᭮  ᠭ  㣨 筨.2,3,4  ப
ਬ  ᫥ ࠪ᪨ ਫ,  lint,5 
७ᨬ  C6  ⥬  ⥬᪮ ⨯᪮ .7

騥 ᪮쪮 ᥪ権 뢠 ᭮  ਣ⮢ 
ᯥ䨪樨 ;  1 뢠 ⮢ ࠬ᪨ ࠢ, ᥪ
2 -- ⮢ 짮⥫᪨ ⢨, 易  ⨬ ࠢ,  ᥪ
3 -- ⮢ ᪨ ஢.  4 뢠 樨 .
 5 㦤 ࠧ 稭,      ᯮᮡ
ᮧ   ᯥ䨪樨,    ⨬ .  6 뢠 ⮩
堭  ࠡ⪨ ਮ ஢  䬥᪨ ࠦ. 
7 㦤 । 訡  ⠭ ᫥ .  8 뢠 
। ⥫쭮  ᯥ樠  ஢, ந .
 9   ४樨,   ⨫  䥪⨢
ᯥ䨪権.  10 㦤 ᪮쪮 ७ ⥬,   ᥪ樨 11
ࠦ ୮. ਫ A ᮤন ⪨ ਬ,  ਫ B 
 ᢮ 室 ᨭ⠪ .  ਫ C ਢ ਬ 
ᯮ짮  த ⥩  , , ਫ D 
뢠  ⨢  ন 堭  ᨭ⠪,  ⠢
 ᪮ ᮢ⨬  묨 ﬨ .

1. ᭮ ᯥ䨪樨

 뫠   ⮪,   ନ ᨬ.  ॡ,
⮡  ⮪ 뫨 .  ,  稭, ᠭ  樨
3,  ⥫쭮  ᪨    䠩
ᯥ䨪権;     㤠 ⠪ 㣨 ணࠬ. 
ࠧ,  䠩 ᯥ䨪権 ⮨   ᥪ権: , 
(ࠬ᪨) ࠢ,  ணࠬ. 樨 ࠧ ᨬ 
業 "%%". ( 業 "%"  ᭮ ᯮ    
Esc-ᨬ.)

㣨 ᫮,  䠩 ᯥ䨪樨 룫廊 
          
ᠭ
%%
ࠢ
%%
ணࠬ

    .  ⮣, ᫨ ᥪ ணࠬ 饭, 
 ⪠ %% ⠪   饭; ⠪ ࠧ, 쭠 ࠧ襭
ᯥ䨪  

%%
ࠢ

஡, ⠡樨   ப ,  ᪫祭 砥, 
     ᨬ १ࢨ஢ ᫮. 
ਨ   ,  ࠧ襭 ;   

/* . . . */

  C  PL/I.

 ࠢ ஥     ࠬ᪨ ࠢ. 
ࠬ᪮ ࠢ  :

A : BODY ;

A ।⠢ ᮡ ନ쭮 ,  BODY ।⠢ ᮡ 
᫥⥫쭮      ࠫ. 稥  窠  
⮩ -- 㭪 .

   ந쭮      㪢, 祪 ".", 
મ "_"  砫 .    㪢 ࠧ. ,
ᯮ㥬  ⥫ ࠬ᪨ ࠢ  ।⠢ ⮪  
ନ ᨬ.


ࠫ ⮨  ᨬ, 祭   窨 "'".    C, 
ᨬ ⭮ ᮩ  "\" --  Esc-ᨬ  ࠫ,
ᯮ  Esc-᫥⥫쭮.  ࠧ,

'\n'       ப
'\r'      ॢ ⪨
'\''      筠 窠 "'"
'\\'      ⭠   "\"
'\t'      ⠡
'\b'      
'\f'      ॢ ࠭
'\xxx'    "xxx"  쬥筮 ⥬ ᫥

  稭 孨᪮ ᢮⢠, ᨬ NUL ('\0'  0)  
ᯮ짮  ࠬ᪨ ࠢ.

᫨  ᪮쪮 ࠬ᪨ ࠢ    , 
ᯮ짮 ⨪쭠  "|", ⮡  ९뢠  .
 ࠧ, ࠬ᪨ ࠢ

A : B C D ;
A : E F ;
A : G ;

  ।⠢  

A : B C D
  | E F
  | G
  ;

H易⥫쭮, ⮡ ࠬ᪨ ࠢ     﫨
   ᥪ樨 ࠬ᪨ ࠢ,   ⮬ ⥪   
 .

᫨ ନ ᨬ ᮮ⢥ ⮩ ப,    
祢 ᯮᮡ:

empty : ;

, ।⠢騥 ⮪,   ;  ᥣ  ᤥ,
ᠢ

%token name1 name2 . . .

 ᥪ樨 . ( ᥪ樨 3, 5  6  ⥫ ᭥). 
 ,    ᥪ樨 , ⠥ ନ 
ᨬ.  ନ ᨬ       
  ࠢ.

।  ନ ᨬ , 뢠 ⮢ ᨬ, 
ᮡ .  ࠧࠡ⠭ ⠪, ⮡ ᯮ ⮢ ᨬ;
⠪ ࠧ,  ᨬ ।⠢ ᠬ , ᠬ  ,
ᠭ ࠬ᪨ ࠢ.  㬮砭 ⮢ ᨬ  
  ࢮ ࠬ᪮ ࠢ  ᥪ樨 ࠢ.   
⥫쭮,   ⮢ ᨬ  ᥪ樨 , ᯮ 
祢 ᫮ %start:

%start keyword

 室    砥 ᯥ樠 ⮪, 뢠
થ஬ . ᫨ ⮪  થ ,    , ନ 
, ᮮ⢥ ⮢ ᨬ,  㭪  頥
ࠢ 뢠饩 ணࠬ ᫥ ⮣,   થ ;  
ਭ 室 . ᫨ થ    㣮 ⥪,  
⠥ 訡.

  ᮮ⢥饬  ᨬ  --  ᪮ ,
ᠭ 짮⥫; ᬮ ᥪ 3, . 筮 ᨬ  
।⠢  筮 祢  -뢮, ⠪  
" 䠩"  " ".

2. ⢨

 ࠬ᪮ ࠢ 짮⥫  ਯ ⢨, 
ᯮ塞  ࠧ,  ᯮ ࠢ  室 .  
⢨   祭,   祭, 饭
।騬 ⢨ﬨ.  ⮣, ᪨    
祭 ⮪, ᫨  室.

⢨ --  ந  C,  ⮬  ந   
뢮, 뢠 ணࠬ   譨  (??)  ६. 
⨢ 砥    ࠬ, 祭묨  䨣
᪮ "{"  "}". Hਬ,

A    : '(' B ')'
          { hello( 1, "abc" ); }



XXX  : YYY ZZZ
           { printf("a message\n"); flag = 25; }

 ࠬ᪨ ࠢ  ⢨ﬨ.

 ⢨ ᫥ , ⮡ ᯮᮡ⢮ ⮩ 裡
 ⢨ﬨ  ஬.   "$" ᯮ  ᨣ  
⮬ ⥪.

⮡  祭, ⨢ 筮 ⠭ ᥢ६ "$$"  
஥ 祭. Hਬ, ⢨, ஥ 祣  ,  ⮫쪮 
頥 祭 1, 

{ $$ = 1 }

⮡  祭, 饭 ।騬 ⢨ﬨ  ᪨
஬, ⢨  ᯮ짮 ᥢ-६ $1, $2, . . .,
 ⭮  祭, 饭 ⠬  ࠢ  ࠢ,
  ⥭ ᫥ ࠢ.  ࠧ, ᫨ ࠢ, ਬ,

A    : B C D ;

 $2  祭, 饭 C,  $3 -- 祭, 饭 D.

   ਬ, ।⠢ ࠢ

expr : '(' expr ')' ;

祭, 饭 ⨬ ࠢ --  筮 祭 expr  ᪮. 
  ࠦ ⠪:

expr : '(' expr ')'
        { $$ = $2 ; }

 㬮砭 祭 ࠢ --  祭 ࢮ    ($1). 
 ࠧ, ࠬ᪮ ࠢ 

A :  B ;

  ॡ  ⢨.

 襯ਢ ਬ  ⢨ 㪠뢠   ᢮ ࠢ.
 ⥫쭮  ஫ । ⥬,  ࠢ  ࠧ࠭.
   ⢨   , ⠪   । ࠢ. ⠥, 
  ࠢ 頥 祭, 㯭 १  堭 ⢨
ࠢ.  ᮢ ।,      祭, 頥 
ᨬ ᫥  .  ࠧ, ࠢ

A    : B
         { $$ = 1; }
       C
         { x = $2; y = $3; }
     ;

⠭ x  1,  y --  祭, 饭 C.

⢨,    ࠢ,  ⢨⥫쭮 ࠡ뢠 
   ନ쭮 ᨬ   ࠢ, ᮯ⠢饣 
  ⮩ ப. ७ ⢨ --  ⢨, 뢠  
ᯮ ⮣  ࠢ.   ⢨⥫쭮 頥  
襯ਢ ਬ஬,    ᠭ 

$ACT :    /* ⮥ */
               { $$ = 1; }
     ;
A    :    B $ACT C
               { x = $2; y = $3; }
     ;

  ਫ 뢮  ந  ⢨ﬨ; ᪮॥,  
 , ⠪  ॢ ࠧ   ८ࠧ । ⥬,
  뢮. ॢ ࠧ १砩  ந,  
㭪 ஥  ࠡ⪨   ॢ. Hਬ, 
।,   㭪  C node(), ᠭ ⠪,  맮

node( L, n1, n2 )

ᮧ 㧥  ⪮ L  ⮬ n1  n2  頥  ⮣ 
㧫.  ॢ ࠧ   ஥  ਬ ⠪ ⢨ ,
ᯥ䨪樨, 

expr : expr '+' expr
          { $$ = node( '+', $1, $3 ); }

짮⥫  । 㣨 ६  ᯮ짮  ⨢.
  ᠭ    ᥪ樨 , 祭 
ᨬ "%{"  "}%".    ।   
⢨, ⠪    ࠬ ⢨  ᪮ .
Hਬ,

%{
int variable = 0;
%}

  饭  ᥪ ,  ६ 㯭묨 ᥬ
⢨.   ᯮ ⮫쪮 , 稭騥  "yy"; 
짮⥫   ᯮ짮 ⠪ .

  ਬ  祭 -- 楫: 㦤 祭 㣨 ⨯ 㤥
 ᥪ樨 10.

3. ᪨ 

짮⥫  ।⠢ ᪨   ⥭ 室 
  । ⮪ ( 祭ﬨ, ᫨ ) . ᪨
 --  㭪 ⨯ integer, 뢠 yylex. 㭪 頥
楫 ᫮,  ⮪, ।⠢騩  ⠭ ⮪. ᫨  ⨬
⮪ 易 祭,    ᢮ 譥 ६ yylval.

  ᪨      ⮪,  ⮣,
⮡   뫠 .     ࠭   
짮⥫.   , 堭 "#define" ᯮ, ⮡ 
᪮      ᨬ᪮ . Hਬ, 
।,  ⮪ DIGIT  ।  ᥪ樨  䠩 
ᯥ䨪権 . ⢥  ᪮   룫拉
:

               yylex()
               {
                    extern int yylval;
                    int  c;
                    ...
                    c = getchar();
                    ...
                    switch (c) {
                              . . .
                    case '0':
                    case '1':
                    ...
                    case '9':
                         yylval = c - '0';
                         return DIGIT;
                         . . .
                    }
               . . .

H祭 ⮣ --   ⮪ DIGIT  祭, ࠢ ᫥
祭 .  ᫮,   ᪮  饭  ᥪ
ணࠬ 䠩 ᯥ䨪権 , 䨪 DIGIT 㤥 ।  
 ⮪, 易  ⮪ DIGIT. 

 堭 ᯥ稢 ,  塞 ᪨ ;
⢥ 誠 -- 室  ᯮ짮  ࠬ⨪ 
  ⮪, १ࢨ஢  稬  C  , ਬ,
ᯮ짮 ⮪ if  while,  易⥫쭮 맮 ᨫ 㤭
 樨 ᪮ .  ⮪ error १ࢨ஢ 
ࠡ⪨ 訡    ᯮ짮  (ᬮ ᥪ 7).

 㯮 ,  ⮪  롨   짮⥫.
 㬮砭  롨 . H ⮪  㪢 ᨬ 
㬮砭 --  ᫥ 祭 ᨬ  쭮  ᨬ.
⠫  ᢠ  ⮪, 稭  257.

⮡ ᢮ ⮪ ( ࠫ) ,    
⮪  ࠫ  ᥪ樨    ᫥ 
⥫쭮 楫 ᫮.  楫   ⢥  ⮪ 
  ࠫ.   ࠫ,  ।   ⮣ 堭,
࠭ ᢮ ।  㬮砭. , ⮡   ⮪ 
ࠧ砫.

 ᪨ 稭, થ    ஬ ⮪ 0 
⥫쭮 ᫮.   ⮪    ८। 
짮⥫; ⠪ ࠧ,  ᪨    ᠭ 
⠪, ⮡  0  ⥫쭮 ᫮  ⨦  ᢮
室 .

祭  ।⢮  ஥ ᪨ ஢ -- ணࠬ
Lex, ࠧࠡ⠭ Mike Lesk.8   ᪨  ᯮᮡ 
ࠡ  ମ  ࠬ . 䨪樨   ᪨
஢ ᯮ ॣ ࠦ  ࠬ᪨ ࠢ. 
  ᯮ짮  ஥ 筮 ᫮ ᪨ 
஢,    모 (⠪  FORTRAN),   
ᮮ⢥   ⥮᪮ 奬,   ᪨  
ᮧ .

4.  ࠡ⠥ 

 ॢ頥 ᯥ䨪樨  ணࠬ  C,  ࠧࠥ 室 
 ᮮ⢥⢨  묨 ᯥ䨪ﬨ. , ᯮ㥬  室
 ᯥ䨪樨  ,    㤥 㦤  (ᬮ 
뫪  ஡ ଠ樥).  , , ⭮⥫쭮  
 ⮣,   ࠡ⠥, ᫨  室,    砥 ᤥ
饭  ࠡ⪮ 訡  ᫥ﬨ  .

, ᮧ , ⮨  設  ﭨ  ⥪. 
⠪ ᯮᮡ    ᫥騩 室 ⮪ (뢠 
lookahead token). 饥 ﭨ -- ᥣ  設 ⥪. ﭨ
設  ﭨ ᢠ 訥 楫 ⪨; 砫쭮 設
室  ﭨ 0,   ⠭   lookahead token'a. 

設 㯭 ⮫쪮  ⢨, 뢠 ᤢ, , ਭ⨥ 
訡.  蠣  ந室 ᫥騬 ࠧ:

1. ᭮뢠  ⥪饬 ﭨ  ।, 㦥   LT  
襭,  ⢨ 㦭 ந; ᫨  ॡ LT    
,  뢠 yylex  祭 ᫥饣 ⮪.

2. ᯮ ⥪饥 ﭨ , ᫨ 室, LT  ਭ 襭
 ᫥饬 ⢨  ந .   १ ﭨ   
ᠭ  ⥪  ⠭    LT ࠡ⠭  ⠢.

⢨ ᤢ -- ᠬ ⮥ ⢨, ஥ ந . 
ᯮ ⢨ ᤢ, ᥣ  LT. Hਬ,  ﭨ 56 
 ⢨:

IF shift 34

஥ 砥,  ﭨ 56, ᫨ LT  IF, ⥪饥 ﭨ (56) 
த   ⥪,  ﭨ 34 ⠭ ⥪騬 ( 設
⥪). LT 頥.

⢨  ।࠭ ⥪  ࠭祭 ⠭. ⢨
 ᮮ⢥ ⮬,   㢨 ࠢ  ࠢ  
⮢ ,   㢨 砩, 稭騩 ࠢ,  
ࠢ   .   ஠஢ LT ⮡ ,
室  ,  筮 ⮣  ॡ;  ⢨⥫쭮,
⢨  㬮砭 (।⠢塞   ".") --   ⢨
.

⢨  易  㠫묨 ࠬ᪨ ࠢ. 
ࠬ᪨ ࠢ ⠪  訥 楫 ,    
஬ ⥫. ⢨

.    reduce 18

⭮  ࠬ᪮ ࠢ 18, ⮣  ⢨ 

          IF   shift 34

⭮  ﭨ 34.

।,   ࠢ 

A :  x y z ;

⢨    ᨬ ᫥ (  砥 A),  ⢠
ᨬ ࠢ (  砥 3).   ᭠砫 ⮫  ⥪
 ﭨ ( 饬, ⢮ ⠫ ﭨ ࠢ  
ᨬ  ࠢ  ࠢ).  魮,  ﭨ,  뫨 
饭  ⥪  ᯮ x, y  z    . ᫥ ⠫
 ﭨ 뢠 ﭨ,  ஬  室 । 砫
ࠡ⪨ ࠢ. ᯮ  襥 ﭨ  ᨬ   
ࠢ, ।⠢,  ந  १ ᤢ A. 砥 
ﭨ, 뢠  ⥪  ࠧ த. , ,
⥫쭠 ࠧ  ࠡ⪮ ᨬ ᫥   ᤢ ⮪,
⠪   ⢨ 뢠 ⢨ 室.  ⭮, LT 頥
 ᤢ     室.   砥 襥 ﭨ
ᮤন ⠪  :


A goto 20

뢠饥  ﭨ 20  ⥪,  ⮬  ⠭ ⥪騬.

 ⢨⥫쭮, ⢨  "稢  ५ ᮢ" 
ࠧ, ⠫ ﭨ  ⥪    ﭨ,  뫠
ࢠ 㢨 ࠢ  ࠢ.   ᥡ ⠪,    㦥
 ⮣   ࠢ. ᫨ ࠢ  ࠢ ,   
ﭨ  ⠫  ⥪: 뢠饥 ﭨ  ⢨⥫쭮
⥪饥.

⢨  ⠪   ࠡ⪥ 짮⥫᪨ ⢨ 
祭.  ࠢ , , 易  ࠢ ᯮ ।
⥬  ⥪ ࠢ.    ⥪, ᮤঠ饬 ࠢ, 
ࠫ쭮  ࠡ⠥  , ᮤঠ騩 祭, 饭 
᪨ ஬  ⢨ﬨ.  ந室 ᤢ,  
६ yylval   ⥪ 祭. ᫥   
짮⥫᪮  ந室 .  ந室 ⢨ 室,
 ६ yylval   ⥪ 祭. ᥢ६ $1, $2 
.. 뫠  ⥪ 祭.

⠫  ⢨  楯㠫쭮 ⥫쭮 . ⢨
ਭ ᨣ  ⮬,  ᬮ७  室    
ᮮ⢥ ᯥ䨪樨.  ⢨ ந室 ⮫쪮  LT  થ
  ᨣ,   ᯥ譮 訫 ࠡ. ⢨ 訡, 
㣮 ஭, 砥, 砥 ,  ண   
த ࠧ  ᮮ⢥⢨  ᯥ䨪樥.  室 ⮪,  
LT   ᫥ 祣,   묨 묨.  ᮮ頥 
訡  ⠥ ⠭   த ࠧ: ࠡ⪠ 訡
( ⨢  㦥 訡) 뢠  樨 7.

६ ਢ ਬ! ।,   ᯥ䨪

%token DING DONG DELL
%%
rhyme:    sound place
     ;
sound:    DING DONG
     ;
place:    DELL
     ;

  뢠  箬 -v, ᮧ 䠩   y.output, 
⠡ ᠭ . ⢥騩 襯ਢ ࠬ⨪ 䠩 
y.output ( ࠭ ⨪  ):

state 0
     $accept : _rhyme $end

     DING shift 3
     .    error

     rhyme goto 1
     sound goto 2

state 1
     $accept : rhyme_$end

     $end accept
     .    error

state 2
     rhyme : sound_place

     DELL shift 5
     .    error

     place goto 4

state 3
     sound : DING_DONG

     DONG shift 6
     .    error

state 4
     rhyme : sound place_ (1)
     . reduce 1

state 5
     place : DELL_ (3)
     . reduce 3

state 6
     sound : DING DONG_ (2)
     . reduce 2

,     ⢨   ﭨ  ᠭ
 ࠢ ࠧ, ࠡ뢠   ﭨ.  "_" ᯮ
 祭 ⮣,  㦥 뫮 㢨    㤥   ࠢ.
।,  室 

DING DONG DELL

⥫쭮 ᫥  蠣   ࠡ⪥ 室 .

砫쭮 ⥪饥 ﭨ -- ﭨ 0.   ᬮ  室
, ⮡   ⢨ﬨ, 㯭묨  ﭨ 0, ⮬
⠥  ⠭ LT  ⮪, DING. ⢨  ﭨ 0  ⮪
DING  "ᤢ 3", ⠪  ﭨ 3 뢠  ⥪  頥 LT. 
ﭨ 3 ⠭ ⥪騬. ⠥  ⠭ LT ᫥騩 ⮪, DONG.
⢨  ﭨ 3  ⮪ DONG  "ᤢ 6", ⠪  ﭨ 6 
뢠  ⥪  頥 LT.  ⥪ ᮤন 0, 3  6.  ﭨ
6   LT    ࠢ 2.

sound : DING DONG

 ࠢ   ᨬ ࠢ, ⮬  ﭨ, 6  3,
⠫  ⥪, 뢠 ﭨ 0.  ᮮ⢥⢨  ᠭ
ﭨ 0, 饬 室  sound, 砥

          sound goto 2

⠪ ࠧ, ﭨ 2 뢠  ⥪, ⠭ ⥪騬 ﭨ.

 ﭨ 3   ᫥騩 ⮪, DELL. ⢨  "ᤢ 5",
⮬ ﭨ 5 뢠  ⥪,  ⥯ ᮤন 0, 2  5 
頥 LT.  ﭨ ⢥ ⢨    ࠢ 3.
 ⢥ ᨬ ࠢ, ⮬ ⢥ ﭨ, 5, 
⠫  ⥪  뢠 ﭨ 2.  ﭨ 3  place, 
 ࠢ 3, ந室 室  4.  ⥪ ᮤন 0, 2  4. 
ﭨ 4 ᤨ⢥ ⢨ --    ࠢ 1. ࠢ 
ᨬ, ⮬ 孨  ﭨ ⠫  ⥪,  뢠
ﭨ 0.  ﭨ 0  室  rhyme, ⠢騩  ३
 ﭨ 1.  ﭨ 1  室 ; 砥 થ ,
砥 १ "$end"  䠩 y.output. ⢨  ﭨ 1, 
 થ   "ਭ", ᯥ譮  ࠧ.

⥫ ⥫쭮 ᮢ ।⠢,  ࠡ⠥   
 ⠪ ࠢ묨 ப,  DING DONG DONG, DING DONG, DONG DONG DELL
DELL,  .. H᪮쪮 祭    稥  ਬ 
ࠤ,   ஡   ᫮ ⥪.


5. ᫥  䫨

H ࠬ᪨ ࠢ ᫥, ᫨   室
ப,    ஢    ࠧ묨 ᯮᮡ.
Hਬ, ࠬ᪮ ࠢ

          expr : expr '-' expr

 ⢥ ᯮᮡ ࠦ ⮣ 䠪,    ᯮᮡ
ନ஢ 䬥᪮ ࠦ   ࠦ    .
 ᮦ,  ࠬ᪮ ࠢ   㪠뢠 ᯮᮡ,
  ஢  室 . Hਬ, ᫨
室 

                       expr - expr - expr

 ࠢ  ࢮ   

( expr - expr ) - expr

 

expr - ( expr - expr )

(ࢮ 뢠  뢠, ஥ -- ࠢ 뢠).

 । ⠪ ᫥,  ⠥ ந . 
⥫쭮 뫮  ।⠢ ஡,  । ஬,  
室

expr - expr - expr

  祫 ஥ expr, 室 ,   祫, 

expr - expr

ᮮ⢥騥 ࠢ  襯ਢ ࠢ.   
室 , ਬ  ࠢ; ᫥ ਬ 室  
 expr (  ࠢ).  ⥬ 뢠 ⠢  :

- expr

 ᭮ . 䥪⮬ ⮣  樠樠⨢ .

 㣮 ஭,   㢨 

                           expr - expr

  ⫮  ਬ ࠢ  த  室 
,   㢨

                       expr - expr - expr

   ਬ ࠢ  ६ ᠬ ࠢ ᨬ,   
expr  ⠢ 

                           expr - expr

 ࠢ   ࠧ; 䥪⮬  ࠢ樠⨢ 
.  ࠧ, 

                           expr - expr

  ᤥ  ࠧ襭  -- ᤢ  ,   ᯮᮡ
 ⤠    ।⥭.  뢠 䫨⮬ ᤢ/
.   ,    㤥 롮  
ࠧ襭묨 ﬨ;  뢠 䫨 /. ,
 䫨⮢ ᤢ/ᤢ  뢠.

  䫨 ᤢ/  /, 
   ந .  롨ࠥ    ⢨.
ࠢ, 뢠饥,  롮    樨, 뢠 ࠢ
࠭ ᫥.

   㬮砭  ࠢ ࠭ ᫥:

1.  砥 䫨 ᤢ/  㬮砭  ᤢ.

2.  砥 䫨 /  㬮砭 ந 
 ࢮ ࠬ᪮ ࠢ ( 室 ⮪).

ࠢ 1 砥,   ন   ᤢ  稨
롮. ࠢ 2 ।⠢ 짮⥫ 筮  ஫ 
   ⮩ 樨,  䫨⮢ /  
 ᣤ,  .

䫨   - 訡      ⮬, 
ࠬ᪨ ࠢ,   騥 ᮣ騬, ॡ 
᭮ , 祬 ,   ந . ᯮ짮 
⢨  ࠢ ⠪  맢 䫨 ᫨ ⢨ 
ந । ⥬,   ⥫쭮 ,  ࠢ
ᯮ.    ਬ ࠢ ࠭ ᫥ 
㬥⭮    ४⭮ .  ⮩ 稭  ᥣ ᮮ頥
 ⢥ 䫨⮢ ᤢ/  /, ࠭  
 ࠢ 1  2.

 饬, ,   ਬ ࠢ, ࠭ ᫥, 
ᮧ ४⭮ , ⠪  ९ ࠬ᪨ ࠢ
⠪,    ᠬ 室  ࠡ뢠  䫨⮢.  ⮩
稭   ࠭ ⢮ ஢ ஢ ⠫ 
䫨 ⠫묨 訡. H  ᪠뢠,  ९뢠  祬-
⢥  ந   ; ⠪ ࠧ,  㤥
ந    稨 䫨⮢.

 ⢥ ਬ ᨫ ࠢ, ࠭ ᫥, ।⠢ ࠣ
 몠 ணࠬ஢, ᮤঠ饣  "if-then-else".

          stat :    IF '(' cond ')' stat
               |    IF '(' cond ')' stat ELSE stat
               ;

  ࠢ IF  ELSE  ⮪, cond  ନ ᨬ,
뢠騩 ᫮ (᪨) ࠦ,  stat  ନ ᨬ,
뢠騩  ࢮ ࠢ 뢠 ࠢ ⮥-if,  ஥ --
ࠢ if-else.

  ࠢ ନ ⨢稢 , ⮬  室 

          IF ( C1 ) IF ( C2 ) S1 ELSE S2

  ஢, ᯮ  ࠢ,  ᯮᮡ:

IF ( C1 ) { IF ( C2 ) S1 } ELSE S2

IF ( C1 ) { IF ( C2 ) S1 ELSE S2 }

   ਬ  設⢥ 몮 ணࠬ஢,
  .  ELSE ⭮  ᫥ ।饬 IF, 
饬 ᢮ ELSE.   砥, ।⠢ ,  ன 
㢨 

IF ( C1 ) IF ( C2 ) S1

  ELSE.      ࠢ ⮥-if  

IF ( C1 ) stat

 ⥬  ⠢訥 室 

ELSE S2

 

IF ( C1 ) stat ELSE S2

 ࠢ if-else.    ࢮ ⨯ 㯯஢ 室 .

 㣮 ஭, ELSE   ᤢ, ⠭ C2  ⥬ ࠢ ஭

IF ( C1 ) IF ( C2 ) S1 ELSE S2

    ࠢ if-else  祭

          IF ( C1 ) stat

     ࠢ ⮥-if.    ஬ ⨯
㯯஢,  筮  ॡ.

塞,     ࠧ襭  --  䫨 ᤢ/
. ਬ ࠢ ࠭ ᫥   ᤥ
ᤢ   砥,    ॡ㥬 㯯஢.

䫨 ᤢ/  ⮫쪮   ᮡ 室 ᨬ,
ELSE  㦥 뫨 ⠭ ᮡ , ⠪ 

          IF ( C1 ) IF ( C2 ) S1

 饬 砥    ⮢,   㤥 易  室 
ᨬ  ஬ ࠭ ⠭ .  ⠭  
ࠪਧ ﭨ .

䫨 ᮮ饭   ᥣ ,  室 䠩 樨 
஡ ० (-v). Hਬ, 室 䠩, ᮮ⢥騩
襯ਢ 䫨⮬ ﭨ,  :

23: shift/reduce conflict (shift 45, reduce 18) on ELSE

state 23
     stat : IF ( cond ) stat_      (18)
     stat : IF ( cond ) stat_ELSE stat

     ELSE shift 45
     . reduce 18

ࢠ ப 뢠 䫨, ᮮ    室 ᨬ. ⮬
᫥ 筮 ᠭ ﭨ,  ᫥ ࠬ᪨ ࠢ, 
⨢  ﭨ  ⢨ . ᯮ,   砥 
㢨 ࠬ᪨ ࠢ.  ࠧ,   ਬ,  ﭨ
23  ࠡ⠫ 室 , ⭮騥  

IF ( cond ) stat

  㪠 ࠬ᪨ ࠢ ⨢  饥 ६.  
ᤥ  . ᫨ 室 ᨬ ELSE,   ᤢ  
ﭨ 45.  ᠭ ﭨ 45 㤥 ப

stat : IF ( cond ) stat ELSE_stat

⠪  ELSE 㤥 ᤢ   ﭨ.   ﭨ 23, ,
 ୠ⨢ ⢨, ᠭ  "."  ந ᫨ 
室 ᨬ  㪠   㪠 ⢨; ⠪ ࠧ  
砥 ᫨ 室 ᨬ  ELSE,    ࠬ᪮ ࠢ 
18:

stat : IF '(' cond ')' stat

 ࠧ ⨬,  , ᫥騥   ᤢ ⭮  㣨
ﭨ, ⮣  , ᫥騥    ⭮ 
ࠬ ࠬ᪨ ࠢ.  䠩 y.output  ࠢ ᠭ ᫥ 
ࠢ,    .  設⢥ ﭨ 㤥  
ࠩ  ⢨ ᤢ, ஥  㤥   㬮砭. 
짮⥫, ⮫襬  묨 䫨⠬ ᤢ/, ᪮॥
ᥣ 㤥    ஡  (y.output), ⮡ ,
   ⢨  㬮砭.  ⢨⥫쭮 ᫮ 
짮⥫   ᨬ ଠ樨    樨 , 
   ᠭ  .  ⮬ 砥  ப஢ 
⥮᪨ ࠡ⠬2,3,4; ⠪    襬 .


6. ਮ

 ﭭ  ,  㪠 ࠢ 
墠⠥  ࠧ襭 䫨⮢ --  ࠧ 䬥᪨ ࠦ.
  筮 ᯮ㥬 権  䬥᪨ ࠦ
  ⢥ ࠧ ᠭ  ஢ ਮ⮢ ஢
 ଠ樥    ࠢ 樠⨢. 뢠,    
᫥ ࠬ⨪  ᮮ⢥騬 ࠢ ࠭ 
᫥  ᯮ짮  ᮧ ஢,  ॥ 
 , 祬 , ஥  ਬ ᫥ ࠬ⨪.
᭮ ᯮᮡ  ࠬ᪨ ࠢ 

expr : expr OP expr



expr : UNARY expr

     㭠 権.  ᮧ 祭 ᫥
ࠬ⨪  ᫥묨 䫨⠬  ࠧ.  ⢥ ࠢ, 
࠭ ᫥, 짮⥫ 㪠뢠 ਮ,  ᨫ 
뢠,  ஢  樠⨢  ஢. ⮩ 
ଠ樨 筮, ⮡   ࠧ 䫨  ࠧ 
ᮮ⢥⢨  ⨬ ࠢ  ஢ ,  ॠ
 ਮ  樠⨢.

ਮ  樠⨢ ਯ뢠 ⮪  ᥪ樨 .  
   ᫥⥫쭮 ப, 稭  祢 ᫮ 
%left, %right  %nonasoc,  묨 ᫥ ᯨ᮪ ⮪.  ⮪ 
 ப,  騬  ஢ ਮ  
樠⨢; ப ᫥  浪 饣 ਮ 
ᨫ 뢠.  ࠧ, 

%left '+' '-'
%left '*' '/'

뢠 ਮ  樠⨢  䬥᪨ ஢.  
 樠⨢   訩 ਮ, 祬 窠  ஡,
 ⠪  樠⨢묨. 祢 ᫮ %right ᯮ
 ᠭ ࠢ樠⨢ ஢,  祢 ᫮ %nonassoc --
 ᠭ ⠪ ஢,  .LT.  ࠭,    
樨஢   㣮; ⠪ ࠧ,

A .LT. B .LT. C

⨬  ࠭  ⠪   뢠   祢
᫮ %nonassoc  .  ⢥ ਬ   , ᠭ

          %right    '='
          %left     '+' '-'
          %left     '*' '/'

          %%

          expr :    expr '=' expr
               |    expr '+' expr
               |    expr '-' expr
               |    expr '*' expr
               |    expr '/' expr
               |    NAME
               ;

 ᯮ짮, ⮡ ஢ 室 

a = b = c*d - e - f*g

᫥騬 ࠧ:

a = ( b = ( ((c*d)-e) - (f*g) ) )

 ᯮ짮 ⮣ 堭 㭠 ࠬ  饬 砥 
 ਮ.  㭠      
ᨬ᪮ ।⠢,  ࠧ ਮ. ਬ஬  
㭠   '-'; 㭠୮   ਤ   ᨫ,   
㬭,   , ⮣      ᨫ, 祬
㬭. 祢 ᫮ %prec  ஢ ਮ, 易  
 ࠬ᪨ ࠢ. %prec  ࠧ ᫥ ⥫ 
ࠬ᪮ ࠢ । ⢨  뢠饩 窮  ⮩ 
蠥  ⮪  ࠫ. Hਬ, ⮡ ਤ 㭠୮ 
  ਮ,  㬭, ࠢ  룫拉 :

          %left     '+' '-'
          %left     '*' '/'
          %%
          expr :    expr '+' expr
               |    expr '-' expr
               |    expr '*' expr
               |    expr '/' expr
               |    '-' expr       %prec '*'
               |    NAME
               ;

,    %left, %right  %nonassoc ⠪  , 
, ⠪    %token.

ਮ  樠⨢ c   ࠧ襭 䫨⮢ 
ࠧ;  뢠 ⢨ ࠢ ࠭ ᫥. ଠ쭮 
ࠢ ࠡ ᫥騬 ࠧ:

1. ਮ  樠⨢ 뢠   ⮪  ࠫ,
 ⠪.

2. ਮ  樠⨢ 뢠   ࠬ᪨ ࠢ;
 ਮ  樠⨢ ᫥ ⮪  ࠫ  ⥫
ࠢ.  %prec  ᯮ짮 ८। 祭  
㬮砭. H ࠬ᪨ ࠢ    易 ਮ 
 樠⨢. 

3.  ⢮ 䫨 /  ᤢ/  
室 ᨬ  ࠬ᪮ ࠢ   ਮ  
樠⨢, ⮣ ᯮ  ࠢ ࠭ ᫥,
ਢ  砫 ᥪ樨  ᮮ頥  䫨.

4. ᫨  䫨 ᤢ/  ࠬ᪮ ࠢ  室 ᨬ
 易 ਮ  樠⨢,  䫨 ࠧ蠥  
⢨ (ᤢ  )  訬 ਮ⮬. ᫨ ਮ 
, ᯮ 樠⨢;  樠⨢ ।
, ࠢ 樠⨢ -- ᤢ,  ⢨ 樠⨢ --
訡. 

䫨, ࠧ襭   ਮ    ᫮ 䫨⮢
ᤢ/  /,   ᮮ頥 .  砥,
 訡  㪠 ਮ⮢  뢠 訡  室 ࠬ⨪;
᫥ 㬥७ ᯮ짮 ਮ   ᭮ ᯮ짮   "⨫
७ ",   ਮ  . y.output 祭 
 襭,    ,  ॡ.


7. ࠡ⪠ 訡

ࠡ⪠ 訡 --  ࠩ ᫮    ஡, 易 
 -- ᥬ᪮ .  㦥 訡, ਬ,  
室 ࠢ ॢ ࠧ     ⠡ ᨬ ,
筮, ⠭ ४⥫  ।饭 ᮧ 쭥襣 室.

 뢠 筮 ⠭  ࠡ  㦥 訡; 
 த ᪠஢ 室   宦 쭥 
ᨭ⠪᪨ 訡.  ਢ  ஡   ᫥ 訡.
  ⬮  ⢫ ⮣ ᯮ 뢠
ண ⢠ ⮪  室 ப  ⪨ ਢ  冷
, ⠪    த.

⮡  짮⥫ ஫஢  ,  ।⠢
,  筮  .  ⮪ "error" १ࢨ஢
 ࠡ⪨ 訡.    ᯮ짮  ࠬ᪨ ࠢ;
 魮,   ᮮ頥  ,   訡   ந室
⠭ .  ⠫ 祭  ⥪,    
ﭨ  ࠧ襭 ⮪ "error". ⥬   ᥡ   ⮪ 
"error"  ⥪騬 LA-⮪  ந ⨢襥 ⢨. LA-⮪
⥬ ⠭  ⮪, 맢訩 訡. ᫨  㪠 
ᯥ樠 ࠢ ࠡ⪨ 訡, ࠡ⪠ 室  ४頥 
㦥 訡.

 ।饭 ᪠ ᮮ饭  訡  ᫥ 㦥
訡 ⠥  ﭨ 訡   ,   ⮪  
ᯥ譮 ⠭  ᤢ. ᫨ 訡 㦥,   㦥  
ﭨ 訡, ᮮ饭  뤠  室 ⮪ 㤠. 

 ⢥ ਬ, ࠢ 

stat : error

砥, ,  ⢨⥫쭮,  宦 ᨭ⠪᪮ 訡 
⠥ ய ,  ஬ 뫠 㢨 訡.  筮,
 㤥 ᪠஢ 室 ,  ᪥  ⮪,  
ᮮ⢥᢮ ,  筥 ࠡ  ࢮ  ; ᫨ 砫
஢ 筮 ࠧ,  ந 䠫  । 
,  ਢ  ᮮ饭  ன 訡,   ⢨⥫쭮
 . 

⢨  ᯮ짮  ⨬ ᯥ樠묨 ࠢ ࠡ⪨ 訡.
 ⢨   २樠஢ ⠡, ᢮ 
 ⠡ ᨬ  ..

ࠢ ࠡ⪨ 訡,  襯ਢ, 祭 ,  㤭 
஫.   ⠪ ࠢ, 

stat : error ';'

  砥 訡  ⠥ ய ,  ᤥ ,
ய᪠  ᫥饣 ';'.  ⮪ ᫥ 訡  । ᫥騬 ';' 
  ᤢ  뢠.   ';',  ࠢ 
   ⢫  ⢨ ⪨, 易  .

  ଠ ࠢ ࠡ⪨ 訡   ࠪ⨢ ਫ,
   ⥫쭮 ࠧ  ப  ࠧ ᫥ 訡.
 ࠢ ࠡ⪨ 訡  

          input:    error '\n'
                         { printf( "Reenter last line: " ); }
                    input
                         { $$ = $4; }
               ;

 ⥭樠쭠 㤭  ⨬ 室;   ४⭮ 
ࠡ  室 ⮪ । ⥬,   ,  ४⭮ 
ᨭ஭஢ ᫥ 訡. ᫨ ୮  ப ᮤন
訡    ⮪,  㤠 訡 ⮪  뤠
ᮮ饭;  ᮢ襭 ਥ.  ⮩ 稭  堭,
  ᯮ짮, ⮡ ⠢  ,  訡
뫠  ࠭. 

yyerrok ;

 ⢨, ஥ 頥   ଠ ०. ᫥ ਬ
   

          input:    error '\n'
                         { yyerrok;
                           printf( "Reenter last line: " );
                         }
                    input
                         { $$ = $4; }
               ;
 㦥 㯮 , ⮪, 㢨  ᫥ ᨬ "error" 
 室 ⮪,  ஬ 뫠 㦥 訡.    室;
ਬ, ⢨  ⠭ 訡    ᥡ 
४⭮    ࠡ⪨ 室 .  ⮬ 砥
।騩 LA-⮪   饭. 

yyclearin ;

 ⢨ 㤥   ⠪ 䥪. Hਬ, ।,  ⢨
᫥ 訡  맮 ᫮ 楤 ᨭ஭樨, ᠭ 
짮⥫,  ⠫ த 室   砫 ᫥饣
ࠧ襭 . ᫥ ⮣,  뫠 맢  楤, ᫥騩
⮪, 饭 yylex,  , 㤥  ⮪  ࠧ襭
; ,  ⮪   襭,  ﭨ 訡 --
㫨.    ᤥ   ⠪ ࠢ, 

          stat :    error
                    { resynch(); yyerrok ; yyclearin ; }
               ;

 堭  饬 ਧ ,   ⮥, 筮
䥪⨢ ⠭  ᫥ ⢠ 訡;  ⮣,
짮⥫  ࠢ ⢨ﬨ  ࠡ⪥ 訡, ॡ㥬 㣨
ﬨ ணࠬ.


8. । ࠡ 

 짮⥫ ᮧ ᯥ䨪 , 室  䠩 ணࠬ
 C, 뢠 y.tab.c  設⢥ ⥬ (-  ᮣ襭
  䠩   ࠧ  ⥬  ⥬). 㭪,
ந , 뢠 yyparse;  㭪 ⨯ integer.  
뢠,   ᢮ । ﭭ 뢠 yylex, ᪨ ,
।⠢塞 짮⥫ (. ᥪ 3)  祭 室 ⮪.
  殢  㦨 訡 --  ⮬ 砥 (᫨ 
⠭ ᫥ 訡) yyparse 頥 祭 1,  ᪨
 頥 ⮪     ᮢ蠥 ⢨ ਭ. 
⮬ 砥 yyparse 頥 祭 0.

짮⥫  ᯥ । ।  , ⮡ 
ࠡ ணࠬ. Hਬ,   ணࠬ  C   ।
ணࠬ main,   筮  뢠 yyparse. , 楤
yyerror ⠥ ᮮ饭  㦥 ᨭ⠪᪮ 訡.

  楤    ⮩   ଥ ।⠢ 짮⥫.
⮡ 㬥 砫 ᨫ  ᯮ짮 , ।⠢
⥪  ﬨ main  yyerror.  ⮩ ⥪   ⥬;
  ⥬ ⥪ ⠭ 㯭   㬥 -ly 
稪. ⮡  ਢ쭮  ணࠬ  㬮砭,  
ਢ  室 ⥪:

          main()
          {
               return( yyparse() );
          }


          # include <stdio.h>
          yyerror(s)
          char *s;
          {
               fprintf( stderr, "%s\n", s );
          }

㬥 yyerror  ப, ᮤঠ ᮮ饭  訡, 筮 ப
"syntax error". 筮 ਫ  襣. 筮 ணࠬ 
᫥  ஬ 室 ப      ᮮ饭, 
㦥 ᨭ⠪᪠ 訡.  integer ६ yychar ᮤন
 LA-⮪   ,  㦥 訡;    
  뤠 襩 ⨪.   ணࠬ main, ⭮,
ᠭ 짮⥫ ( ⥭ 㬥⮢  ..), ⥪  
⮫쪮  쪨 ஥    蠣 .

 integer ६ yydebug 筮 ⠭  0. ᫨  ⠭
 㫥 祭,  뤠 ᫮᭮ ᠭ ᢮ ⢨, 
㦤 ⮣,  室 ᨬ 뫨 ⠭   ⢨ .
 ᨬ  樮 ।  ⠭  ६,
ᯮ ⥬ ⫠.

9. 樨  ⮢ ᯥ䨪権

 ᥪ ᮤন ࠧࠧ ᪠  ⮢ 䥪⨢, 
塞   ᯥ䨪権.  ᥪ    
ᨬ.

室 ⨫

 ।⠢ ॠ ⢨ ࠢ, ࠭ ⠥ 䠩
ᯥ䨪権. H᫥騩 ४樨  ⨫   ᫥ ࠩ
୨.

a, ᯮ  㪢   ⮪,   ନ
.  ࠢ 뢠 "    砥 ஡".

b. 頩 ࠬ᪨ ࠢ  ⢨  ࠧ ப. 
    室  㣮.

c. 頩  ࠢ    ⮩    .   
 ⮫쪮  ࠧ  ࠧ  ᫥騥 ࠢ ⨪쭮 ⮩.

d. 頩   ⮩ ⮫쪮 ᫥ ᫥ ࠢ   
   ⤥쭮 ப.      ࠢ. 

e. ࠢ ⥫ ࠢ  ⠡ﬨ,  ⥫ ⢨ -- ६.

ਬ  ਫ A ᠭ  ⮬ ⨫, ⠪    ਬ  ⥪ 
 (  ). 짮⥫  ᠬ   ⨫᪨
; , 業ࠫ쭮 ஡  ⠡쭮 ࠢ 
 ᨭ  ⢨.


 ४

, ᯮ㥬 ஬    ⠪ 뢠 -४ᨢ
ࠬ᪨ ࠢ: ࠢ 

name : name rest_of_rule ;

 ࠢ    ᠭ ᯥ䨪権 ᫥⥫쭮⥩ 
ᯨ᪮:

          list :    item
               |    list ',' item
               ;

          seq  :    item
               |    seq item
               ;

    砥 ࢮ ࠢ    ⮫쪮  ࢮ
।,  ஥ -- ⮫쪮  ண   ᫥.

 ࠢ-४ᨢ묨 ࠢ, ⠪ 

          seq  :    item
               |    item seq
               ;

 㤥  ,  । 㤥    ࠢ .
  , ७ ⥪  㤥 ஦ ᭮ 
९  ⥭ 祭  ᫥⥫쭮⥩.  ࠧ,
짮⥫  ᯮ짮  ४ ,   ਥ. 

⮨ 㤨,   -  ᫥⥫쭮   
⮢,  ᫨ , 㤨 ᠭ ᯥ䨪樨 ᫥⥫쭮 
 ࠢ:

          seq  :    /* empty */
               |    seq item
               ;

塞, ࢮ ࠢ ᥣ 㤥  ஢  ࠧ, । ⥬,
 ⠭  ।,  ⥬  ࢮ ࠢ  ࠧ 
 ।. 襭  ᫥⥫쭮⥩    
㢥稢饩 魮.    䫨, ᫨  
,   ᫥⥫쭮 뫠 㢨,    
筮, ⮡  .

᪨ "ਭ㤨⥫ ⨬"

H ᪨ 襭   ⥪. Hਬ, ᪨
   㤠  ࠭⢠,  ⮫쪮  
ப  窠.    뢠  ⠡ ᨬ  ,
   ࠦ.

  ᯮᮡ ࠡ⪨ ⠪ 樨  ᮧ 쭮 䫠,
訢 ᪨ ஬  ⠭ ⢨ﬨ. Hਬ,
।,  ணࠬ ⮨     ,  묨 
᫥ 0   ஢. ᬮਬ:

          %{
          int dflag;
          %}
          ... other declarations ...
          %%

          prog :    decls stats
               ;
          decls:    /* empty */
                         { dflag = 1; }
               |    decls declaration
               ;
          stats:    /* empty */
                         { dflag = 0; }
               |    stats statement
               ;
               ... other rules ...

 dflag  ⥭ ஢ ⠫ 0,   ⥭  -- 1, 
᪫祭 ࢮ ⮪  ࢮ .  ⮪   㢨
஬ । ⥬,    ᪠,  ᥪ  稫  
砫 .   ,  ⢥ ᪫祭 
ࠣ ᪮ ᪠஢.

 ਥ "୮ 室"   ᯮ짮  ।.   , 
⠢ ᮡ ᯮᮡ,   ᤥ ,  ᫮, ᫨ 
ᮢᥬ  ᤥ  㣮.


१ࢨ஢ ᫮

H 모 ணࠬ஢  짮⥫ ᯮ짮 ⠪
᫮,  "if",  筮 १ࢨ,  ⪨   ६,
 ᫮ ⮣,  ⠪ ᯮ짮  䫨   
ᯮ짮    몥 ணࠬ஢.  ࠩ ᫮ ᤥ  
ࠬ ; ᫮ । ᪮  ଠ  ⮬, 
"  'if'  祢 ᫮,   -- ६". 짮⥫
 ᮢ , ᯮ 堭, ᠭ  ᫥ ᥪ樨, 
 㤭.

H஥  ᯮᮡ  祭 ⮣ are under advisement.
  , , ⮡ 祢 ᫮ 뫨 १ࢨ஢;   饭
 ᯮ짮  ⢥  ६.   砥,  ᨫ
⨫᪨ 稭, ⮡ ।  .

10. த ⥬.

 ⮩ ᥪ樨 㦤 ᪮쪮 த ⥩ .

㫨஢ 訡  ਭ   ⢨.

⢨  訡  ਭ⨥   ᨬ㫨஢   ⢨,
ᯮ  YYACCEPT  YYERROR. YYACCEPT ⠢ yyparse 
祭 0; YYERROR ⠢   ᥡ ⠪,   ⥪騩 ᨬ
 ᨭ⠪᪮ 訡; 뢠 yyerror  ந室 ࠢ 訡.
 堭  ᯮ짮  ᨬ㫨஢ ஢  ᫥묨
થࠬ   ⭮-⢨⥫쭮 ஢ન ᨭ⠪.

  ६   Enclosing Rules.

⢨    祭, 頥 ⢨ﬨ ᫥  
⥪饣 ࠢ. 堭 筮 ⠪ ,     ⢨, 
  ᫥饩 ன,   ⮬ 砥    0  
⥫ ᫮. ।

          sent :    adj noun verb adj noun
                         { look at the sentence ... }
               ;
          adj  :    THE
                         { $$ = THE; }
               |    YOUNG
                         { $$ = YOUNG; }
                    . . .
               ;
          noun :    DOG
                         { $$ = DOG; }
               |    CRONE
                         { if( $0 == YOUNG ) printf( "what?\n" );
                           $$ = CRONE;
                         }
               ;
          . . .

 ⢨, ᫥騬  ᫮ CRONE ந室 ஢ઠ,    ।騩
⮪ ࠢ YOUNG. 祢,   ⮫쪮 ᫨ ⭮   ⮬,
   । ᨬ noun  室.  ᮢ襭  ୮.
,  堭       嫮, ᮡ
 室 ᪫ ᪮쪮 ॣ 権   ⠫쭮
ॣ୮ .

প  ந ⨯ 祭

 㬮砭 祭, 頥 ⢨ﬨ  ᪨ ஬ --
楫.   ⠪ ন 祭 㣨 ⨯,  . 
,  ᫥  ⨯  ⠢ ᮮ⢥騥  童
union, ⠪  稢訩  ண ⨯஢. ⥪ 祭 
  union ࠧ ⨯  祭. 짮⥫ 
union  뢠  童 union   ⮪  ନ ᨬ,
騬 祭.  ந室 뫪  祭   樨
$$  $n,  ⮬᪨ ⠢ ᮮ⢥饥  union'a, ⠪  
ந ⥫ ८ࠧ. ,  ஢ન ⨯,
⠪  Lint [5]   ᥡ ⥫쭮 .

  堭  ᯥ祭 ⮩ ⨯樨. -, 
। union;   ந 짮⥫, ⮬  ⠫
ணࠬ, ᮡ ᪨ ,     童
union. -,  易  童 union  ⮪  ନ묨
ᨬ. H,  堭 ᠭ ⨯  ᪮쪨 祭,
      । ⨯. 

  union 짮⥫ 砥  ᥪ :

%union { body of union ... }

  ⥪ 祭   譨 ६ yylval  yyval  騥
⨯, ࠢ ⮬ union. ᫨  饭  樥 -d,  union'a 
  䠩 y.tab.h.  㣮 ஭ union     
筮 䠩  ᯮ typedef  । ६ YYSTYPE,
।⠢饩  union.  ࠧ,  筮 䠩   ⠪
᪠:

typedef union { body of union ... } YYSTYPE;

 䠩   祭  ᥪ    %{  %}.

 । YYSTYPE,  童 union'a   易  ࠧ묨
ନ묨  ନ묨 . 

<name>

ᯮ  祭  童 union'a. ᫨   ᫥
   祢 ᫮ %token, %left, %right  %nonassoc,  童 union
뢠  ᫥묨 ⮪.  ࠧ,

%left <optype> '+' '-'

ਢ  ⮬,   뫪    ⮪  祭 
童 union'a "optype". 㣮 祢 ᫮ %type ᯮ  
ࠧ  樨஢  童 union'a  ନ묨 ᨬ. 
 ࠧ,  ᪠

%type <nodetype> expr stat

⠥ ᪮쪮 砥,   堭 筮. ᫨  
ࠢ  ⢨,  祭, 饭 ⨬ ⢨   ⨯
a priori.  ࠧ 뫪  -⥪ 祭 (⠪  $0 --
. । ᥪ) ⠢     ᭥ ⨯. 
⮬ 砥 뫪   ⨯஢   ⠢  童 
union'a  <  >, ࠧ ᫥ 砫쭮 $. ਬ஬ ⠪ ᯮ짮 


          rule :    aaa
                         { $<intval>$ = 3; }
                    bbb
                         { fun( $<intval>2, $<other>0 ); }
               ;

⠪ has little to recommend,     ।.

ਬ ᯥ䨪樨   ਫ C. ।⢠  ⮩ ᥪ樨  
,    ᯮ짮:  ⭮, ᯮ짮 %type 
  堭.   ᯮ, ⮤ ஢ન  ண. 
Hਬ, ᯮ짮 $n  $$  饭  祬-  । ⨯
. ᫨  ।⢠  祭, ⥪ 祭  ᯮ
 ࠭ 楫,   뫮 ᪨.

11. ୮

  易 㯯 짮⥫,  㦤   । 
ᮡ⢥ ᪫⥩     ।  ᯮᮡ⥩,  ᢮
᪮筮 ᪥ "  ".  ࠧࠦ饥  
     ᯮᮡ 筮   ⮬,      
ᯮᮡ; 襩   뫨 ࠢ. B.  W. Kernighan, P. J. Plauger, 
S. I. Feldman, C. Imagna, M. E. Lesk, and A. Snyder 㧭  ᢮ 
 ⥪饩 ᨨ . C. B. Haley ᤥ    ⠭ ᫥
訡. D. M. Ritchie, B. W. Kernighan, and M. O.  Harris  ॢ 
㬥  ᪨. Al Aho ⠪ 㦨 ᯥ樠쭮 㯮 
ਢ   堬  㣨 .

뫪


1.   B. W.  Kernighan D.  M. Ritchie, The C Programming Language,
     Prentice-Hall, Englewood Cliffs, New Jersey (1978).

2    A. V.  Aho S.  C. Johnson,  "LR Parsing," Comp. Surveys Vol.
     6(2) pp. 99-124 (June 1974).

3.   A. V.  Aho, S.  C. Johnson,  J.  D.  Ullman,  "Deterministic
     Parsing of  Ambiguous Grammars,"  Comm. Assoc.  Comp.  Mach.
     Vol. 18(8) pp. 441-452 (August 1975).

4.   A. V.  Aho J.  D. Ullman,  Principles  of  Compiler  Design,
     Addison-Wesley, Reading, Mass. (1977).

5.   S. C. Johnson, "Lint, a C Program Checker," Comp. Sci. Tech.
     Rep. No. 65 (1978). updated version TM 78-1273-3

6.   S. C.  Johnson, "A  Portable Compiler: Theory and Practice,"
     Proc. 5th  ACM Symp. on Principles of Programming Languages,
     pp. 97-104 (January 1978).

7.   B. W.  Kernighan L.  L. Cherry,  "A System  for  Typesetting
     Mathematics," Comm.  Assoc. Comp.  Mach. Vol. 18 pp. 151-157
     (March 1975).

8.   M.E. Lesk,  "Lex - A Lexical Analyzer Generator," Comp. Sci.
     Tech. Rep.  No. 39,  Bell  Laboratories,  Murray  Hill,  New
     Jersey (October 1975).


ਫ A. ⮩ ਬ

 ⮬ ਬ   ᯥ䨪   讣 ⮫쭮
;  ⮫쭮  26 ॣ஢, ન஢  "a" 
"z",  ਭ 䬥᪨ ࠦ, ⠢  ஢ 
+, -, *, /, % ( mod), & (⮢ AND), | (⮢ OR) 
ᢠ. ᫨ ࠦ  孥 ஢  ᢠ,  祭 
⠥;  ⨢ 砥 -- ⠥.    , 楫 祭, 
稭饥  0 () ⠥ ᠭ  쬥筮 ⥬ ᫥;
 ⨢ 砥 --  筮.

 ⢥ ਬ ᯥ䨪樨 , ⮫  த뢠 
 ࠡ, 뢠 ᯮ짮 ਮ⮢  ᫥⥩ 
 ⮥ ⠭ ᫥ 訡.  饭  ⮬, 
䠧 ᪮  ⥫쭮 , 祬  設⢠ ਫ,
 室   ࠧ , ப  ப. ,  
ᯮᮡ ࠬ᪨ ࠢ    쬥 楫; 
, ⭮,   ᪮ .

%{
# include <stdio.h>
# include <ctype.h>

int regs[26];
int base;
%}

%start list
%token DIGIT LETTER
%left '|'
%left '&'
%left '+' '-'
%left '*' '/' '%'
%left UMINUS /* ᯥ稢 ਮ  㭠୮  */

%%        /* 砫 ᥪ樨 ࠢ */

list :    /*  */
     |    list stat '\n'
     |    list error '\n'
               { yyerrok; }
     ;
stat :    expr
               { printf( "%d\n", $1 ); }
     |    LETTER '=' expr
               { regs[$1] = $3; }
     ;
expr :    '(' expr ')'
               { $$ = $2; }
     | expr '+' expr
               { $$ = $1 + $3; }
     | expr '-' expr
               { $$ = $1 - $3; }
     | expr '*' expr
               { $$ = $1 * $3; }
     | expr '/' expr
               { $$ = $1 / $3; }
     | expr '%' expr
               { $$ = $1 % $3; }
     | expr '&' expr
               { $$ = $1 & $3; }
     | expr '|' expr
               { $$ = $1 | $3; }
     | '-' expr          %prec UMINUS
               { $$ = - $2; }
     | LETTER
               { $$ = regs[$1]; }
     | number
     ;
number : DIGIT
               { $$ = $1; base = ($1==0) ? 8 : 10; }
     | number DIGIT
               { $$ = base * $1 + $2; }
     ;
%%        /* 砫 ணࠬ */

yylex()
{              /* ணࠬ ᪮  */
/* 頥 LETTER   㪢, yylval = 0-25 */
/* 頥 DIGIT  , yylval =  0  9 */
/*  ⠫ ᨬ    */
     int c;
     while( (c=getchar()) == ' ' ) {/* ய ஡ */ }
               /* c ⥯  ஡ */
          if( islower( c ) ) {
               yylval = c - 'a'; return ( LETTER );
          }
          if( isdigit( c ) ) {
               yylval = c - '0'; return( DIGIT );
          }
          return( c );
     }

ਫ B: 室 ᨭ⠪ 

 ⮬ ਫ 室 ᠭ 室 ᨭ⠪   
ᯥ䨪樨 . ⥪ ᨬ  ..  뢠.  ஭
ᯥ䨪 室 몠   ⢥ ।⠢  
ࠬ⨪ LR(2); ⭠  稭,  䨪 室
 ࠢ     ᫥ ⢨. ᫨   䨪஬ 
᫥ 稥,   -- 砫 ᫥饣 ࠢ;  ⨢ 砥 --
 த ⥪饣 ࠢ,  ஬ ᮤন ⢨. ᪨ 
 ᬮ । ᫥ ⮣,  㢨 䨪  蠥, 
  ᫥騩 ⮪ (ய᪠ ஡,  ப, ਨ 
..) 稥. ᫨ ,  頥 ⮪ C_IDENTIFIER.  ⨢
砥  頥 IDENTIFIER. ࠫ (ப  窠) ⠪ 
 IDENTIFIER',      C_IDENTIFIER'.


          /* ࠬ⨪ 室   */

/* ࢨ 魮 */

%token IDENTIFIER   /* 砥  ᥡ 䨪  ࠫ */
%token C_IDENTIFIER /* 䨪 (  ࠫ),   ᫥ 
                         稥 */
%token NUMBER       /* [0-9]+ */

/* १ࢨ஢ ᫮: %type => TYPE, %left => LEFT,  .. */

%token LEFT RIGHT NONASSOC TOKEN PREC TYPE START UNION
%token MARK    /* ⬥⪠ %% */
%token LCURL   /* ⬥⪠ %{ */
%token RCURL   /* ⬥⪠ %} */
/* ࠫ - ascii ᨬ  ᠬ ᥡ */

%start spec
%%

spec :    defs MARK rules tail
     ;
tail :    MARK
               {  ⮬ ⢨ ண稢 ⮪ ࠢ }
     |    /* ⮥: ன MARK 易⥫ */
     ;
defs :    /*  */
     |    defs def
     ;
def  :    START IDENTIFIER
     |    UNION
               { ஢ । union  室 䠩 }
     |    LCURL { ஢   C  室 䠩 } RCURL
     |    ndefs rword tag nlist
     ;
rword:    TOKEN
     |    LEFT
     |    RIGHT
     |    NONASSOC
     |    TYPE
     ;

tag  :    /* : ⥣ union' 易⥫ */
     |    '<' IDENTIFIER '>'
     ;
nlist:    nmno
     |    nlist nmno
     |    nlist ',' nmno
     ;
nmno :    IDENTIFIER /* H: ࠫ 饭  %type */
     |    IDENTIFIER NUMBER /* H: 饭  %type */
     ;

/* ᥪ ࠢ */

rules:    C_IDENTIFIER rbody prec
     |    rules rule
     ;
rule :    C_IDENTIFIER rbody prec
     |    '|' rbody prec
     ;
rbody:    /* empty */
     |    rbody IDENTIFIER
     |    rbody act
     ;
act  :    '{' { ஢ ⢨, ࠭᫨஢ $$,  .. } '}'
     ;
prec :    /*  */
     |    PREC IDENTIFIER
     |    PREC IDENTIFIER act
     |    prec ';'
     ;


ਫ C: த ਬ

 ⮬ ਫ  ਬ ࠬ⨪  ᯮ짮  
த ⥩, 㦤  ᥪ樨 10. ਬ  ⮫
஬  ਫ A  ⠪, ⮡ 稫 ⮫
,  ᯥ稢 䬥⨪  ࢠ  祪.
  ⠭  饩 窮, 䬥᪨ 樨 +,
-, *, /, 㭠 -,  = (ᢠ)   26 ६  饩 窮,
 "a"  "z".  ⮣,  ⠪  ࢠ, ᠭ  
          ( x , y )
 x   ࠢ y.   ᯮ짮 26 ࢠ-६ --
 "A"  "Z",  ⠪  ᯮ짮. ᯮ짮  
⮬,  뫮  ਫ A; ᢠ   祭,  祣 
, ⮣  ࠦ  祭 ( 饩 窮  
ࢠ).

 ⮬ ਬ ᫥      C. ࢠ
।⠢   , 饩  祭   ࠢ 殢,
࠭   double. ⨬ ࠬ   TYPEDEF   ⨯, 
INTERVAL. ⥪ 祭  ⠪  ᮤঠ ᫠  饩 窮 
楫 (ᯮ㥬    ᨢ, ᮤঠ 祭 ६). 
,   ⥣ ᨫ쭮    ᢠ
  union'  C.  ⢨⥫쭮  ⢨ 뢠 㭪樨,
⠪ 騥 .

 ⮨  ᯮ짮 YYERROR  ࠡ⪨ ᫮ 訡: 
 ࢠ, ᮤঠ騩 0  ࢠ, ᠭ  ࠢ쭮 浪. H
ᠬ , 堭 ⠭ ᫥ 訡   ᯮ 
뢠 ⪠ ப-⥫쭨.

   ᬥ訢 ⨯  ⥪ 祭,  ࠬ⨪ ⠪ 
 ᭮ ᯮ짮 ᨭ⠪  ᫥ ⨯ (..
᪠୮  ࢠ쭮) ஬ ࠦ. ,  ᪠ 
  ⮬᪨ ८ࠧ  ࢠ, ᫨ ⥪ ॡ
ࢠ쭮 祭.  뢠 讥 ⢮ 䫨⮢  ࠡ⪥
ࠬ⨪ : 18 ᤢ/  26 /.  ஡
  㢨  拉    ப

          2.5 + ( 3.5 - 4. )

          2.5 + ( 3.5 , 4. )

,  2.5 ᯮ  ࠦ ࢠ쭮 ⨯  ஬ ਬ,
  䠪 ⥭   ,   ⠭ ",";  ⮬ ६ 2.5
祭        ᢮ .   ,
  室 ᬮ ।  ந쭮 ⢮ ⮪,
⮡ , ८ࠧ뢠  ᪠  ࢠ.  ஡ 室 
ᯮ짮  ࠢ   ୮ , ࠡ饣  
ࢠ: ,   ࠭ -- ᪠   --   ࠭ 
-- ࢠ.  ஬ 砥 ࠢ ࠭   ࢠ, ⠪ 
८ࠧ 㤥 ਬ ⮬᪨. Hᬮ   㪫, 
 ⠥  砥,  ८ࠧ     
ਬ,    㪠 䫨⠬.  ࠧ ᫥
ࠢ, ॡ ᪠஢, 묨  䠩 ᯥ䨪権; ⠪ ࠧ,
䫨 ࠧ  ஭ ࠭ ᪠୮-⨯஢ 祭
᪠୮-⨯஢묨   ,   㦤  ८ࠧ뢠 
ࢠ.

 ᯮᮡ ࠡ⪨ ⠢ (᫥?) ⨯ 祭 ⥫,  
祭 騩. ᫨  뫮  ⨯ ࠦ,     ⨯,
⢮ ॡ㥬 ࠢ ᫮  ࠬ᪨,  ⢮ 䫨⮢ --
  ࠬ᪨.  ࠧ, ᬮ  ⥫쭮 ਬ, 
筮 । ணࠬ஢  㤥 ࠭ ଠ  ⨯  
祭,     ࠬ⨪. 

H,   ᪮ . ⢥ 筠  -- ࠡ⪠
⠭  饩 窮. ணࠬ ⥪ C atof ᯮ 
ந ८ࠧ  ப ᨬ  祭   筮.
᫨ ᪨  । 訡,  ॠ  ,  
⮪, 饭  ࠬ⨪, 뢠 ᨭ⠪ 訡   
 ⠭ ᫥ 訡.

%{
# include <stdio.h>
# include <ctype.h>

typedef struct interval { double lo, hi; } INTERVAL;

INTERVAL vmul(), vdiv();
double atof();
double dreg[ 26 ];
INTERVAL vreg[ 26 ];
%}

%start lines

%union { int ival; double dval; INTERVAL vval; }

%token <ival> DREG VREG  /*   ᨢ dreg, vreg */
%token <dval> CONST      /* ⠭  饩 窮 */
%type <dval> dexp        /* ࠦ */
%type <vval> vexp        /* ࢠ쭮 ࠦ */

/* ଠ  ਮ ஢ */

%left     '+' '-'
%left     '*' '/'
%left     UMINUS /* ਮ 㭠୮  */
%%

lines:    /* empty */
     |    lines line
     ;
line :    dexp '\n'
               { printf( "%15.8f\n", $1 ); }
     |    vexp '\n'
               { printf("(%15.8f , %15.8f )\n", $1.lo, $1.hi ); }
     |    DREG '=' dexp '\n'
               { dreg[$1] = $3; }
     |    VREG '=' vexp '\n'
               { vreg[$1] = $3; }
     |    error '\n'
               { yyerrok; }
     ;
dexp :    CONST
     |    DREG
               { $$ = dreg[$1]; }
     |    dexp '+' dexp
               { $$ = $1 + $3; }
     |    dexp '-' dexp
               { $$ = $1 - $3; }
     |    dexp '*' dexp
               { $$ = $1 * $3; }
     |    dexp '/' dexp
               { $$ = $1 / $3; }
     |    '-' dexp       %prec UMINUS
               { $$ = - $2; }
     |    '(' dexp ')'
               { $$ = $2; }
     ;
vexp :    dexp
               { $$.hi = $$.lo = $1; }
     |    '(' dexp ',' dexp ')'
               { $$.lo = $2; $$.hi = $4;
                 if( $$.lo > $$.hi ){
                    printf( "interval out of order\n" );
                    YYERROR;
                 }
               }
     |    VREG
               { $$ = vreg[$1]; }
     |    vexp '+' vexp
               { $$.hi = $1.hi + $3.hi; $$.lo = $1.lo + $3.lo; }
     |    dexp '+' vexp
               { $$.hi = $1 + $3.hi; $$.lo = $1 + $3.lo; }
     |    vexp '-' vexp
               { $$.hi = $1.hi - $3.lo; $$.lo = $1.lo - $3.hi; }
     |    dexp '-' vexp
               { $$.hi = $1 - $3.lo; $$.lo = $1 - $3.hi; }
     |    vexp '*' vexp
               { $$ = vmul( $1.lo, $1.hi, $3 ); }
     |    dexp '*' vexp
               { $$ = vmul( $1, $1, $3 ); }
     |    vexp '/' vexp
               {
                 if( dcheck( $3 ) ) YYERROR;
                 $$ = vdiv( $1.lo, $1.hi, $3 );
               }
     |    dexp '/' vexp
               {
                 if( dcheck( $3 ) ) YYERROR;
                 $$ = vdiv( $1, $1, $3 );
               }
     |    '-' vexp       %prec UMINUS
               { $$.hi = -$2.lo; $$.lo = -$2.hi; }
     |    '(' vexp ')'
               { $$ = $2; }
     ;
%%

# define BSZ 50 /* ࠧ   ᥫ  饩 窮 */

/* ᪨  */

yylex()
{
     register c;
     while( (c=getchar()) == ' ' ) { /* skip over blanks */ }
     if( isupper( c ) ) {
          yylval.ival = c - 'A'; return( VREG );
     }
     if( islower( c ) ) {
          yylval.ival = c - 'a'; return( DREG );
     }
     if( isdigit( c ) || c=='.' ) {
               /* ࠭ , 祪, ᯮ */
          char buf[BSZ+1], *cp = buf;
          int dot = 0, exp = 0;
          for( ; (cp-buf)<BSZ ; ++cp,c=getchar() ) {
               *cp = c;
               if( isdigit( c ) ) continue;
               if( c == '.' ) {
                    if( dot++ || exp ) return( '.' );
                         /* 맮 ᨭ⠪ 訡 */
                    continue;
               }
               if( c == 'e' ) {
                    if( exp++ ) return( 'e' );
                         /* 맮 ᨭ⠪ 訡 */
                    continue;
               }
                    /*  ᫠ */
               break;
          }
          *cp = '\0';
          if( (cp-buf) >= BSZ )
               printf( "⠭ ᫨誮 : १\n" );
          else ungetc( c, stdin ); /*  ⭮ ᫥ ⠭ 
								ᨬ */
          yylval.dval = atof( buf );
          return( CONST );
     }
     return( c );
}

INTERVAL hilo( a, b, c, d )
double a, b, c, d;
{ /* 頥 訩 ࢠ, ᮤঠ騩 a, b, c  d */
     /* ᯮ 楤ࠬ *, / */
     INTERVAL v;
     if( a>b ) { v.hi = a; v.lo = b; }
     else { v.hi = b; v.lo = a; }
     if( c>d ) {
          if( c>v.hi ) v.hi = c;
          if( d<v.lo ) v.lo = d;
     }
     else {
          if( d>v.hi ) v.hi = d;
          if( c<v.lo ) v.lo = c;
     }
     return( v );
}

INTERVAL vmul( a, b, v )
double a, b; INTERVAL v;
{
     return( hilo( a*v.hi, a*v.lo, b*v.hi, b*v.lo ) );
}

dcheck( v )
INTERVAL v;
{
     if( v.hi >= 0. && v.lo <= 0. ) {
          printf( "ࢠ -- ⥫ ᮤন 0.\n" );
          return( 1 );
     }
     return( 0 );
}

INTERVAL vdiv( a, b, v )
double a, b;
INTERVAL v;
{
     return( hilo( a/v.hi, a/v.lo, b/v.hi, b/v.lo ) );
}

ਫ D:  , ন,   ४㥬

 ⮬ ਫ 㯮 ᨭ  , ন  
᪮ 楫⭮, ,  ࠧࠧ 稭,  ४㥬.

1. ࠫ ⠪  ࠧ 묨 窠 <">.

2. ࠫ       ᨬ. ᫨  ᨬ
䠢, ᫮  _, । type number ࠫ,  ᫨ 
   﫮 祪.  ⨢ 砥 ᫮  祭 
⠪ ࠫ. ᯮ짮 ᨬ ࠫ ᪮॥ ᥣ 
 ࠢ쭮  ,    , ⠪   ࠧ㬥, 
  ࠡ,  筮  ᪨ ஬.

3.  襩  ,  ࠧ襭 %, ⠪  ᯮ짮 ⭠
  "\".  ⭮, \\    ᠬ,   %%m \left   
ᠬ,   %left,  ..

4.  ᪮쪮 㣨 ᨭ:
   %<    ᠬ,  %left
   %>    ᠬ,  %right
   %binary  %2    ᠬ,  %noassoc
   %0  %term    ᠬ,  %token
   %=    ᠬ,  %prec

5. ⢨  ⠪  
       ={ . . . }
 䨣 ᪮   襭, ᫨ ⢨ -- ⢥  
C.

6.   C  %{  %} ࠧ蠥   ᥪ樨 ࠢ, ⠪   
ᥪ樨 .

