2

我用 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 编写自己的解析器,但我不知道如何从词法分析器中获取标记。我必须在调用 yylex() 中包含“lexer.c”吗?然后我必须返回枚举类型而不是调用 printf()。不使用 bison/yacc 的最佳方法是什么?

4

1 回答 1

1

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

  • 是的,您将printf()用适当的语句替换这些return语句
  • (或者,更有可能/更好,保留打印语句并添加返回语句)。
  • 您将把动作包装在 ' { ... }' 大括号中。
  • 您将需要考虑如何将令牌类型和令牌值传回解析器。

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

要将令牌从词法分析器获取到解析器,您必须调用yylex(); 您通常将其与解析器分开编译,但如果您真的想要,您可能可以将其生成的源代码包含到您的解析器文件中。

于 2010-11-25T00:17:06.933 回答