gpt4 book ai didi

c - 识别龙书中过时的C代码

转载 作者:太空宇宙 更新时间:2023-11-04 02:04:11 25 4
gpt4 key购买 nike

我正在阅读 this编译器版:原理、技术和工具。

我以前从未用 C 编写过代码(尽管我曾涉足过 C++),但从其他编程知识来看,大部分代码都是有意义的,但是我注意到一个怪癖,即函数是这样定义的:

emit(t, tval)
int t, tval
{
}

发现有些不对劲,我查了一下,果然,定义函数的方法似乎已经过时了。我希望有人能读懂我在下面重新输入的代码片段,并警告我任何我可能不会注意到和接受的不良做法或过时的技术。此外,如果能帮助我更整洁地编写代码,任何有关 C 的新功能的提示都将不胜感激。我主要是在寻找利用不再属于标准 C 规范的语义、特性、函数等的代码,而不是从风格的角度来看。

此外,如果您有这本书的副本,并且不介意快速浏览并查看(甚至凭内存)您是否可以发现其他一些过时或多余的做事方法,那也太棒了!

我不确定这是否更适合 CodeReview,如果适合,请发表评论,我会删除并重新发布,但我认为由于它来自流行的编程文本,所以它可能更适合放在这里。如果我不正确,请道歉。

全局.h

#include <stdio.h>
#include <ctype.h>

#define BSIZE 128
#define NONE -1
#define EOS '\0'

#define NUM 256
#define DIV 257
#define MOD 258
#define ID 259
#define DONE 260

int tokenval;
int lineno;

struct entry {
char *lexptr;
int token;
};

struct entry symtable[];

词法分析器.c

#include "global.h"

char lexbuf[BSIZE];
int lineno = 1;
int tokenval = NONE;

int lexan()
{
int t;

while (1) {
t = getchar();

if (t == ' ' || t == '\t')
;
else if (t == '\n')
lineno++;
else if (isdigit(t)) {
ungetc(t, stdin);
scanf("%d", &tokenval);
return NUM;
}
else if (isalpha(t)) {
int p, b = 0;
while (isalnum(t)) {
lexbuf[b] = t;
b++;
if (b >= BSIZE)
error("compiler error");
}
lexbuf[b] = EOS;
if (t != EOF)
ungetc(t, stdin);
p = lookup(lexbuf);
if (p == 0)
p = insert(lexbuf, ID);
tokenval = p;
return symtable[p].token
}
else if (t == EOF)
return DONE;
}
}

解析器.c

#include "global.h"

int lookahead;

parse()
{
lookahead = lexan();
while (lookahead != DONE) {
expr(); match(';');
}
}

expr()
{
int t;
term();
while (1)
switch (lookahead) {
case '+': case '-':
t = lookahead;
match(lookahead); term(); emit(t, NONE);
continue;
default:
return;
}
}

term()
{
int t;
factor();
while (1)
switch (lookahead) {
case '*': case '/':
t = lookahead;
match(lookahead); factor(); emit(t, NONE);
continue;
default:
return;
}
}

factor()
{
switch (lookahead) {
case '(':
match('('); expr(); match(')'); break;
case NUM:
emit(NUM, tokenval); match(NUM); break;
case ID:
emit(ID, tokenval); match(ID); break;
default:
error("Syntax error");
}
}

match (t)
int t;
{
if (lookahead == t)
lookahead = lexan();
else error("Syntax error");
}

最佳答案

通过浏览代码,除了您已经提出的旧式函数参数声明之外,我看到的唯一其他过时的功能是不返回任何内容的函数缺少返回类型。例如,parse 函数不返回任何内容,此旧代码通过将其声明为 parse() 来表示,但现代代码将需要 void parse()。还有一个问题是,不接受任何参数的函数应该在它们的括号之间有void(例如,void parse(void)),但我认为这不是严格要求的。

关于c - 识别龙书中过时的C代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22701221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com