我用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,最好的方法是什么?
答案 0 :(得分:1)
在完成之前,您需要扩展该语法,但是......
printf()
语句return
语句
{ ... }
”括号中包含操作。标准方法是从yylex()
返回令牌类型 - Flex生成的函数。有一个全局变量ylval
,可用于传递令牌值。您可以控制其类型。请注意,在此过程中的某处,您需要指定令牌编号(令牌类型)。这可以是枚举或一系列#defines
。传统上,解析器将信息提供给词法分析器。也就是说,Yacc提供了它期望使用的令牌编号列表,Flex使用这些编号(或者更准确地说,您在Flex生成的代码中的return语句中使用这些编号)。
要将词法分析器从词法分析器获取到解析器,您必须调用yylex()
;你通常会从解析器中单独编译它,但如果你真的想要,你可能可以将它生成的源包含在你的解析器文件中。