String型,Char型变量在While循环语句的运用

while条件判断的时候变量等于String型,Char型的时候该怎么写:
String sure = " “;
应该写成:sure.equals(“y”) ;
而写成sure ==” y " ;不会报错,但是不会显示你想要的正确答案。
写成char sure ;
sure == ’ y '; 编译会报错。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会尽力回答你的问题。 首先,需要了解一下Flex和Bison是什么。Flex和Bison是一对用于生成语法解析器的工具,它们通常被用来处理文本文件。Flex负责识别文本中的词法单元(即token),而Bison则负责处理语法分析,即将这些token转化为有意义的语句。 在这个解释器中,我们需要定义一种自定义的脚本语言,它需要支持变量、条件语句循环语句等。下面是一个简单的示例脚本: ``` # 定义变量 a = 10 b = 20 # 条件语句 if a > b: print("a 大于 b") else: print("a 小于等于 b") # 循环语句 for i in range(5): print(i) ``` 现在我们可以开始设计解释器了。首先,我们需要定义token的类,以及它们在脚本中的表示方式。下面是一个简单的示例: ``` %{ #include <stdio.h> #include <stdlib.h> #include <string.h> #define YYSTYPE char* %} %option noyywrap %{ int yyerror(char *); %} %% [ \t] ; /* 空白符 */ \n { return '\n'; } [0-9]+ { yylval = strdup(yytext); return NUMBER; } [a-zA-Z_][a-zA-Z_0-9]* { yylval = strdup(yytext); return IDENTIFIER; } = { return ASSIGN; } \+ { return ADD; } \- { return SUB; } \* { return MUL; } \/ { return DIV; } \( { return LPAREN; } \) { return RPAREN; } \{ { return LBRACE; } \} { return RBRACE; } if { return IF; } else { return ELSE; } for { return FOR; } in { return IN; } range { return RANGE; } print { return PRINT; } %% ``` 在上面的代码中,我们定义了一些token的类,包括数字、标识符、赋值符号、加减乘除符号、括号等。我们还定义了一些关键字,如if、else、for、in、range和print。 接下来,我们需要定义语法规则,告诉Bison如何将这些token转化为有意义的语句。下面是一个简单的示例: ``` %{ #include <stdio.h> #include <stdlib.h> #include <string.h> void yyerror(char *); %} %union { char *strval; } %token <strval> NUMBER IDENTIFIER %token ASSIGN ADD SUB MUL DIV LPAREN RPAREN LBRACE RBRACE %token IF ELSE FOR IN RANGE PRINT %type <strval> expression statement %start program %% program: statement | program statement ; statement: IDENTIFIER ASSIGN expression | IF LPAREN expression RPAREN LBRACE program RBRACE ELSE LBRACE program RBRACE | FOR IDENTIFIER IN RANGE LPAREN expression COMMA expression RPAREN LBRACE program RBRACE | PRINT LPAREN expression RPAREN ; expression: IDENTIFIER | NUMBER | LPAREN expression RPAREN | expression ADD expression | expression SUB expression | expression MUL expression | expression DIV expression ; %% void yyerror(char *s) { fprintf(stderr, "%s\n", s); } int main(void) { yyparse(); return 0; } ``` 在上面的代码中,我们定义了几个语法规则,包括赋值语句、条件语句循环语句和打印语句。我们还定义了一些表达式,包括标识符、数字、括号、加减乘除等。 最后,我们需要编写一些解释器代码,将这些语句转化为有意义的操作。下面是一个简单的示例: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char **argv) { FILE *fp = fopen(argv[1], "r"); if (fp == NULL) { fprintf(stderr, "无法打开文件 %s\n", argv[1]); exit(1); } yyparse(); fclose(fp); return 0; } void yyerror(char *s) { fprintf(stderr, "%s\n", s); } void execute_statement(char *identifier, char *operation, char *value) { int result = atoi(value); if (strcmp(operation, "=") == 0) { printf("%s = %d\n", identifier, result); } } void execute_if(char *condition, char *statement1, char *statement2) { int result = atoi(condition); if (result) { printf("%s\n", statement1); } else { printf("%s\n", statement2); } } void execute_for(char *identifier, char *start, char *end, char *statement) { int i, j; i = atoi(start); j = atoi(end); for (; i < j; i++) { printf("%s = %d\n", identifier, i); printf("%s\n", statement); } } void execute_print(char *value) { printf("%s\n", value); } void execute_expression(char *expression) { printf("%s\n", expression); } int yyparse(void) { int token; char *identifier, *operation, *value, *condition, *statement1, *statement2, *start, *end, *expression; while ((token = yylex())) { switch (token) { case IDENTIFIER: identifier = yylval; break; case ASSIGN: operation = yylval; break; case NUMBER: value = yylval; break; case IF: condition = yylval; break; case ELSE: statement1 = yylval; break; case LBRACE: statement2 = yylval; break; case FOR: identifier = yylval; break; case IN: start = yylval; break; case RANGE: end = yylval; break; case PRINT: value = yylval; break; case ADD: case SUB: case MUL: case DIV: expression = yylval; break; case '\n': if (operation != NULL) { execute_statement(identifier, operation, value); operation = NULL; } else if (condition != NULL) { execute_if(condition, statement1, statement2); condition = NULL; statement1 = NULL; statement2 = NULL; } else if (start != NULL) { execute_for(identifier, start, end, statement2); identifier = NULL; start = NULL; end = NULL; statement2 = NULL; } else if (value != NULL) { execute_print(value); value = NULL; } else if (expression != NULL) { execute_expression(expression); expression = NULL; } break; default: break; } } return 0; } ``` 在上面的代码中,我们编写了一些函数来执行不同的语句,包括赋值、条件语句循环语句和打印语句。我们还编写了一个函数来执行表达式。在yyparse函数中,我们将token转化为操作,并调用对应的函数来执行操作。 以上是一个简单的解释器的设计过程,仅供参考。实际应用中,还需要考虑一些细节问题,如错误处理、变量作用域等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值