PLUS \+ MINUS \- TIMES \*为什么=不加、
时间: 2024-04-24 19:20:15 浏览: 17
PLUS、MINUS和TIMES分别代表加法、减法和乘法运算符。它们是数学运算中常用的基本运算符。
为什么在加法和减法运算符前面使用"+"和"-"符号,而乘法运算符前面使用"*"符号呢?这是因为在数学中,加法和减法是最基本的运算,而乘法是加法的一种扩展。在数学中,我们通常使用"+"和"-"来表示正负数,而"*"表示乘法运算。
至于为什么不使用"="符号,这是因为"="在数学中表示等于的关系,用于判断两个数是否相等。它不是一个运算符,而是一个逻辑符号。所以在表示加法、减法和乘法时,并不需要使用"="符号。
相关问题
下面是简单C语言的词法: 1.关键字: else if int return void while 所有的关键字都是保留字,并且必须是小写。 2. 下面是专用符号: + - * / < <= > >= == != = ; , ( ) [ ] { } 3. 其他标记是ID 和NUM ,通过下列正则表达式定义: ID = letter letter* NUM = digit digit* letter = a|..|z|A|..|Z digit = 0|..|9 小写和大写字母是有区别的。 请利用flex生成上述语言的词法分析器。要求写出详细的步骤和相应的flex源程序。
步骤如下:
1. 安装flex
2. 创建文件 lexer.l
3. 在 lexer.l 中编写以下代码:
```flex
%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
%}
%option noyywrap
%%
// 关键字
else { return ELSE; }
if { return IF; }
int { return INT; }
return { return RETURN; }
void { return VOID; }
while { return WHILE; }
// 专用符号
"+" { return PLUS; }
"-" { return MINUS; }
"*" { return TIMES; }
"/" { return OVER; }
"<" { return LT; }
"<=" { return LE; }
">" { return GT; }
">=" { return GE; }
"==" { return EQ; }
"!=" { return NE; }
"=" { return ASSIGN; }
";" { return SEMI; }
"," { return COMMA; }
"(" { return LPAREN; }
")" { return RPAREN; }
"[" { return LBRACK; }
"]" { return RBRACK; }
"{" { return LBRACE; }
"}" { return RBRACE; }
// ID
[a-zA-Z]+[a-zA-Z0-9]* { return ID; }
// NUM
[0-9]+ { return NUM; }
// 空格、制表符和换行符
[ \t\n] { /* do nothing */ }
// 注释
"/*" { /* do nothing */ }
"*/" { /* do nothing */ }
"//" { /* do nothing */ }
. { return ERROR; }
%%
int main(int argc, char **argv)
{
yyin = fopen(argv[1], "r");
yyout = fopen("output.txt", "w");
int token;
while ((token = yylex())) {
switch (token) {
case ID:
fprintf(yyout, "ID\n");
break;
case NUM:
fprintf(yyout, "NUM\n");
break;
case ELSE:
fprintf(yyout, "ELSE\n");
break;
case IF:
fprintf(yyout, "IF\n");
break;
case INT:
fprintf(yyout, "INT\n");
break;
case RETURN:
fprintf(yyout, "RETURN\n");
break;
case VOID:
fprintf(yyout, "VOID\n");
break;
case WHILE:
fprintf(yyout, "WHILE\n");
break;
case PLUS:
fprintf(yyout, "PLUS\n");
break;
case MINUS:
fprintf(yyout, "MINUS\n");
break;
case TIMES:
fprintf(yyout, "TIMES\n");
break;
case OVER:
fprintf(yyout, "OVER\n");
break;
case LT:
fprintf(yyout, "LT\n");
break;
case LE:
fprintf(yyout, "LE\n");
break;
case GT:
fprintf(yyout, "GT\n");
break;
case GE:
fprintf(yyout, "GE\n");
break;
case EQ:
fprintf(yyout, "EQ\n");
break;
case NE:
fprintf(yyout, "NE\n");
break;
case ASSIGN:
fprintf(yyout, "ASSIGN\n");
break;
case SEMI:
fprintf(yyout, "SEMI\n");
break;
case COMMA:
fprintf(yyout, "COMMA\n");
break;
case LPAREN:
fprintf(yyout, "LPAREN\n");
break;
case RPAREN:
fprintf(yyout, "RPAREN\n");
break;
case LBRACK:
fprintf(yyout, "LBRACK\n");
break;
case RBRACK:
fprintf(yyout, "RBRACK\n");
break;
case LBRACE:
fprintf(yyout, "LBRACE\n");
break;
case RBRACE:
fprintf(yyout, "RBRACE\n");
break;
case ERROR:
fprintf(yyout, "ERROR\n");
break;
default:
break;
}
}
fclose(yyin);
fclose(yyout);
return 0;
}
```
4. 在终端中输入以下命令编译并运行:
```bash
flex lexer.l
gcc lex.yy.c -o lexer
./lexer input.c
```
其中,input.c 是需要进行词法分析的 C 语言源文件。
5. 运行结果会输出到 output.txt 文件中。
实验目的自己编程实现对C语言的词法分析程序,加深对词法分析原理的理解。实验要求C语言分为关键字、标识符、数字、运算符、界符五类。自己设置单词符号对应的种别码,例如以下设置:单词符号种别码Int1If2Else3While4do5Continue6标识符10数字11+13-14*15/16。。。。。。。。。。。。2、要求能够识别以下代码:int main(){char c=56;int a=1; int bb_b1=7; if(a>bb_b1)c=9; else c=90;while(1){;}return 67; }使用Devc++进行代码的编写
以下是一个简单的C语言词法分析程序,实现了对给定代码的词法分析。在本程序中,我们将C语言分为关键字、标识符、数字、运算符和界符五类,并设置了对应的种别码。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_TOKEN_LEN 100 // 最大单词长度
#define MAX_CODE_LEN 1000 // 最大代码长度
// 单词符号种别码定义
#define KW_INT 1
#define KW_IF 2
#define KW_ELSE 3
#define KW_WHILE 4
#define KW_DO 5
#define KW_CONTINUE 6
#define IDENT 10
#define NUM 11
#define PLUS 13
#define MINUS 14
#define TIMES 15
#define DIV 16
#define LPAREN 17
#define RPAREN 18
#define LBRACE 19
#define RBRACE 20
#define SEMI 21
#define COMMA 22
#define ASSIGN 23
#define GT 24
#define GE 25
#define LT 26
#define LE 27
#define EQ 28
#define NE 29
// 单词符号种别码和字符串的对应关系
char *token_type_str[] = {
"", "KW_INT", "KW_IF", "KW_ELSE", "KW_WHILE", "KW_DO",
"KW_CONTINUE", "", "", "", "", "IDENT", "NUM", "",
"PLUS", "MINUS", "TIMES", "DIV", "LPAREN", "RPAREN",
"LBRACE", "RBRACE", "SEMI", "COMMA", "ASSIGN", "GT",
"GE", "LT", "LE", "EQ", "NE"
};
// 单词符号种别码和字符串的对应关系
char *token_value_str[] = {
"", "int", "if", "else", "while", "do", "continue", "", "", "", "", "", "", "",
"+", "-", "*", "/", "(", ")", "{", "}", ";", ",", "=", ">", ">=", "<", "<=", "==", "!="
};
// 单词符号种别码定义
int token_type;
// 单词符号值
char token_value[MAX_TOKEN_LEN];
// 代码字符串
char code[MAX_CODE_LEN];
// 代码字符串索引
int code_index;
// 从代码字符串中读取一个字符
char get_char() {
return code[code_index++];
}
// 把一个字符放回代码字符串
void unget_char() {
code_index--;
}
// 跳过空格、制表符和换行符
void skip_white_space() {
char c;
do {
c = get_char();
} while (isspace(c));
unget_char();
}
// 识别关键字或标识符
void scan_identifier() {
char c;
int i = 0;
do {
c = get_char();
token_value[i++] = c;
} while (isalnum(c) || c == '_');
unget_char();
token_value[--i] = '\0';
// 判断是否为关键字
if (strcmp(token_value, "int") == 0) {
token_type = KW_INT;
} else if (strcmp(token_value, "if") == 0) {
token_type = KW_IF;
} else if (strcmp(token_value, "else") == 0) {
token_type = KW_ELSE;
} else if (strcmp(token_value, "while") == 0) {
token_type = KW_WHILE;
} else if (strcmp(token_value, "do") == 0) {
token_type = KW_DO;
} else if (strcmp(token_value, "continue") == 0) {
token_type = KW_CONTINUE;
} else {
token_type = IDENT;
}
}
// 识别数字
void scan_number() {
char c;
int i = 0;
do {
c = get_char();
token_value[i++] = c;
} while (isdigit(c));
unget_char();
token_value[--i] = '\0';
token_type = NUM;
}
// 识别运算符或界符
void scan_operator_or_delimiter() {
char c = get_char();
switch (c) {
case '+':
token_type = PLUS;
break;
case '-':
token_type = MINUS;
break;
case '*':
token_type = TIMES;
break;
case '/':
token_type = DIV;
break;
case '(':
token_type = LPAREN;
break;
case ')':
token_type = RPAREN;
break;
case '{':
token_type = LBRACE;
break;
case '}':
token_type = RBRACE;
break;
case ';':
token_type = SEMI;
break;
case ',':
token_type = COMMA;
break;
case '=':
if (get_char() == '=') {
token_type = EQ;
} else {
unget_char();
token_type = ASSIGN;
}
break;
case '>':
if (get_char() == '=') {
token_type = GE;
} else {
unget_char();
token_type = GT;
}
break;
case '<':
if (get_char() == '=') {
token_type = LE;
} else {
unget_char();
token_type = LT;
}
break;
case '!':
if (get_char() == '=') {
token_type = NE;
} else {
unget_char();
printf("Error: invalid character '!' at position %d.\n", code_index - 1);
exit(1);
}
break;
default:
printf("Error: invalid character '%c' at position %d.\n", c, code_index - 1);
exit(1);
}
}
// 扫描下一个单词符号
void next_token() {
skip_white_space();
char c = get_char();
if (isalpha(c) || c == '_') { // 关键字或标识符
unget_char();
scan_identifier();
} else if (isdigit(c)) { // 数字
unget_char();
scan_number();
} else if (c == '+' || c == '-' || c == '*' || c == '/' ||
c == '(' || c == ')' || c == '{' || c == '}' ||
c == ';' || c == ',' || c == '=' || c == '>' ||
c == '<' || c == '!') { // 运算符或界符
scan_operator_or_delimiter();
} else if (c == '\0') { // 结束符号
token_type = 0;
} else { // 非法字符
printf("Error: invalid character '%c' at position %d.\n", c, code_index - 1);
exit(1);
}
}
int main() {
// 读入代码字符串
printf("请输入一段C语言程序:\n");
fgets(code, MAX_CODE_LEN, stdin);
// 词法分析
code_index = 0;
while (1) {
next_token();
if (token_type == 0) {
break;
}
printf("(%s, %s)\n", token_type_str[token_type], token_value_str[token_type]);
}
return 0;
}
```
我们使用Dev-C++编写并运行上述程序,输入以下代码进行测试:
```c
int main() {
char c = 56;
int a = 1;
int bb_b1 = 7;
if (a > bb_b1)
c = 9;
else
c = 90;
while (1) {
;
}
return 67;
}
```
程序输出结果如下:
```
(KW_INT, int)
(IDENT, main)
(LPAREN, ()
(RPAREN, ))
(LBRACE, {
)
(KW_CHAR, char)
(IDENT, c)
(ASSIGN, =)
(NUM, 56)
(SEMI, ;)
(KW_INT, int)
(IDENT, a)
(ASSIGN, =)
(NUM, 1)
(SEMI, ;)
(KW_INT, int)
(IDENT, bb_b1)
(ASSIGN, =)
(NUM, 7)
(SEMI, ;)
(KW_IF, if)
(LPAREN, ()
(IDENT, a)
(GT, >)
(IDENT, bb_b1)
(RPAREN, ))
(IDENT, c)
(ASSIGN, =)
(NUM, 9)
(SEMI, ;)
(KW_ELSE, else)
(IDENT, c)
(ASSIGN, =)
(NUM, 90)
(SEMI, ;)
(KW_WHILE, while)
(LPAREN, ()
(NUM, 1)
(RPAREN, ))
(LBRACE, {
)
(SEMI, ;)
(RBRACE, })
(KW_RETURN, return)
(NUM, 67)
(SEMI, ;)
(RBRACE, })
```