stanford-oval/wikipedia huggingface dataset:
Yacc
基本構成 > 入出力と処理

ユーザは変換仕様をYacc文法ファイルとしてのテキストファイルを作っておく。
yaccコマンド
yacc [-dlrtv ] [-b prefix] fileName
は、fileName で与えたYacc文法ファイル（たとえば"wiki_samp1.y"）（伝統的に拡張子は.yがつけられることが多かった）から構文規則を入力し、それに基づくLALR構文解析器になるC言語のソースプログラム（通常"y.tab.c"）を出力する。-rオプションでコード部分だけ"y.code.c"ファイルに独立させることもできる。
このC言語ソースプログラムにはLALR解析テーブルおよびドライバルーチンが含まれる。
特に、構文解析全体を行う関数にはyyparse()という名前がついている。よってこのプログラムにあらかじめ適宜yyparse()を呼び出すmain()関数を加えておくなどして（それはYacc文法ファイル中の「追加Ｃプログラム部」での記述でも可能）、ほしい変換プログラムを完成することができる。
-dオプションで生成するヘッダファイル"y.tab.h"は、Lexがトークン処理を行うときに、Yaccが割り当てたトークン値（256～）を正しく使うよう、Lex実行時に与える。
-vオプションにより、生成パーサの文法、終端記号、非終端記号、状態の種類とそれぞれの判定パターンおよびそのシフト、還元等の措置や状態遷移先といった解析テーブル情報が、人に分かりやすい形でテキストファイル"y.output"に出力される。（この"y.output"リストの見方が分かりにくい。ピリオド「.」（Yaccの種類によっては下線「_」）は現在のカーソル位置であることなどは知らないと分からないであろう。説明は日本語文書では良書「Cコンパイラ設計(yacc・lexの応用)
」のほかに見つけにくいが、英語ではいくつかある




）
-tオプションを指定すると、生成パーサが実行されるときに、状態番号、スタック状態、読んだトークン、意味値の演算の様子、変化した状態番号などが、逐一標準エラー出力に表示されるのでデバッグに役立つ（コンパイルオプションも関連）。
次に、Yaccで生成し構文解析器ソースプログラム（"y.tab.c"）をccコマンドやgccコマンドなどでコンパイルする。このとき、Lexも利用したのであればその出力（"lex.yy.c"）も並べて指定する。これらに対応するライブラリもコンパイルオプションによってリンクさせる。
コンパイルで作成された変換プログラムを実行すると、標準入力（FILEポインタyyinで変更可能）（yywrap関数で複数ファイルの連結が可能）から変換するファイルを読み込む。これを字句解析器関数yylex()によってトークンにして構文解析が実行される。変換結果やエラーは、Yaccのアクション部や呼ばれる関数で書いた処理によりそれぞれ出力される。syntaxエラーなどは通常標準エラー出力に出るが、形式や出力先をエラー報告関数yyerror()でカスタマイズできる。Yaccのオリジナルなエラーメッセージでは情報が貧弱である。開発・運用で頭を抱えないようにするためには、特に発生場所のファイル名、行番号およびトークン番号などをエラーメッセージに追加するようにyyerror()を作っておくことが望ましい。
基本構成 > 入出力と処理 > コマンド例

Yacc文法ファイルwiki_samp1.y（後述）から構文解析実行プログラムwiki1.exeを実行するまでの実際のコマンド例（Windows Cygwin環境）を示す。
> bison -ydv ./wiki_samp1.y
 > gcc -DYYERROR_VERBOSE -DYYDEBUG ./y.tab.c -ly -lm -o wiki_samp1_parser > wiki_samp1_gcc_outlist.txt
 > ./wiki_samp1_parser.exe < ./indata.txt
GNUコマンドプログラムbison はYacc上位互換であって、オプション -y によりYacc互換の処理をしてくれる。
解析させるファイルindata.txtの中には、たとえばテスト用の文字列「10+20*30-40《改行》」を入れておく。もちろん「 < indata.txt」を除いて対話的に手入力してもよい。
基本構成 > Yacc文法ファイルの書き方

Yaccの構成は以下のようになっている。
%{
 （Ｃ宣言部：ヘッダファイルのインクルードなどC言語の初期設定）
%}
 （Yacc宣言部：トークンおよび優先順序の定義など）
%union {
 （トークンやグループとその意味値の型の定義）
}
%%
 （文法規則部：構文規則）
%%
 （追加Ｃプログラム部：以下はそのままプログラムに出力される）
基本構成 > 電卓プログラム生成例による動作解説

以下に、Wikipedia用に作成した動作確認済サンプルプログラムを示し、その動作を逐次説明していく。
基本構成 > 電卓プログラム生成例による動作解説 > 課題プログラムの仕様

いま作ろうとする電卓は、内部的に64ビット浮動小数点で動作し、整数と演算子、カッコなどからなる式を与えて改行すると計算結果を答えるという会話を繰り返すものである。
目的とする出力例
Calculator start.
 ?> 10+20*30-40
  Ans = 570
 ?>   Bye.
小数はサポートしないが、「314/100」のように整数の除算で小数にあたる数を与えることはできる。
基本構成 > 電卓プログラム生成例による動作解説 > サポートすべき演算子

「+」、「-」、「*」、「/」、べき乗の「**」、剰余の「%」。
「+」および「-」においては単項と二項の両方。
カッコ「()」で演算順序を明示すること。
基本構成 > 電卓プログラム生成例による動作解説 > Yacc構文定義ファイルの内容（前半）

課題プログラムのYacc構文定義は以下のように作ることができる。これをたとえば、ファイル "wiki_sample.y" に入れ、Lex出力ソースに代えて後述の「後半」内容をつないで作成し、上記#コマンド例のように実行すればよい。
%{         /*----- 【1】ここからＣ宣言部（C declarations） -----*/
 #include <stdio.h>
 #include <ctype.h>
 #include <math.h>
 #define YYDEBUG 1
 %}
 
            /*----- 【2】ここからYacc宣言部（Yacc declarations） -----*/
 %start dialogue;   /* 文法規則部で記述する最大の構造の名前 */
 
 %union {           /* 意味値に可能な値型の集合 */
    int             ival;       /*  4バイト．*/
    long double     ldval;      /* 12バイト．*/
 }
 
 %token         EOL         /* トークン  （終端記号）の定義．*/
 %token <ldval> NUM         /* トークン  （終端記号）とその意味値yylvalの型の定義．*/
 %type  <ldval> expr        /* グループ（非終端記号）とその意味値yylvalの型の定義．*/
 
 %left  '+'  '-'            /* 優先順序等の定義. 優先の低から高に配列する．*/
                            /* leftは左結合性．例：1-2-3 は 1-(2-3) ではなく (1-2)-3 */
 %left  '*'  '/'  '%'
 %left          UPLUS   UMINUS  /* 単項演算子のほうの記号 */
 %right         EXPONENT;   /* べき乗を表す「**」*/
 
 %%
            /*----- 【3】ここから文法規則部（Grammar rules） -----*/
 dialogue:  /* 空 */                                    /* 規則1  0行もOK．*/
    |   dialogue            EOL { prompt(); }           /* 規則2  空行．*/
    |   dialogue    qa      EOL                         /* 規則3  Q&A行. */
    |   dialogue    error   EOL { yyerrok; prompt(); }  /* 規則4  エラー回復処理．*/
    /* 末尾に「;」を書いてもよい．*/
 
 qa:        expr    { printf("  Ans = %Lg", $1); prompt(); }/* 規則5  改行で計算，表示．*/
 
 expr:  NUM                                             /* 規則6  「$$=$1;」は省略可 */
    |   '+'     expr    %prec   UPLUS   { $$ =   $2; }  /* 規則7  優先順位変更．*/ 
    |   '-'     expr    %prec   UMINUS  { $$ = - $2; }  /* 規則8  優先順位変更．*/ 
    |   expr    '+'     expr    { $$ = $1 + $3; }       /* 規則9  加算．*/
    |   expr    '-'     expr    { $$ = $1 - $3; }       /* 規則10 減算．*/
    |   expr    '*'     expr    { $$ = $1 * $3; }       /* 規則11 乗算．*/
    |   expr    '/'     expr    { $$ = $1 / $3; }       /* 規則12 除算．*/
    |   expr    '%'     expr    { $$ = ((int)$1) % ((int)$3); }     /* 規則13 剰余．*/
    |   expr    EXPONENT expr   { $$ = powf($1, $3); }  /* 規則14 指数．powfはC99規格．*/
    |   '('     expr    ')'     { $$ = $2; }            /* 規則15 カッコ．*/
 
 %%         /*----- 【4】ここから追加Ｃプログラム部（Additional C code） -----*/
 《ここに後述の「[[#Yacc構文定義ファイルの内容（後半）|後半]]」を記述する》
基本構成 > 電卓プログラム生成例による動作解説 > C宣言部

マクロ定義や文法規則のアクション関数をC言語で記述できるパートである。構文解析器プログラム先頭にそのままコピーされる。
例:
#include <stdio.h>
基本構成 > 電卓プログラム生成例による動作解説 > Yacc宣言部

開始記号（"%start"）、値型の集合（"%union"）、トークン（終端記号）宣言（"%token"）、グループ（非終端記号）宣言（"%type"）、 演算子優先順位指定（"%left", "%right", "%nonassoc"）などを、必要に応じて記述できるパートである。 
例:
%token <ldval> NUM      /* トークン  （終端記号）とその意味値yylvalの型の定義．*/
Bisonの場合はBison宣言部と呼ぶ。この場合さらに、衝突警告抑制（"%expect"）、純粋（再入可能）構文解析器指定（"%pure_parser"）ができる。
基本構成 > 電卓プログラム生成例による動作解説 > 文法規則部

文法規則部には1個以上のYacc文法規則
変換結果: 構成要素1 構成要素2 …
        ;
を記述しなければならない。
ここで，変換結果とは、規則が記述する非終端記号。
構成要素とは、この規則がマッチするかを判定するために文法どおりの順に並べられる、0個以上の終端記号や非終端記号の列。
例:
qa:   expr  { printf("  Ans = %Lg", $1); prompt(); }  /* 規則5  改行で計算，表示．*/
同じ変換結果を生む複数の規則は次のように簡略に連続記述できる。
変換結果: 構成要素11 構成要素12 …
        | 構成要素21 構成要素22 …
        | 構成要素31 構成要素32 …
        ;
「;」は省略可能。
見て分かるとおり、構文規則は読み書きしやすいBNF記法になっている。
規則にマッチするたびに行ないたい動作、たとえば変換結果の意味値（"$$"）をその構成要素の意味値（"$1", "$2", …）から計算すること、あるいは値を表示出力などは、C言語命令によるアクションとして「{ }」に囲って、マッチ直前に実行したい構成要素の直前に付して、あるいは規則適用時実行でよければその規則の最後の構成要素のあとに記述する。
例: 上例の「{ printf("  Ans = %Lg", $1); prompt(); }」は
qaがexprにマッチと判定されたとき実行される。
規則は再帰的に定義できる。例で
expr:  NUM                                         /* 規則6  「$$=$1;」は省略可 */
    |   expr    '+'     expr    { $$ = $1 + $3; }   /* 規則9  加算．*/
の規則6は、「NUMと名付けた数値トークンがきたら、それ1個単独でも式exprになる」と宣言している。
そして規則9は「expr '+' exprという並びもexprである」という意味で自分expを記述しているから、再帰的な定義である。すると、規則は繰り返して適用できるから、
NUM
NUM '+' NUM
NUM '+' NUM '+' NUM
:
など1個以上のNUMの加算式が、わずか2個の規則だけで表現できる。構文解析器実行時にこのうちのどれがやってきてもexprにマッチすると認識できることになる。
トークン値は実際にはASCIIコードと重ならない256以上の整数であるが、Yacc文法記述者はその値を知らなくてよく、NUM, EOLといった通常大文字で記述する記号で宣言と規則で統一的に記載すればよい。
トークンの意味値が伴う種類のトークンは、とりうる型は"%union"によって列挙して定義しておく。そして"%token"で"<ldval>"のように共用体のどのメンバーであるかを明示できる。アクション中で"$$"と書かれた意味値はC言語になったとき"lval.ldval"のように共用体中の要素を指すように自動変換される。このように意味値が伝わっていく。
基本構成 > 電卓プログラム生成例による動作解説 > 追加Ｃプログラム部

関数、変数等をC言語で記述できるパートである。構文解析器プログラムでyyparse()関数の展開が終わったあとの末尾に、そのままコピーされる。
たとえば字句解析器関数yylex()、エラー報告関数yyerror()、C言語メインプログラムmain()なども、それぞれ必要があればここに記述する。
基本構成 > 電卓プログラム生成例による動作解説 > 動作原理

Yaccが生成する構文解析器は、内部にスタックをもっている有限状態機械である。次のトークンを1個読み（先読みトークン;look-ahead token）変数yycharに入れるが、すぐにスタックにシフトするわけではない。構文解析器はその前に、マッチする規則があるかどうか、構文解析器の現在の状態番号（0,1,…）（これは常にスタックの最新＝右端のものである）のもとでYaccが生成しておいた解析テーブルを検索して調べる。スタックの右端と各規則を合わせてみて解析する（右端導出）。
構文解析器は終了条件まで以下を繰り返す処理である：
現在の状態で先読み（lookahead）トークンが必要で現在それがセットされていなければ、yylex()を呼んで先読みトークンをもらう。
そして現在の状態と先読みトークンによって決まるアクションを実行する。
Yaccにより解析テーブルに展開されるこの機械のアクションの種類は、
である


。
可能な還元はそのままいくつか行ったあとはじめて、トークンはシフトされる。
構文解析器は、入力されたトークン列をスタックに入れては次々に上記のように規則適用を試みて、成功するたびに還元していく。そしてテーブルの指定によって状態遷移していく。
入れ子の下位の非終端項目（グループ）が確定すれば、その値がその非終端項目に該当する上位の未確定な右辺の項に代入されて、その左辺のグループがスタックにプッシュされることで、だんだん上位に向かって解決されていく。
トークンを受けた状態番号を状態スタックに出し入れすると完全同期して、（あれば）そのトークンの意味値も意味値スタックに出し入れする。これにより、アクションによる意味値の計算を保証している。
最終目標は、全部読みきったときに、"%start"で指定され解析をスタートした非終端記号（デフォルトは最初に書かれている規則の左辺）が、変換の結果$accept 1個に還元できたかどうか調べることである。
もしそれが（エラー発生がerrorトークンで解決できなかったか、YYABORTマクロを実行されたなどの原因で）できなかったのなら、入力文字列はこの文法に適合しないエラーということが分かる（入力文字列が正しければYacc文法ファイルが間違いということもある）。
もしできたなら、この文法に適合したと判断でき，それに直接あるいは再帰的に入れ子で含まれる全部の要素に該当する入力トークン列が確定する。電卓の計算結果やコンパイラのための抽象構文木といった応用のための）意味値ができていれば、それもアクションで、都度あるいは最後に、表示したりファイルに書き出すことができる。
基本構成 > 電卓プログラム生成例による動作解説 > Yacc構文定義ファイルの内容（後半）

上記 wiki_sample.y 前半に引き続き後半として記述すべき追加Ｃプログラム例は、以下のとおりである（ここではユーザがyylex()関数を手で書いているが、同じ機能のプログラムは、FLexに字句規則を与えて自動生成させた方がスマートであろう）。
int pass    = 0;   /* 通過回数．*/
 int lineno  = 1;   /* 行番号．*/
 int tokenno = 1;   /* 行内トークン番号．*/
 
 /* 字句解析器 yylex．トークンを要求するときyyparseから呼び出される．
    ここでは手で書いているが，Lex, Flexなどの字句解析器生成器を使えば自動生成が可能． */
 int yylex(void) {
    if (pass++ == 0) {
        printf(" Calculator start."); prompt();
    }
    int c;
    /* 空白やCrを読みとばす．*/
    while ( (c = getchar() ) == ' ' || c == 0x0d || c == '\t'){
    }
    if (c == EOF) {     /* ファイル終端．コマンドプロンプトではCtrl-Dで入力可能. */
        printf("  Bye.\n");
        return 0;
    }
    if (c == '\n') {    /* 改行（NL）検出. */
        lineno++;
        tokenno = 0;
        return EOL;
    }
    tokenno++;
    if( isdigit(c) )  {
        long long int val = (c - '0');
        while ( isdigit(c = getchar() ) ) {
            val  = val * 10 + c  - '0';
        }
 
        yylval.ldval = (long double)val;
        ungetc(c, stdin);
        //printf("  入力整数値 val=%lld, 意味値 yylval=%Lf, トークンコード NUM=%d\n", 
        //     val, yylval.ldval, NUM);
        return(NUM);
    }
    /* printf("c=%d\n", c); */
 
    if (c == '*') {
        if ( (c = getchar() ) == '*') {
            return EXPONENT;    /* 指数演算子の「**」だった．*/
        }
        ungetc(c, stdin);       /* 「**」ではなく乗算演算子の「*」だった．*/
        c = '*';
    }
 
    /* その他のコードはそのまま伝え，'%' など直接文字コードで判定させている．*/
    return(c);  
 }
 
 /* 入力促進文字を表示する．*/
 int prompt(void) {
    printf( "\n ?> ");
 }
 
 /* エラー発生時にyyparseから呼び出される．
  * 引数: yyparseから渡ってくるエラーメッセージの文字列．
  */
 yyerror (char* str) {
    printf (" Error! {%s}\n   lineno{%d} near tokenno{%d} yychar{%d} \n", 
            str, lineno, tokenno, yychar);
 }
 
 /**    生成された構文解析器のメインプログラムになる．*/
 int main(void) {
    yydebug = 0;        /* Yacc動作をトレースしたいとき1にする．*/
    yyparse();          /* 生成された構文解析関数を呼ぶ．*/
 }
基本構成 > コンパイラの場合の違い

上の例では電卓のようにその場で値を求めることはできる。しかしYaccを利用してコンパイラを開発する場合は、このあとのコード生成部(2)に渡す抽象構文木（abstract syntax tree、AST）というデータの構造を構築していかなければならない。たとえばアクションでユーザ定義関数を呼び出し、
{  $$ = node( '+', $1, $3 );  }
のように左辺と右辺を「+」で結合してそのポインタを返すような操作を行わせることで可能である。すると、構文解析が末端から順次還元を行って根まで統合されて停止したとき、同じ構造の抽象構文木が根まで完成して得られることになる。
このように葉から順に根に至る構文解析法をボトムアップ構文解析という（ここでは木を上下逆さまにして根は一点にしたイメージなので“ボトムアップ”という）。
基本構成 > 曖昧な文法への対処

この方式では、次の有名な例のように、同じ入力を同じ構文規則で複数の解釈ができてしまう曖昧性が避けられない。
/* stmt2って一体どっちのIFが不成立のときに実行したいの？ */
 IF expr1 IF expr2 stmt1; ELSE stmt2;
Yaccではyaccコマンド実行時に解釈が複数生じる曖昧なケースを発見した場合に「還元／還元衝突警告」または「シフト／還元衝突警告」を出す。これによって、文法を作成中なら文法を、そうでなければ構文規則を改良するきっかけが得られる。
まず「還元／還元衝突警告」が出た場合であるが、パーサが正しい処理をできない構文要素が生じてしまうので、文法、または構文規則のYacc定義を直した方がよい。
ある非終端記号から別の非終端記号に至る呼び出しパスが複数あれば、それは間違いなので直す。
しかし元の言語が複雜すぎてうまく直せない場合は、片方を実体は同じでも別の名前を付けるトークン由来で構成するようにし、Lex側がどちらのトークンをYaccパーサに出すかは状態に応じて変えるようにコーディングしておく方法がある：
状態がトークン列だけから一意に決められるならLex単独で処理できる。しかし、Yaccが実行時にあるルールのマッチを検出したときにはじめて状態を変えたいという複雜なケースでは、次のようにする。LexとYaccで共通の状態変数を設けておき、Yaccの{ }内に記述するアクションで、区別したい何かのフェーズなどの状態に応じて状態変数値を変えてやる。そうすればLexの生成したレキシカルアナライザは、実行時にまさに読んでいる入力トークン列による状態変数値に応じて、ある入側トークンを別々のトークンに動的に変換し分けてYaccの生成したパーサに渡す、という方法である。非常にダイナミックな技である。
次に「シフト／還元衝突」であるが、このときYaccは標準で、（特に演算子優先規則で指定されていないかぎり）シフトを選ぶようにできている。たとえば上記の例ではexpr2不成立のときにstmt2を実行するようにパーサのテーブルが作られる。このように距離の近い記号の関係を優先するよう動作するのは、多くのプログラミング言語のコンパイラに向いているといわれているが、後述のように注意が必要である。
構文上期待外のトークンがくるとアクションが見つからないので、パーサは、状態を戻して、errorという特定トークンのアクションがその状態に定義されているかどうか調べ、あれば実行する。最大3回まで戻しても見つからないときには入力テキストが途中でもそこでパースを打ち切ってしまう。これを利用してたとえば命令リストにerrorトークンのみの右辺をOR（|）結合しておけば、ある命令に属するオペランドに期待外トークンがあっても、そこで警告を出して次の命令以降のパースを続行してくれる、使いやすいコンパイラを作ることができる。ただ最大3回固定なので、深さの差3以内の上位にerrorを処理する構文を書いておかなければ利用できない。またはy.tab.cファイルの変数yyerrstatusの初期値を10などと増やしてやる必要がある。
Yacc実行時に報告されるシフト／還元衝突は、シフトが選ばれるだけで十分と確信できるケース以外は、実は本来0件にしておくべきである。なぜならパーサ実行時にシフトが選ばれて動作することにより、入力されたトークン列によっては行き止まりになる。すなわち期待外のトークンとされ、上記のエラー処理に飛んでしまうからである。Yaccは衝突に対応する枝分かれをすべてバックトラックでたどって解空間を全探索するようにはできていないのである。このため、衝突を残しておくとパーサを当然通ると思った入力が通らず苦労することになる。
基本構成 > 衝突・構文エラーの解決ノウハウ

Yacc実行時になんらかの衝突が報告されるとき、および、上記パーサ実行時に正しいはずの入力がsyntax errorとなるときの主な対処方法には、次のようなものがある。
syntax error発生時に少なくともそのときのトークン値、状態スタック中の状態番号列およびソースファイル上の行番号・文字番号を出力するように作っておくことで、正確な調査を可能にする。
ある非終端記号から別の非終端記号に至る呼び出しパスが複数あれば、それは間違いなので直す（前述）。
「トークンまたは空である」といった非終端記号をひとつの構文右辺の中に複数並べることによって、衝突が生じていることがある。ひとつの右辺の中には省略のないトークンだけを使うようにする。そして、省略する、しないのすべての組合せは、右辺の種類として列挙してOR（|）結合する形に変更する。人間には等価ないし汚くなるように思えても、Yaccにとっては明瞭化になる。
リストのリストは、繰り返し要素にinなどの接頭辞的なトークンが伴わない定義などでは、要素がどの段階のリストに属するのかという曖昧性を生じる。この場合、リストの段階数を減らすように工夫して明瞭化する。
問題の非終端記号を使う場面ごとに、元が同じ文字列でも別のトークンから構成するように、定義を変更して明瞭化する。そのためにそのトークンを上述のようにLex段階で、場面に応じて変換し分ける。
パーサ実行時の期待外トークンで、あるトークンが複数の場面でどう絡んでいるかを調べるには、y.outputファイルでその状態番号を見つけて熟読し、その状態番号へ飛んでくる状態を1, 2段階さかのぼってたどってみると見えてくるものである。y.outputにはまた、状態番号に対して衝突種類、トークンに対して実行されないアクションを囲むカッコ「[ ]」が出力されているので、場所や影響が分かる。
原因調査が難航している場合は、問題のある文法要素の周辺の定義だけを抽出した“ミニ文法”をYacc定義し、障害がぎりぎり再現する境目を探しすことで切り分けるアプローチもある。
混乱を招いているトークンを含む連続した2個以上のトークンを、Lex段階で1個の別トークンにまとめて明瞭化する。
上記場面がパーサのシフトや還元の状態だけでは記述しきれないとき、Lex段階でその場面を識別するための内部状態をもち、はいってくるトークンを見ながら状態遷移することで問題の箇所を検出する。そして、検出時には別のトークンに変更して出したり、特別なトークンを挿入することで明瞭化する。
上記明瞭化の努力によって、Bison実行で報告される衝突数が減少した場合は、効果が出ている場合が多いが、減少しなくても、特定の入力に対しての処理がエラーから正常に変わって改善している場合もある。増加した場合は逆効果として調べる必要がある。
入力言語があまりに複雜な場合、またはプリプロセッサ命令を含んでいる場合、パースを2段階の直列構成にするという大胆な解決策もある。すなわち、1段階めの前処理Yaccパーサは曖昧性を解決するだけのための簡単な文法で動く。その出力の曖昧性を解決したトークン列を2段階めの本処理Yaccパーサに渡す。3段以上にすることが有効な場合もあろう。文法の性格によっては、この構成にすることで、むしろそれぞれをすっきりさせることができる（エラー位置の表示処理は複雜になる）。
脚注・出典

↑  英: semantic value
↑  英: lexical analyzer
↑  英: fast lexical analyzer generator
↑  Theory of Compilation -- JLex, CUP tools --(PDF) - Haifa Univ. Bilal Saleh
↑  POSIX 1003.1-2008 - IEEE（有料）
↑  An Overview of Parser Generator Tools for Java
↑  G・フリードマン著、矢吹道郎ら訳、竹本 浩OCR復刻 Cコンパイラ設計(yacc・lexの応用)
y.outputの解説は、文法のチェック および 言語認識 に詳しい。
1 2  パーサーの操作 - Oracle
1 2  A yacc tutorial - Arizona大学 CSc 453: Supporting Documents
1 2  Yacc: A Parser Generator(pdf) by Stephen C. Johnson.（Yacc作者）and Ravi Sethi
↑  Bison 2.7  8.1 Understanding Your Parser
応用宝

| --- | --- |
開発元:  テンセント
対応OS:  Android、Microsoft Windows
対応言語:  中国語（簡体字）
公式サイト:  https://sj.qq.com/
テンプレートを表示
応用宝（おうようほう、中国語: 应用宝、英語: Tencent Appstore）は、テンセントが開発したAndroidスマートフォン総合管理プラットフォームおよびアプリケーションストアである。Android向けプラットフォームのほか、Microsoft Windows向けプラットフォームも提供されている。
概要

中華人民共和国向けに提供されており、モバイルアプリケーションはモバイルWebサイトとモバイルアプリストアの両方から入手可能である。また、携帯電話の最適化、アプリケーションの検出、ワンクリックroot化、バックアップ等が可能な機能を持つ。
歴史

2015年、ゴールデンフェザー賞（中国語: 金翎奖）で「最も影響力のあるチャンネルプロバイダー（中国語: 最具影响力渠道商）」を受賞した。
2017年3月28日、北京国家会議センターにて開催された「2017ビッグデータ産業サミット」（中国語: 2017大数据产业峰会）にて、中華人民共和国工業情報化部の指導の下で「信頼できるアプリケーションストア」として最初のバッチのリストが正式に発表された。
金山隼樹

金山 隼樹（かなやま じゅんき、1988年6月12日 - ）は、島根県出雲市出身のプロサッカー選手。Jリーグ・ファジアーノ岡山所属。ポジションはゴールキーパー。
来歴 > ユース時代

6歳からサッカーを始める。
2004年、サンフレッチェ広島ユースに入団。同期に平繁龍一、遊佐克美、野田明弘ら。2年生からレギュラーを掴み、高円宮杯ベスト4入りに貢献している。ただ3年生になると怪我もあり兼田亜季重にレギュラーの座を奪われてしまい、同年度のJユースカップ決勝戦でもベンチ入りできなかった。
2007年、立命館大学へ進学する。2010年、関西学生選抜に選ばれた。
来歴 > V・ファーレン長崎

2011年、当時JFLのV・ファーレン長崎のセレクションに合格し入団。1年目は近藤健一の控えながら8試合に出場した。2012年は怪我によりキャンプで出遅れたため 新加入の原田欽庸がレギュラーを掴んだことから、バックアップである第3GKとしてJFL優勝とJ2昇格に貢献した。同年度でJFL1試合のみ出場しているが、J2昇格決定後の若手に出番を与える「花試合」での出場であった。
2013年も当初は第3GKの位置にいたが、原田の怪我とロアッソ熊本から加入した岩丸史也の不調により、3月20日のカターレ富山戦でレギュラーに抜擢され、Jリーグ初出場を果たすと試合は1-0でクラブのJリーグ初勝利に貢献し、以降正GKとなった。正GKとなってからは10戦無敗を記録するなどJ2昇格1年目ながらJ1昇格プレーオフ圏内の6位に入る原動力となった。
来歴 > コンサドーレ札幌

2014年、コンサドーレ札幌へ完全移籍。
3月2日に行われたジュビロ磐田との開幕戦では開幕スタメンを果たし、再三のピンチに好セーブを見せ、前田遼一のPKを止めるなどチームの完封勝利に貢献した。
2015年はこの年加入したク・ソンユンに開幕スタメンを奪われ、9試合の出場に留まった。
2016年は9試合に出場。ク・ソンユンが韓国代表でチームを離れた際に出場。7月20日松本山雅FC戦では前回アウェーで対戦したときに負けた悔しさからスーパーセーブを連発しチームの勝利に貢献した。12月19日には自身のTwitterで目の手術をしたことを発表した。
2017年はリーグ・カップ戦合わせて8試合に出場、第27節のアルビレックス新潟戦ではク・ソンユンが相手FWとの接触で負傷退場し、急遽金山が出場した。
来歴 > ファジアーノ岡山

2018年、出場機会を求めファジアーノ岡山へ完全移籍。
同年は一森純とポジションを争いながら22試合に出場するも、19年は完全に一森にポジションを奪われ、8試合の出場に留まった。
2020シーズンは一森が移籍するも、新加入のポープ・ウィリアムが正GKに定着したため、自身は2試合の出場に留まった。
2021シーズンはポープが移籍したため、開幕からレギュラーとして出場していたが、清水エスパルスからレンタルで加入した梅田透吾が第19節に初出場を果たすと、以降は梅田にポジションを譲り再び控えに降格。
2022シーズンも引き続き梅田の控えに留まっていたが、開幕直後に梅田が負傷離脱すると、代わって先発に抜擢。以降はレギュラーとして出場した。しかし、湘南ベルマーレからレンタルで加入した堀田大暉の台頭もありシーズンを通して14試合出場に留まった。このシーズンはキャプテンとしてチームを引っ張り、クラブ初の3位という成績に貢献した。
2022年12月2日　2023シーズンの契約更新が発表された。しかし、鹿島アントラーズから育成期限付き移籍で加入した山田大樹の起用や、堀田が完全移籍で加入したこともあり、サブメンバーに回ることとなる。第15節大宮アルディージャ戦で初出場を果たした。第21節大分トリニータ戦でJ2リーグ通算150試合出場を達成した。
所属クラブ

平田市立平田中学校
サンフレッチェ広島ユース
立命館大学
2011年 - 2013年  V・ファーレン長崎
2014年 - 2017年 コンサドーレ札幌 / 北海道コンサドーレ札幌
2018年 -  ファジアーノ岡山
個人成績

| 国内大会個人成績> 年度.年度.日本 | 国内大会個人成績> クラブ.クラブ.日本 | 国内大会個人成績> 背番号.背番号.日本 | 国内大会個人成績> リーグ.リーグ.日本 | 国内大会個人成績> リーグ戦.出場.リーグ戦 | 国内大会個人成績> リーグ戦.得点.リーグ戦 | 国内大会個人成績> リーグ杯.出場.リーグ杯 | 国内大会個人成績> リーグ杯.得点.リーグ杯 | 国内大会個人成績> オープン杯.出場.天皇杯 | 国内大会個人成績> オープン杯.得点.天皇杯 | 国内大会個人成績> 期間通算.出場.期間通算 | 国内大会個人成績> 期間通算.得点.期間通算 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 2011 | 長崎 | 26 | JFL | 8 | 0 | - | - | 1 | 0 | 9 | 0 |
| 2012 | 長崎 | 21 | JFL | 1 | 0 | - | - | 0 | 0 | 1 | 0 |
| 2013 | 長崎 | 21 | J2 | 39 | 0 | - | - | 1 | 0 | 40 | 0 |
| 2014 | 札幌 | 1 | J2 | 28 | 0 | - | - | 1 | 0 | 29 | 0 |
| 2015 | 札幌 | 1 | J2 | 9 | 0 | - | - | 1 | 0 | 10 | 0 |
| 2016 | 札幌 | 1 | J2 | 9 | 0 | - | - | 0 | 0 | 9 | 0 |
| 2017 | 札幌 | 1 | J1 | 2 | 0 | 5 | 0 | 1 | 0 | 8 | 0 |
| 2018 | 岡山 | 13 | J2 | 22 | 0 | - | - | 0 | 0 | 22 | 0 |
| 2019 | 岡山 | 13 | J2 | 8 | 0 | - | - | 2 | 0 | 10 | 0 |
| 2020 | 岡山 | 13 | J2 | 2 | 0 | - | - | - | - | 2 | 0 |
| 2021 | 岡山 | 13 | J2 | 18 | 0 | - | - | 1 | 0 | 19 | 0 |
| 2022 | 岡山 | 13 | J2 | 13 | 0 | - | - | 1 | 0 | 14 | 0 |
| 2023 | 岡山 | 13 | J2 | 2 | 0 | - | - | 1 | 0 | 3 | 0 |
| 2024 | 岡山 | 13 | J2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2025 | 岡山 | 13 | J1 |  |  |  |  |  |  |  |  |
| 通算 | 日本 | 日本 | J1 | 2 | 0 | 5 | 0 | 1 | 0 | 8 | 0 |
| 通算 | 日本 | 日本 | J2 | 150 | 0 | 0 | 0 | 8 | 0 | 158 | 0 |
| 通算 | 日本 | 日本 | JFL | 9 | 0 | - | - | 1 | 0 | 10 | 0 |
| 総通算 | 総通算 | 総通算 | 総通算 | 161 | 0 | 5 | 0 | 10 | 0 | 176 | 0 |
その他の公式戦
2013年
J1昇格プレーオフ 1試合0得点
Jリーグ初出場 - 2013年3月20日 J2第4節 対カターレ富山 (長崎県立総合運動公園陸上競技場)
タイトル > クラブ

JFAプリンスリーグU-18中国 (2004年、2005年、2006年)
高円宮杯全日本ユース(U-18)サッカー選手権大会 （2004年）
日本クラブユースサッカー選手権 (U-18)大会 （2004年）
Jリーグユース選手権大会 (2006年)
日本フットボールリーグ (2012年)
J2リーグ（2016年）
PRIDE.22

| PRIDE> 22.イベント詳細 |
| --- | --- | --- |
シリーズ: PRIDE（ナンバーシリーズ）
主催: DSE
開催年月日: 2002年9月29日
開催地:  日本 愛知県名古屋市
会場: 名古屋レインボーホール
開始時刻: 午後4時30分
試合数: 全8試合
放送局: フジテレビ（地上波）
入場者数: 9,391人
イベント時系列
| Dynamite! SUMMER NIGHT FEVER in 国立 | PRIDE.22 | THE BEST Vol.3 |
PRIDE.22（プライド・トゥウェンティーツー）は、日本の総合格闘技イベント「PRIDE」の大会の一つ。2002年9月29日、愛知県名古屋市の名古屋レインボーホールで開催された。海外PPVでの大会名はPRIDE 22: Beasts From The East 2。
大会概要

メインイベントに登場した大山峻護は、プロデビューしたばかりの吉田秀彦をセコンドに付けたが、ハイアン・グレイシーに腕ひしぎ十字固めで一本負け。右腕肘関節脱臼骨折の重傷となった。大山を含め、出場した日本人選手5名が全員敗北した。
メインイベント前に高田延彦がリングに上がり、次回大会PRIDE.23で引退試合を行うことを表明した。
元UFC世界ヘビー級王者ケビン・ランデルマンがPRIDEデビュー。
肥薩おれんじ鉄道線

肥薩おれんじ鉄道線（ひさつおれんじてつどうせん）は、熊本県八代市の八代駅から鹿児島県薩摩川内市の川内駅に至る肥薩おれんじ鉄道の鉄道路線である。駅ナンバリングで使われる路線記号はOR。
概要

元は九州旅客鉄道（JR九州）鹿児島本線の一部で、2004年（平成16年）3月13日の九州新幹線新八代駅 - 鹿児島中央駅間開業の際に並行在来線として肥薩おれんじ鉄道へ経営移管された。第三セクター鉄道に転換された整備新幹線の並行在来線で、営業エリアが複数の県にまたがっているのは、隣接県の末端区間だけの例を除けば本路線が唯一である。整備新幹線開業による並行在来線の第三セクター鉄道への経営移管は本州以外では初事例で、2016年3月26日の北海道新幹線開業に伴い江差線がJR北海道から道南いさりび鉄道に経営移管されるまでは、本州以外で唯一の事例であった。
全線が交流電化されているが、自社車両による旅客列車は交流専用電車の新造・購入費および維持費削減の観点から電気運転を行わず軽快気動車により運行されている。貨物列車は経営移管後も引き続き第二種鉄道事業者である日本貨物鉄道（JR貨物）の電気機関車牽引により運行されている。
九州新幹線開業までは、当線の区間にも特急列車などの優等列車が設定されていた。この新幹線開業まで運行されていた特急「つばめ」は新幹線連絡の「リレーつばめ」となって新八代駅発着に変更され、夜行特急「ドリームつばめ」は廃止、寝台特急「なは」は熊本駅発着に、早朝と深夜に出水 - 西鹿児島（現・鹿児島中央）間で運行されていた通勤ライナー「さわやかライナー出水」と「ホームライナー出水」は川内駅発着の「さわやかライナー川内」と「ホームライナー川内」にそれぞれ変更され、土曜・休日運行の快速列車と観光列車「おれんじ食堂」、JR九州からの直通する特急列車「36ぷらす3」を除いて通過駅を伴う列車は消滅した。
概要 > 路線データ

管轄：肥薩おれんじ鉄道（第一種鉄道事業者）・日本貨物鉄道（第二種鉄道事業者）
路線距離（営業キロ）：116.9km
キロポストは旧鹿児島本線時代のまま門司港駅起点からの通算表示となっており、八代駅構内に当線用0キロポストは無い。
軌間：1067mm
駅数：28駅（起終点駅含む）
複線区間：湯浦 - 津奈木間 (8.7 km)
電化区間：全線（交流20,000V・60Hz）
閉塞方式：自動閉塞式
保安装置：ATS-SK
最高速度：95 km/h
IC乗車カード対応区間：なし
運行形態

定期旅客列車は普通列車のみの運行で、すべての列車において運転士のみが乗務するワンマン運転を行っている。編成は単行（1両編成）が基本だが朝夕ラッシュ時や沿線イベントなどで多客が見込まれる場合は2両編成に増車して運転され、逆に夏休み期間などは平日朝夕でも一部の列車が2両編成から1両編成に減車される。車両の増結・分割は主に車庫のある出水駅のほか、昼間に車両留置のある八代駅でも行われている。夜間は基地のある出水駅のほか、八代駅・川内駅にも車両の滞泊が設定されている。2004年の開業当時からしばらくは出水駅 - 川内駅間で3両編成の車掌乗務列車が平日の朝夕ラッシュ時に各1往復ずつ運行されていたが、徐々に短縮され、最後まで残った朝の1往復の車掌乗務列車が2013年3月のダイヤ改正で廃止されて全て最大2両編成のワンマン列車のみの運行となった。
このほか、2013年3月からは金・土・祝日を中心に観光列車「おれんじ食堂」が、2020年10月からは週1回、JR九州からの直通特急列車「36ぷらす3」が運行されている。
また、おれんじ鉄道は国鉄鹿児島本線時代から本州と九州の鹿児島県までの物流の大動脈という一面も持ち合わせており、列車による貨物輸送も盛んで、JR九州からおれんじ鉄道への移管後も深夜帯を中心に多数の貨物列車が運行されている。
運行形態 > 特急列車

→詳細は「36ぷらす3」および「§ 観光特急「36ぷらす3」」を参照
基本的に毎週木曜日、博多から鹿児島中央行きの特急「36ぷらす3」が、片道のみ乗り入れる。但し肥薩おれんじ鉄道線内のみの利用はできない。
運行形態 > 普通列車

八代駅と川内駅でJR線から接続を取るダイヤが設定されているため運行間隔は一定していないが、おおむね1時間あたり1本程度の運転である。八代駅 - 川内駅間全線を通しで運転する列車のほか、始発・最終を中心にして車庫のある出水駅発着の区間列車が八代方面・川内方面に多数設定されている。区間列車はこれ以外にも毎日運転で早朝6時台の米ノ津発隈之城行きの列車が1本、8時台に八代駅 - 肥後高田駅間の列車が1往復設定されているほか、平日のみの運用として5時台に出水発隈之城行、6時台に隈之城発米ノ津行と折り返しの7時台米ノ津発野田郷行、夕方の米ノ津発川内行が1本ずつそれぞれ設定されている。この平日朝の米ノ津駅発着列車は2005年3月1日のダイヤ改正で出水商業高等学校の通学利便のため米ノ津行きの列車が新設され、2011年3月14日からは折り返しの列車が設定された。さらに沿線の学校通学生へのアンケート結果を元に、2018年3月17日からは早朝6時台に八代発西出水行下り列車1本（折り返しの上り列車となる西出水 - 出水間は回送）が新たに設定され沿線高校への通学の利便性が向上した。
利用客の利便性を考慮して、一部列車が鹿児島本線八代駅 - 新八代駅（九州新幹線発着・八代白百合学園高等学校最寄駅）間および川内駅 - 隈之城駅（れいめい中学校・高等学校最寄）間に乗り入れている。このうち隈之城駅発の普通列車は八代駅まで運転する列車が朝に2本、肥薩おれんじ鉄道を経由して新八代駅まで通しで運転するJR九州駅始発終着の列車が夕方に1本設定されている。
2021年3月ダイヤ改正では八代駅 - 新八代駅間の運行形態の見直しに伴い、日中を中心とした新八代始発の川内行きや隈之城行き列車が八代駅から延長される形で増便された（その代わり、利用者が少ない夜間の新八代始発の列車が八代始発に短縮される形で減便している）。また、最終列車の行き先に「最終○○（行き先）」と表示されるとともに放送案内されるようになり、最終列車がより明瞭化された。なお、八代19時台発の6257Dは終点の出水駅で川内行き最終列車に連絡するため「出水連絡 最終川内」と2段表示される。
JR線への直通列車に関しては乗務員の交代は行われないが、JR九州から車両使用料を受け取っている。
運行形態 > 観光列車「おれんじ食堂」

→詳細は「おれんじ食堂」を参照
2013年3月24日より新八代駅 - 川内駅間に運行が開始された快速列車。肥薩おれんじ鉄道初の全席指定列車である。沿線の水俣地域の振興事業の一つとして、車窓からの美しい景色を楽しみつつ「ゆったり、のんびりとしたスローライフな旅を楽しむ」ことをコンセプトして設定された。車両はダイニングカーとリビングカーの2両固定編成で、新製ではなく既存車両のHSOR-114AとHSOR-116Aを改造したものが充当されており、デザインは工業デザイナーの水戸岡鋭治が担当している。列車名の通り沿線の特産品で作られた料理やデザートが提供され、美しい景色を見ながら食事を楽しむとともに、ウェルカムドリンクサービス、コーヒーとお菓子の自由配布、主要駅で駅構内や街に出て沿線の特産品の買い物が楽しめるサービス（マルシェ）、乗務員（パーサーやアテンダント）による観光案内や不定期のサプライズイベント、制服を貸し出しての記念写真サービス（子供限定）、景色がよい区間での低速走行や一旦停止サービス、乗車記念パスポートの配付、鹿児島県出身のジャズアーティスト松本圭使、博多俊輔などによるピアノの生演奏サービス（3号サンセットディナーのみ）などが行われている。そのほか沿線の地酒、ワイン、カクテルなどのアルコール類、ノンアルコールドリンクやソフトドリンク、オリジナルグッズの販売も行われている。
メニューについてはグルメ雑誌「食楽」を発行している徳間書店と提携している。車内は全車禁煙。外部からの弁当などの食品の持ち込みは可能だが、列車内で提供された料理やデザートの持ち帰りはできない（ただし、ビュッフェで自由配布されているクッキーなどのお菓子は持ち帰り可能である）また、リビングカーは座席扱いとなるため同社の企画乗車券で乗車ができる（一部乗車不可な企画乗車券もある）が、ダイニングカーは旅行商品としての取り扱いになるため企画乗車券では乗車はできない。
座席や料理の予約については2013年の運行開始からしばらくは出水営業部内の予約センター、同社線の有人駅（肥後田浦駅をのぞく）、JR九州の主要駅窓口や旅行センター、契約旅行代理店のみで行っていたが、2018年3月17日からのホームページのリニューアルに伴い、同年4月19日からはホームページからのWeb予約を開始し、パソコンからの直接予約も出来るようになった。Web予約では座席の選択も可能となっている。
停車駅は新八代駅 - 八代駅 - 日奈久温泉駅 - 佐敷駅 - 津奈木駅 - 新水俣駅 - 水俣駅 - 出水駅 - 阿久根駅 -  薩摩高城駅 - 川内駅で、毎週金、土、日、祝日の運行である。 ただし、それ以外の運休日であっても事前に貸切予約をして料金を支払えば、貸切扱いで運行する事も出来る。
運行形態 > 観光列車「おれんじ食堂」 > 2013年3月24日運転開始時

運転開始当初は、新八代発川内行が2本（おれんじ食堂1号、3号）、川内発新八代行が1本（おれんじ食堂2号）が設定されており、1号車は原則として全区間乗車だが、2号車は区間乗車が可能で、3号は川内行となる日と出水行になる日があった。
運行形態 > 観光列車「おれんじ食堂」 > 2014年3月15日ダイヤ改正

1号は出水発川内行、2号は川内発新八代行、3号は新八代発川内行（日にちによって出水行になる）とダイヤが大幅に変更され、新たにそれまで通過していた薩摩高城駅に停車するようになった。さらに1号は朝食列車として「BREAKFAST（ブレックファスト）」、2号は昼食列車として「SPECIAL（スペシャル）」、3号はスイーツ・夕食列車として新八代駅 - 出水駅間に「SWEETS（スウィーツ）」、出水駅 - 川内駅間に「SINFONIA（シンフォニア）」、新八代駅 - 川内駅間に「MEGUMI（メグミ）」の愛称が付けられた。平日の指定日に限り、片道29万円からの貸し切り料で貸し切り運転をすることも可能である。
運行形態 > 観光列車「おれんじ食堂」 > 2015年3月14日ダイヤ改正

運転区間と時間を大幅に変更して3便から4便に増発し、1号は出水駅発新八代駅行「ブレックファスト」、2号は新八代駅発川内駅行「スペシャルランチ」、3号は川内駅発新八代駅行で前半（川内駅 - 出水駅）「ライトミール」、後半（出水駅 - 新八代駅）「サンセットディナー」、全区間「クルージングディナー」、4号は新八代駅発出水駅行「おれんじバー」となった。3号前半「ライトミール」は軽食（アフタヌーンティー）と昼食（ランチ）が選択できる。また4号「おれんじバー」は原則として金曜日のみ運転で食事は提供されず、アルコール類を含むワンコインドリンクとおつまみのみが提供される。
車両検査の実施に伴い2016年1月1日から3月24日までは運休となり、3月25日から運行を再開した。
運行形態 > 観光列車「おれんじ食堂」 > 2016年3月26日ダイヤ改正

運行区間は変わらないが、新水俣駅 - 水俣間では桜並木の横を通るため4月の桜開花の時期に合わせて期間限定で徐行運転を行い、その他にも八代 - 肥後高田間（球磨川、晩白柚などの柑橘畑の鑑賞）、湯浦 - 津奈木間（奇岩・重盤岩（ちょうはんがん）の鑑賞）など徐行区間を多く増やしたために運行時間が若干変更になった。
運行形態 > 観光列車「おれんじ食堂」 > 2017年3月4日ダイヤ改正

基本的なダイヤ設定は2016年版とほぼ同じだが、途中駅での発着時間が若干変更となり、4号「おれんじバー」が運行休止となった。
運行形態 > 観光列車「おれんじ食堂」 > 2018年3月17日ダイヤ改正

運行パターンについては2017年版と変わらないが、2便「スペシャルランチ」の運行時刻や駅の停車時間が見直され、川内駅の到着が従来の14時13分着から13時47分着と約30分ほど早くなった。また、最も乗車率が高い2便の料理に、テレビ番組『料理の鉄人』（フジテレビ系列）で知名度の高い坂井宏行シェフ（出水市出身）がプロデュースしたメニューを取り入れ、魅力と豪華さの向上を図っている。
運行形態 > 観光列車「おれんじ食堂」 > 2019年3月16日ダイヤ改正

運行パターンは2018年版を踏襲しつつ、3便「スイーツ」が阿久根駅で43分停車して様々な体験コーナーを設置するなど、停車駅と停車時間の見直しを行った。また、今回の改正より列車の種別表示が「快速 ○○（行き先）」から「おれんじ食堂 ○○（行き先）」に変更された（ただし、駅の放送案内は快速のままである）。
運行形態 > 観光列車「おれんじ食堂」 > 2021年3月13日ダイヤ改正

新型コロナウイルス感染拡大の影響を鑑みて運行日を削減。土・日のみの運転（祝日は不定期に設定）とし、貸切運行の対応も金曜日のみとなる。
運行形態 > 観光列車「おれんじ食堂」 > 2022年3月12日ダイヤ改正

運行日を増加。金・土・日のみの運転とし、貸切運行の対応を火・水に変更。