嗨,我正在为一个简单的编程语言做一个解析器。
以下是我的野牛法则
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 "
我在打印语句规则上做错了什么?
1条答案
按热度按时间mklgxw1f1#
因为
print_list
规则是右递归的,所以它将从右向左减少项,从而以从右向左的顺序打印它们。如果您希望约简(和处理)从左到右发生,请使用左递归规则。