我想实现输入“数字 运算符 数字”程序可以只识别数字,忽略运算符
时间: 2024-03-23 09:39:28 浏览: 16
你可以使用字符串流(stringstream)来解析输入的字符串,从中提取出数字,忽略运算符。以下是一个示例代码:
```cpp
#include <iostream>
#include <sstream>
#include <string>
int main() {
std::string input = "123 + 456";
std::stringstream ss(input);
int num1, num2;
char op;
ss >> num1 >> op >> num2;
std::cout << "num1: " << num1 << std::endl; // 输出 num1: 123
std::cout << "num2: " << num2 << std::endl; // 输出 num2: 456
return 0;
}
```
在这个示例中,我们首先定义了一个字符串 `input`,其中包含了数字和运算符。然后,我们使用字符串流 `ss` 来解析这个字符串。`ss` 的使用方式类似于输入流,我们可以使用 `>>` 运算符从其中依次读取数据。
在这个例子中,我们先读取了一个整数 `num1`,然后忽略了一个字符 `op`,最后读取了另一个整数 `num2`。由于我们忽略了运算符,所以即使输入中包含了不同的运算符,程序也不会受到影响。
当然,如果你需要支持更复杂的输入格式,比如包含多个运算符或者括号等,就需要编写更加复杂的解析代码了。
相关问题
词法分析器实现C语言的识别
词法分析器(也称为词法扫描器)是编译器中的一个重要组成部分,用于将输入的源代码分解为单个的词素(token),并将每个词素分类为不同的词法单元(lexical unit)。在 C 语言中,词法单元包括关键字、标识符、常量、运算符和分隔符等。
要实现一个词法分析器,可以采用以下步骤:
1. 定义词法单元:根据 C 语言的语法规则,定义不同词法单元的正则表达式或有限状态自动机。例如,关键字可以使用正则表达式进行匹配,标识符可以使用 DAFSA(Deterministic Acyclic Finite State Automaton)进行匹配。
2. 扫描源代码:读入源代码文件,并将其逐个字符进行扫描。每当扫描到一个字符时,对其进行判断和分类,直到识别出一个完整的词法单元。
3. 输出词法单元:将识别出的词法单元输出到下一个编译器阶段,如语法分析器(parser)。
下面是一个简单的 C 语言词法分析器的示例代码:
```c
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define MAX_TOKEN_LEN 100
typedef enum {
TOKEN_KEYWORD,
TOKEN_IDENTIFIER,
TOKEN_CONSTANT,
TOKEN_OPERATOR,
TOKEN_SEPARATOR,
TOKEN_ERROR,
TOKEN_END
} TokenType;
typedef struct {
TokenType type;
char value[MAX_TOKEN_LEN];
} Token;
Token get_next_token(FILE *fp) {
Token token = {TOKEN_END, ""};
char ch = fgetc(fp);
while (!feof(fp)) {
if (isspace(ch)) { // 忽略空白字符
ch = fgetc(fp);
continue;
}
if (isalpha(ch)) { // 关键字或标识符
int i = 0;
while (isalnum(ch) || ch == '_') {
if (i < MAX_TOKEN_LEN - 1) {
token.value[i++] = ch;
}
ch = fgetc(fp);
}
token.value[i] = '\0';
if (strcmp(token.value, "if") == 0 ||
strcmp(token.value, "else") == 0 ||
strcmp(token.value, "while") == 0 ||
strcmp(token.value, "for") == 0) {
token.type = TOKEN_KEYWORD;
} else {
token.type = TOKEN_IDENTIFIER;
}
break;
}
// TODO: 其他词法单元的识别
// 无法识别的字符
token.type = TOKEN_ERROR;
token.value[0] = ch;
token.value[1] = '\0';
break;
}
return token;
}
int main() {
FILE *fp = fopen("test.c", "r");
Token token;
do {
token = get_next_token(fp);
switch (token.type) {
case TOKEN_KEYWORD:
printf("Keyword: %s\n", token.value);
break;
case TOKEN_IDENTIFIER:
printf("Identifier: %s\n", token.value);
break;
case TOKEN_CONSTANT:
printf("Constant: %s\n", token.value);
break;
case TOKEN_OPERATOR:
printf("Operator: %s\n", token.value);
break;
case TOKEN_SEPARATOR:
printf("Separator: %s\n", token.value);
break;
case TOKEN_ERROR:
printf("Error: %s\n", token.value);
break;
case TOKEN_END:
printf("End of file.\n");
break;
}
} while (token.type != TOKEN_END);
fclose(fp);
return 0;
}
```
该示例代码实现了关键字和标识符的识别,其他词法单元的识别需要根据实际情况进行补充。
、源代码的单词及其种别码如下: 类别 单词 编码 关键字 if 1 then 2 do 3 while 4 begin 5 end 6 标识符 以字母开头,后跟字母或者数字 7 常数 所有非负整数 8 运算符 + 9 - 10 * 11 / 12 = 13 > 14 < 15 界符 ; 16 ( 17 ) 18 { 19 } 20 2、采用你熟悉的语言编写,编写能够识别上面单词的词法分析程序。
这里提供一个Python实现的词法分析程序示例:
```python
# 定义关键字和对应的编码
keywords = {
'if': 1,
'then': 2,
'do': 3,
'while': 4,
'begin': 5,
'end': 6
}
# 判断一个字符串是否是标识符
def is_identifier(word):
if not word.isalpha():
return False
return True
# 判断一个字符串是否是常数
def is_constant(word):
try:
int(word)
return True
except ValueError:
return False
# 定义运算符、界符和对应的编码
operators = {
'+': 9,
'-': 10,
'*': 11,
'/': 12,
'=': 13,
'>': 14,
'<': 15
}
delimiters = {
';': 16,
'(': 17,
')': 18,
'{': 19,
'}': 20
}
# 词法分析函数
def lex(input_string):
tokens = [] # 存储识别出的token
i = 0 # 当前读取到的位置
while i < len(input_string):
c = input_string[i] # 当前读取到的字符
if c in operators: # 如果是运算符
tokens.append((operators[c], c)) # 添加到token列表
i += 1
elif c in delimiters: # 如果是界符
tokens.append((delimiters[c], c)) # 添加到token列表
i += 1
elif c.isalpha(): # 如果是字母,可能是关键字或标识符
word = c
j = i + 1
while j < len(input_string) and (input_string[j].isalpha() or input_string[j].isdigit()):
word += input_string[j]
j += 1
if word in keywords: # 如果是关键字
tokens.append((keywords[word], word)) # 添加到token列表
else: # 如果是标识符
tokens.append((7, word)) # 添加到token列表
i = j
elif c.isdigit(): # 如果是数字,可能是常数
word = c
j = i + 1
while j < len(input_string) and input_string[j].isdigit():
word += input_string[j]
j += 1
tokens.append((8, word)) # 添加到token列表
i = j
else: # 如果是其他字符,忽略掉
i += 1
return tokens
```
上面的`lex`函数接受一个字符串作为输入,返回一个二元组的列表,每个二元组表示一个token,第一个元素是该token的编码,第二个元素是该token的字符串表示。例如,对于输入字符串`"if x > 0 then y = 1; end"`,输出结果为:
```
[(1, 'if'), (7, 'x'), (14, '>'), (8, '0'), (2, 'then'), (7, 'y'), (13, '='), (8, '1'), (16, ';'), (6, 'end')]
```