C语言 野牛打印规则向后打印

mlmc2os5  于 2023-04-05  发布在  其他
关注(0)|答案(1)|浏览(138)

嗨,我正在为一个简单的编程语言做一个解析器。
以下是我的野牛法则

program:
    start var_decl_list main statement_list end

start:
    START EOS {printf("Start")};

var_decl_list: 
    var_decl_list variable_declaration | variable_declaration;

variable_declaration:
    S VAR_NAME EOS { add_variable($1, $2); };

main: 
    MAIN EOS {printf("Main")};

statement_list:
    statement_list statement | statement;

statement:
  move_statement
  | add_statement
  | input_statement
  | print_statement
  ;

move_statement:
    MOVE NUMBER TO VAR_NAME EOS { int_to_var($2, $4) }
    | MOVE VAR_NAME TO VAR_NAME EOS { move_var_to_var($2, $4) };

add_statement:
    ADD NUMBER TO VAR_NAME EOS { add_int_to_var($2, $4) }
    | ADD VAR_NAME TO VAR_NAME EOS { add_var_to_var($2, $4) };

input_statement:
    INPUT input_list;

input_list:
    VAR_NAME EOS { find_variable($1)};
    | VAR_NAME SEMICOLON input_list {printf("INPUT statement")};

print_statement:
    PRINT print_list;

print_list:
    VAR_NAME EOS {print_variable($1)}
    | TEXT EOS {print_text($1)}
    | VAR_NAME SEMICOLON print_list {print_variable($1)}
    | TEXT SEMICOLON print_list {print_text($1)};
end:
    END EOS {printf("End")};

我的问题是print语句。
如果我打印以下内容:

PRINT "I have ";XY;" apples".

我得到这个输出

" apples"35"I have "

我在打印语句规则上做错了什么?

mklgxw1f

mklgxw1f1#

因为print_list规则是右递归的,所以它将从右向左减少项,从而以从右向左的顺序打印它们。
如果您希望约简(和处理)从左到右发生,请使用左递归规则。

相关问题