C 如何为(f)lex编写自己的解析器?

C 如何为(f)lex编写自己的解析器?,c,parsing,yacc,lex,lexer,C,Parsing,Yacc,Lex,Lexer,我用flex生成了一个lexer [ \t\n\r\v] /* skip whitespace */ [_a-zA-Z]([_a-zA-Z]|[0-9])* printf("IDENT\n"); [0-9]+ printf("INTEGER\n"); [0-9]+\. printf("DOUBLE\n"); 现在我想用C编写自己的解析器,但我不知道如何从lexer中获取标记。我必须在调用yylex()时包含“lexer.c”吗?然后我必须返回枚举类

我用flex生成了一个lexer

[ \t\n\r\v]          /* skip whitespace */

[_a-zA-Z]([_a-zA-Z]|[0-9])*  printf("IDENT\n");
[0-9]+        printf("INTEGER\n");
[0-9]+\.      printf("DOUBLE\n");

现在我想用C编写自己的解析器,但我不知道如何从lexer中获取标记。我必须在调用yylex()时包含“lexer.c”吗?然后我必须返回枚举类型,而不是调用printf()。不使用bison/yacc的最好方法是什么?

您需要在完成之前扩展该语法,但是

  • 是的,您将用适当的
    return
    语句替换
    printf()
    语句
  • (或者,更可能/更好的是,保留print语句并添加return语句)
  • 您将在“
    {…}
    ”大括号中包装操作
  • <> LI>您需要考虑如何将令牌类型和令牌值传递回解析器。
标准方法是从Flex生成的函数
yylex()
返回令牌类型。有一个全局变量,
ylval
,可用于传递令牌值。您可以控制其类型。请注意,在此过程中,您需要指定令牌编号(令牌类型)。它可以是一个枚举或一系列的
#定义
。通常,信息由解析器提供给词法分析器。也就是说,Yacc提供了一个它希望使用的令牌编号列表,Flex使用这些编号(或者更准确地说,您可以在Flex生成的代码的return语句中使用这些编号)


要将标记从lexer获取到解析器,必须调用
yylex()
;您通常会将其与解析器分开编译,但如果您真的愿意,您可能会将其生成的源代码包含到解析器文件中。

对于这些工具的GNU版本,难道没有很好的免费GNU文档吗?我很确定还有一本奥莱利的书,可能有在线版本。(我把这篇文章作为一个评论而不是一个答案,因为我现在没有参考资料,但我似乎记得看到过它们。)