コンパイラ・期末テスト解答例(2023 年 02 月 14 日)

  1. (1 × 15)

    (1) (2) (3) (4) (5)
    (6) (7) (8) (9) (10)
    (11) (12) (13)

  2. (2 × 4, 6, 3, 4, 4, 4, 8, 8)

    (1-ⅰ)id # id など (1-ⅱ)
    (1-ⅲ) id & ( id ) など (1-ⅳ)
    (2) \(\begin{array}{lcll} L & \rightarrow & {\color{red}A\ L'} & {\color{red}\cdots ①}\\ \\ L' & \rightarrow & {\color{red}\texttt{!}\ A\ L'} & {\color{red}\cdots ②}\\ & | & {\color{red}\varepsilon} & {\color{red}\cdots ③}\\ \\ \\ A & \rightarrow & {\color{red}N\ A'} & {\color{red}\cdots ④} \\ \\ A' & \rightarrow & {\color{red}\texttt{&}\ N\ A'}& {\color{red}\cdots ⑤} \\ & | & {\color{red}\texttt{#}\ N\ A'}& {\color{red}\cdots ⑥} \\ \ & | & {\color{red}\varepsilon} & {\color{red}\cdots ⑦} \\ \\ \end{array}\)
    (3)id, (
    (4)$, )
    (5)$, !, )
    (6)
    id ( ) ! & # $
    \(N \rightarrow\)  Ⓐ  Ⓑ  ✘  ✘  ✘  ✘  ✘
    (7)
    id ( ) ! & # $
    \(L \rightarrow\)  ①  ①  ✘  ✘  ✘  ✘  ✘
    \(L' \rightarrow\)  ✘  ✘  ③  ②  ✘  ✘  ③
    \(A \rightarrow\)  ④  ④  ✘  ✘  ✘  ✘  ✘
    \(A' \rightarrow\)  ✘  ✘  ⑦  ⑦  ⑤  ⑥  ⑦
    (8)
    void A(void) {
        switch (token) {
          case ID: case '(':
            N(); A1(); break;
          default:
            reportError(); break;
        }
    }
    
    void A1(void) {
        switch (token) {
          case '&':
            eat('&'); N(); A1(); break;
          case '#':
            eat('#'); N(); A1(); break;
          case ')': case '!': case '\n':
            break;
          default:
            reportError(); break;
        } 
    }
          

  3. (5 × 4)

    (1)(B) (2)(J) (3)(L) (4)(B)