【发布时间】:2021-10-13 05:23:45
【问题描述】:
我已经做了好几个小时了,但我无法弄清楚我的代码中的问题是什么。 我目前正在为自定义指令集架构编写一个非常简单的汇编程序。这个汇编器接受一个输入文件并简单地逐行解析。在解析过程中,我打算用空格分割每一行,将标记写入数组进行处理。以下是执行此操作的一些代码:
char** tokens = (char**) malloc(sizeof(char*));
char* linecpy = strcpy(linecpy, line);
char* tok_ptr = strtok(linecpy, " ");
int tokenid = 0;
while(tok_ptr) {
tokens = (char**) realloc(tokens, (tokenid+1) * sizeof(char*));
tokens[tokenid] = tok_ptr;
tokenid++;
tok_ptr = strtok(NULL, " ");
}
为了测试它是否准确工作,我让它从数组中按顺序打印出每个标记,并且我在标记中间发现了不应该存在的随机分割。这是一个例子:
汇编文件中的行:
jsr fibloop ; jump to the main program loop
按空格分割的预期输出:
jsr
fibloop
;
jump
to
the
main
program
loop
实际输出:
jsr
fibloo
p
;
jump
to
the
main
pr
ogram
l
oop
我花了很长时间试图解决这个问题,但无济于事,非常感谢有关如何解决这个问题的反馈
编辑:Clifford 和 4386427 指出了这个问题的解决方案,问题是 linecpy 没有分配内存,并且 strcpy 没有直接返回一个新字符串,因为我假设不正确。工作代码已放在下面,我已经包含了一个注释过滤器,以在解析器遇到注释字符后停止标记化,Clifford 指出了这一点
char** tokens = (char**) malloc(sizeof(char*));
char* linecpy = malloc(strlen(line) + 1);
strcpy(linecpy, line);
char* tok_ptr = strtok(linecpy, " ");
int tokenid = 0;
while(tok_ptr) {
/*
If a token starts with a comment character then we stop tokenization,
as everything after will be commented and is of no use to the parser
*/
if(tok_ptr[0] == ';') break;
tokens = (char**) realloc(tokens, (tokenid+1) * sizeof(char*));
tokens[tokenid] = tok_ptr;
tokenid++;
tok_ptr = strtok(NULL, " ");
}
// free memory allocated to tokens after parsing
free(tokens);
希望这可以帮助遇到我遇到同样问题的任何人,该社区成员的快速回复非常有帮助。谢谢大家!
【问题讨论】:
-
任何回答这个问题的人都可能需要一个完整的示例来产生所示的输出。至少我们需要知道实际输入是什么才能给出输出。
-
注意,我包含了正在读取的程序集文件中的行
-
您可能使这个解析器变得比必要的复杂。从
;到行尾的所有内容都应该被丢弃或被视为单个令牌。如果评论是;jump to ...怎么办? (即;后面没有空格) -
我的问题很简单,只是首先将文本按要处理的空格拆分,我的处理意图是如果令牌的第一个字符是;