I want to create a program that checks if the input is syntactically valid in C -
how create c program takes in command in c input, , prints if there errors?
for example,
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.
i think shortest way compile input string, , check if errors occur. don't know how compile piece of code passed during runtime. also, there problem of undeclared variables.
c particuraly complicated parse. if remove pre-processor side of it, there still tricky parts.
if learning yourself, can c grammar (there in lex/yacc format ansi c) can at.
from example guess want able recognize subset of c, not entire language, correct? if case, should define subset , write parser it.
rather trying write parser hand, should learn grammars , parser generators if haven't worked them already.
if it's subset of c you're interested in, use peg parse generator packcc parser.
as super-simple example, following parser:
%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; }
will accept assignment (where lvalue variable name , rvalue integer) , if statements condition variable name. assuming parser in file 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
if, instead, need check sintatically valid c code @ runtime , there's compiler installed on system, tipically gcc or clang, can call via system()
, intercept error. depending on type of checks want on code, can consider using static analyzer splint.
if need embed in application, can try tcc availble library.