‹Name_list>, ‹Constant_list>, ‹Arithmetic_expression>, ‹Arithmetic_term> ‹Expression_list> は左再帰性の除去が必要である。 これらの左再帰性の除去を行うと以下の文法(の一例)になる。
‹Name_list> ::= ‹Name> { "," ‹Name> } ‹Constant_list> ::= ‹Constant> { "," ‹Constant> } ‹Arithmetic_expression> ::= ‹Arithmetic_term> {( "+" | "-" ) ‹Arithmetic_term> } ‹Arithmetic_term> ::= ‹Arithmetic_factor> {( "*" | "/" | "%" ) ‹Arithmetic_factor> } ‹Expresion_list> ::= ‹Expression> { "," ‹Expression> }
‹Name>, ‹Exp>, ‹Logical_term>, ‹Unsigned_factor> は左括り出しが必要である。これらの左括り出しを行うと以下の文法(の一例)になる。
‹Name> ::= NAME [ "=" ‹Constant> | "[" ( INTEGER "]" | "]" "=" "{" ‹Contant_list> "}" ) ] ‹Exp> ::= ‹Logical_term> [ "||" ‹Exp> ] ‹Logical_term> ::= ‹Logical_factor> [ "&&" ‹Logical_term> ] ‹Unsigned_factor> ::= NAME [ ( "[" ‹Expression> "]" ) | "++" | "--" ] | ( "++" | "--" ) NAME [ "[" ‹Expression> "]" ] | INTEGER | CHARACTER | "(" ‹Expression> ")" | "inputchar" | "inputint" | ‹Sum_function> | ‹Product_function>
各非終端記号のFirst集合を以下に示す。
First(‹Program>) = { "main" } First(‹Main_function>) = { "main" } First(‹Block>) = { "{" } First(‹Var_decl>) = { "int" } First(‹Name_list>) = { NAME } First(‹Name>) = { NAME } First(‹Constant_list>) = { "-", INTEGER, CHARACTER } First(‹Constant>) = { "-", INTEGER, CHARACTER } First(‹Statement>) = { "if", "while", "for", "-", "!", NAME, "++", "--", INTEGER, CHARACTER, "(", "inputchar", "inputint", "+", "*", "outputchar", "outputint", "break", "{", ";" } First(‹If_statement>) = { "if" } First(‹While_statement>) = { "while" } First(‹For_statement>) = { "for" } First(‹Exp_statement>) = { "-", "!", NAME, "++", "--", INTEGER, CHARACTER, "(", "inputchar", "inputint", "+", "*"} First(‹Outputchar_statement>) = { "outputchar" } First(‹Outputint_statement>) = { "outputint" } First(‹Break_statement>) = { "break" } First(‹Expression>) = { "-", "!", NAME, "++", "--", INTEGER, CHARACTER, "(", "inputchar", "inputint", "+", "*"} First(‹Exp>) = { "-", "!", NAME, "++", "--", INTEGER, CHARACTER, "(", "inputchar", "inputint", "+", "*"} First(‹Logical_term>) = { "-", "!", NAME, "++", "--", INTEGER, CHARACTER, "(", "inputchar", "inputint", "+", "*"} First(‹Logical_factor>) = { "-", "!", NAME, "++", "--", INTEGER, CHARACTER, "(", "inputchar", "inputint", "+", "*"} First(‹Arithmetic_expression>)= { "-", "!", NAME, "++", "--", INTEGER, CHARACTER, "(", "inputchar", "inputint", "+", "*"} First(‹Arithmetic_term>) = { "-", "!", NAME, "++", "--", INTEGER, CHARACTER, "(", "inputchar", "inputint", "+", "*"} First(‹Arithmetic_factor>) = { "-", "!", NAME, "++", "--", INTEGER, CHARACTER, "(", "inputchar", "inputint", "+", "*"} First(‹Unsigned_factor>) = { NAME, "++", "--", INTEGER, CHARACTER, "(", "inputchar", "inputint", "+", "*"} First(‹Sum_function>) = { "+" } First(‹Product_function>) = { "*" } First(‹Expression_list>) = { "-", "!", NAME, "++", "--", INTEGER, CHARACTER, "(", "inputchar", "inputint", "+", "*"}