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

时间:2010-11-24 20:58:58

标签: c parsing yacc lex lexer

我用flex生成了词法分析器。

[ \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.c”包含在yylex()中?然后我必须返回枚举类型而不是调用printf()。如果不使用bison / yacc,最好​​的方法是什么?

1 个答案:

答案 0 :(得分:1)

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

  • 是的,您将使用适当的printf()语句
  • 替换return语句
  • (或者,更可能/更好,保留print语句并添加return语句)。
  • 您将在“{ ... }”括号中包含操作。
  • 您需要考虑如何将令牌类型和令牌值传递回解析器。

标准方法是从yylex()返回令牌类型 - Flex生成的函数。有一个全局变量ylval,可用于传递令牌值。您可以控制其类型。请注意,在此过程中的某处,您需要指定令牌编号(令牌类型)。这可以是枚举或一系列#defines。传统上,解析器将信息提供给词法分析器。也就是说,Yacc提供了它期望使用的令牌编号列表,Flex使用这些编号(或者更准确地说,您在Flex生成的代码中的return语句中使用这些编号)。

要将词法分析器从词法分析器获取到解析器,您必须调用yylex();你通常会从解析器中单独编译它,但如果你真的想要,你可能可以将它生成的源包含在你的解析器文件中。

相关问题