上述函数getinput函数显示找不到标识符怎么修改
时间: 2023-06-15 08:08:23 浏览: 54
如果getinput函数显示找不到标识符,可能是因为该函数没有定义或者没有在当前作用域中声明。要解决这个问题,需要确认以下几点:
1. 确认函数名称是否正确,包括大小写和拼写。如果函数名称有误,需要修改函数名称。
2. 确认函数是否在当前文件或者导入的模块中定义。如果函数没有定义,需要定义函数或者导入包含该函数定义的模块。
3. 确认函数是否在当前作用域中声明。如果函数在其他作用域中声明,需要在当前作用域中导入或者声明该函数。
如果以上三个步骤都确认无误,但是仍然报错,可能是其他问题导致的。可以检查代码中其他可能导致问题的部分,例如变量声明、语法错误等。
相关问题
mysql创建查询子节点的函数
MySQL中可以使用递归CTE(通用表达式)来创建查询子节点的函数。以下是一个简单的例子:
假设我们有一个表格tree,其中包含两个列:id和parent_id。id表示节点的唯一标识符,parent_id表示该节点的父节点的标识符。我们想要编写一个函数,该函数接受一个节点的id作为输入,并返回该节点的所有子节点的id。
首先,我们可以创建一个递归CTE来查找给定节点的所有子节点:
WITH RECURSIVE sub_tree AS (
SELECT id, parent_id
FROM tree
WHERE id = <input_id>
UNION ALL
SELECT t.id, t.parent_id
FROM tree t
JOIN sub_tree st ON t.parent_id = st.id
)
SELECT id FROM sub_tree;
在上面的查询中,我们首先选择给定的节点,然后使用UNION ALL将其与所有直接子节点组合在一起。然后,在每个递归步骤中,我们选择与先前选择的子节点相关联的所有节点,并将它们添加到结果集中。这样,我们可以使用CTE来获取给定节点的所有子节点。
接下来,我们可以将上述查询封装在一个函数中:
DELIMITER //
CREATE FUNCTION get_sub_tree(input_id INT)
RETURNS VARCHAR(255)
BEGIN
DECLARE result VARCHAR(255) DEFAULT '';
WITH RECURSIVE sub_tree AS (
SELECT id, parent_id
FROM tree
WHERE id = input_id
UNION ALL
SELECT t.id, t.parent_id
FROM tree t
JOIN sub_tree st ON t.parent_id = st.id
)
SELECT GROUP_CONCAT(id) INTO result FROM sub_tree;
RETURN result;
END //
DELIMITER ;
在上面的函数中,我们首先定义一个名为result的变量,该变量将用于存储结果。然后,我们使用上面的递归CTE查询获取给定节点的所有子节点,并使用GROUP_CONCAT将所有子节点的id连接成一个字符串。最后,我们返回该字符串作为函数的结果。
现在,我们可以使用以下方式调用该函数来获取节点1的所有子节点:
SELECT get_sub_tree(1);
该函数将返回一个逗号分隔的子节点id列表,如下所示:
2,3,4,5,6
这些就是MySQL创建查询子节点的函数的方法。
从 PL/0 编译程序源码中抽出词法分析部分,只改写main函数,构建 PL/0 独立词法分析程序。功能:输入为 PL/0 源程序, 输出为单词符号的序列;对于标识符和无符号整数,显示单词种别和单词自身的值两项内容;对于其他单词符号,仅显示其单词种别。
以下是一个简单的 PL/0 独立词法分析程序,它从标准输入中读取 PL/0 源程序,将其转换为单词符号的序列,并在标准输出中显示单词种别和单词的值(对于标识符和无符号整数),或者仅显示单词种别(对于其他单词符号)。
```
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define MAX_IDENT_LEN 32
#define MAX_NUM_LEN 10
enum {
SYM_NULL,
SYM_IDENTIFIER,
SYM_NUMBER,
SYM_PLUS,
SYM_MINUS,
SYM_TIMES,
SYM_SLASH,
SYM_ODD,
SYM_EQU,
SYM_NEQ,
SYM_LES,
SYM_LEQ,
SYM_GTR,
SYM_GEQ,
SYM_LPAREN,
SYM_RPAREN,
SYM_COMMA,
SYM_SEMICOLON,
SYM_PERIOD,
SYM_BECOMES,
SYM_BEGIN,
SYM_END,
SYM_IF,
SYM_THEN,
SYM_WHILE,
SYM_DO,
SYM_CALL,
SYM_CONST,
SYM_VAR,
SYM_PROCEDURE
};
static char ch = ' ';
static int sym;
static char ident[MAX_IDENT_LEN + 1];
static int num;
static void next_ch(void)
{
ch = getchar();
}
static void error(const char *msg)
{
fprintf(stderr, "%s\n", msg);
exit(1);
}
static void get_sym(void)
{
while (isspace(ch))
next_ch();
if (isalpha(ch)) {
int i = 0;
do {
if (i < MAX_IDENT_LEN)
ident[i++] = ch;
next_ch();
} while (isalnum(ch));
ident[i] = '\0';
if (strcmp(ident, "odd") == 0)
sym = SYM_ODD;
else if (strcmp(ident, "begin") == 0)
sym = SYM_BEGIN;
else if (strcmp(ident, "end") == 0)
sym = SYM_END;
else if (strcmp(ident, "if") == 0)
sym = SYM_IF;
else if (strcmp(ident, "then") == 0)
sym = SYM_THEN;
else if (strcmp(ident, "while") == 0)
sym = SYM_WHILE;
else if (strcmp(ident, "do") == 0)
sym = SYM_DO;
else if (strcmp(ident, "call") == 0)
sym = SYM_CALL;
else if (strcmp(ident, "const") == 0)
sym = SYM_CONST;
else if (strcmp(ident, "var") == 0)
sym = SYM_VAR;
else if (strcmp(ident, "procedure") == 0)
sym = SYM_PROCEDURE;
else
sym = SYM_IDENTIFIER;
} else if (isdigit(ch)) {
num = 0;
do {
num = num * 10 + (ch - '0');
next_ch();
} while (isdigit(ch));
sym = SYM_NUMBER;
} else {
switch (ch) {
case '+':
sym = SYM_PLUS;
next_ch();
break;
case '-':
sym = SYM_MINUS;
next_ch();
break;
case '*':
sym = SYM_TIMES;
next_ch();
break;
case '/':
sym = SYM_SLASH;
next_ch();
break;
case '=':
sym = SYM_EQU;
next_ch();
break;
case '<':
next_ch();
if (ch == '=') {
sym = SYM_LEQ;
next_ch();
} else if (ch == '>') {
sym = SYM_NEQ;
next_ch();
} else {
sym = SYM_LES;
}
break;
case '>':
next_ch();
if (ch == '=') {
sym = SYM_GEQ;
next_ch();
} else {
sym = SYM_GTR;
}
break;
case '(':
sym = SYM_LPAREN;
next_ch();
break;
case ')':
sym = SYM_RPAREN;
next_ch();
break;
case ',':
sym = SYM_COMMA;
next_ch();
break;
case ';':
sym = SYM_SEMICOLON;
next_ch();
break;
case '.':
sym = SYM_PERIOD;
next_ch();
break;
case ':':
next_ch();
if (ch == '=') {
sym = SYM_BECOMES;
next_ch();
} else {
error("invalid symbol");
}
break;
default:
error("invalid symbol");
break;
}
}
}
int main(void)
{
while (ch != EOF) {
get_sym();
switch (sym) {
case SYM_IDENTIFIER:
printf("%d %s\n", SYM_IDENTIFIER, ident);
break;
case SYM_NUMBER:
printf("%d %d\n", SYM_NUMBER, num);
break;
default:
printf("%d\n", sym);
break;
}
}
return 0;
}
```
可以将上述代码保存为 `pl0lex.c`,并使用 C 编译器进行编译,例如:
```
$ gcc -o pl0lex pl0lex.c
```
然后,可以使用以下命令运行该程序:
```
$ ./pl0lex < input.pl0
```
其中 `input.pl0` 是 PL/0 源程序的文件名。程序将输出单词符号的序列,每个单词符号占一行,其中标识符和无符号整数的值也将被显示出来。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![application/x-zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)