Compiler construction 如何使用lex和yacc阅读单词?

Compiler construction 如何使用lex和yacc阅读单词?,compiler-construction,bison,yacc,lex,Compiler Construction,Bison,Yacc,Lex,我已经编写了一个程序,使用lex和yacc读取文本文件的数据。我想比较文本文件上的“State”,然后检索单词。 我使用了下面的代码。但它给出了该文本文件中的所有文本。请帮助 [0-9a-zA-Z]*"\n" { if (strcmp("State: ",yytext)!=0) { printf(yytext,"\n");} } 您最好更正确地定义标记解析和语法,以便通过构建AST获得您想要的值,然后您可以处理您的值: lexer.l: "State" { return STATE;

我已经编写了一个程序,使用lex和yacc读取文本文件的数据。我想比较文本文件上的“State”,然后检索单词。 我使用了下面的代码。但它给出了该文本文件中的所有文本。请帮助

[0-9a-zA-Z]*"\n" { if (strcmp("State: ",yytext)!=0)
{
printf(yytext,"\n");}
}

您最好更正确地定义标记解析和语法,以便通过构建AST获得您想要的值,然后您可以处理您的值:

lexer.l:

"State" {
    return STATE;
}

[0-9a-zA-Z]* {
    return STATE_VALUE;
}
parser.y:

%token STATE
%token STATE_VALUE
%left ':'

state_command: STATE ':' STATE_VALUE {
    // do stuff here
}
当然,这还远远不够完整,但这只是给你一个想法。你真的应该读一读龙之书:和


您还可以找到一些简单的示例,这些示例可以帮助您构建编译器:或者

您的代码打印所有不等于“State:”的内容。那是你的意图吗?注意:如果您已经在使用lex/flex,则不需要strcmp()。我需要在“State:”之后打印单词。我的文本文件是State:Drive State:park。我认为产品应该是
State\u命令:State':'State\u VALUE