gpt4 book ai didi

c - 如何将 lex 与 C 源文件一起使用?

转载 作者:行者123 更新时间:2023-11-30 15:37:45 26 4
gpt4 key购买 nike

我需要为 C 语言编写一个简单的标记器。它不必对事物进行分类,不必使用任何语法。它所需要做的就是分别打印单词、字符、括号等东西。我正在使用 lex。但我需要读取 C 源文件,然后对其进行标记。您可以在下面找到我当前的代码。我有三个问题。

1) 如何更正编译时收到的错误消息:

parser.l:47:1: warning: unknown conversion type character ‘=’ in format [-Wformat]

2)如何使词法分析器在作为参数传递的源文件上运行?

3)如何让分词器按原样打印变量名称和其他未指定的内容?这意味着如果我有 int test,它将打印 int 因为它是在词法分析器中指定的,并且我还想单独打印 test 因为它没有在 lex 中指定。

这是我的代码:

%{
#include <stdio.h>
#include <stdlib.h>
%}

%%

"auto" { printf("auto\t"); }
"break" { printf("break\t"); }
"case" { printf("case\t"); }
"char" { printf("char\t"); }
"const" { printf("const\t"); }
"continue" { printf("continue\t"); }
"default" { printf("default\t"); }
"do" { printf("do\t"); }
"double" { printf("double\t"); }
"else" { printf("else\t"); }
"enum" { printf("enum\t"); }
"extern" { printf("extern\t"); }
"float" { printf("float\t"); }
"for" { printf("for\t"); }
"goto" { printf("goto\t"); }
"if" { printf("if\t"); }
"inline" { printf("inline\t"); }
"int" { printf("int\t"); }
"long" { printf("long\t"); }
"printf" { printf("printf\t"); }
"register" { printf("register\t"); }
"restrict" { printf("restrict\t"); }
"return" { printf("return\t"); }
"short" { printf("short\t"); }
"signed" { printf("signed\t"); }
"sizeof" { printf("sizeof\t"); }
"static" { printf("static\t"); }
"struct" { printf("struct\t"); }
"switch" { printf("switch\t"); }
"typedef" { printf("typedef\t"); }
"union" { printf("union\t"); }
"unsigned" { printf("unsigned\t"); }
"void" { printf("void\t"); }
"volatile" { printf("volatile\t"); }
"while" { printf("while\t"); }
"+=" { printf("+=\t"); }
"-=" { printf("-=\t"); }
"*=" { printf("*=\t"); }
"/=" { printf("/=\t"); }
"%=" { printf("%=\t"); }
"&=" { printf("&=\t"); }
"^=" { printf("^=\t"); }
"|=" { printf("|=\t"); }
"++" { printf("++\t"); }
"--" { printf("--\t"); }
"->" { printf("->\t"); }
"&&" { printf("&&\t"); }
"||" { printf("||\t"); }
"<=" { printf("<=\t"); }
">=" { printf(">=\t"); }
"==" { printf("==\t"); }
"!=" { printf("!=\t"); }
"{" { printf("{\t"); }
"}" { printf("}\t"); }
"=" { printf("=\t"); }
"(" { printf("(\t"); }
")" { printf(")\t"); }
"[" { printf("[\t"); }
"]" { printf("]\t"); }
"<" { printf("<\t"); }
">" { printf(">\t"); }

%%

void main(int argc, char** argv)
{
if(argc != 2)
{
printf("Usage: %s filename\n", argv[0]);
exit(1);
}

char *filename = argv[1];
FILE *f = fopen(filename, "r");

if(f == NULL)
{
fprintf(stderr, "Unable to open %s\n", filename);
}
else
{
yylex();
}
}

最佳答案

Q1。您收到的警告来自这一行:

"%="            { printf("%=\t"); }

你想要:

"%="            { printf("%%=\t"); }

因为您需要转义“%”。

第二季度。要让 lex 读取给定文件,您需要使用 yyin - 请参阅 in lex how to make yyin point to a file with the main function in yacc?了解更多详情。

第三季度。您将需要使用正则表达式来匹配它们。请参阅https://www.cs.princeton.edu/~appel/modern/c/software/flex/flex.html例如。

关于c - 如何将 lex 与 C 源文件一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22106034/

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