gpt4 book ai didi

c - 我想创建一个程序来检查输入在 C 中的语法是否有效

转载 作者:太空宇宙 更新时间:2023-11-04 08:27:58 28 4
gpt4 key购买 nike

如何创建一个 C 程序,将 C 中的命令作为输入,并在出现任何错误时打印出来?

例如,

    Input: for(i=0; i<5; i++);
No errors.

Input: for((i=0); i>2,(i<5) ; i++);
No errors.

Input: for(i=0, i<5; i++);
Error.

Input: for((i=0; i<5; i++));
Error.

我认为最短的方法是编译输入字符串,然后检查是否有任何错误发生。但是我不知道如何编译运行时传递的一段代码。此外,还有未声明变量的问题。

最佳答案

C 的解析特别复杂。即使您删除了它的预处理器端,仍然存在棘手的部分。

如果您正在自学,您可以寻找可以查看的 C 语法(有一些用于 ANSI C 的 lex/yacc 格式)。

从你的例子来看,我猜你只想识别 C 的一个子集,而不是整个语言,对吗?如果是这种情况,您应该定义该子集并为其编写解析器。

与其尝试手动编写解析器,不如学习语法和解析器生成器(如果您还没有使用过的话)。

如果它是您感兴趣的 C 的子集,我会使用像 PackCC 这样的 PEG 解析生成器轻松获得解析器。

作为一个 super 简单的例子,下面的解析器:

%prefix "mc"

stmt <- _ assign { printf("assignment\n"); }
/ _ if { printf("if\n"); }
/ ( !EOL . )* EOL { printf("error\n"); }

if <- 'if' _ '(' _ var _ ')' _ stmt

assign <- var _ '=' _ num _ ';' _ EOL
var <- [A-Za-z_] [0-9A-Za-z_]*
num <- [0-9]+
_ <- [ \t]*
EOL <- '\n' / '\r\n' / '\r'

%%
int main() {
mc_context_t *ctx = mc_create(NULL);
while (mc_parse(ctx, NULL));
mc_destroy(ctx);
return 0;
}

将接受赋值(左值为变量名,右值为整数)和条件为变量名的 if 语句。假设解析器在文件 mu.peg

home> packcc mu.peg
home> gcc -o mu mu.c
home> ./mu
t = 5;
assignment
t = 5
error
if (x) p = 3;
assignment
if
if (x) if (y) t = 3;
assignment
if
if

相反,如果您需要在运行时检查静态有效的 C 代码,并且您的系统上安装了编译器,通常是 GCC 或 Clang,您可以通过 system() 调用它并拦截任何错误.根据您要对代码执行的检查类型,您可以考虑使用像 splint 这样的静态分析器。 .

如果您需要将所有内容嵌入到您的应用程序中,您可以尝试tcc它也可以作为一个库使用。

关于c - 我想创建一个程序来检查输入在 C 中的语法是否有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29545488/

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