-1

我必须用 flex 编写一个编译器。

但我不喜欢给定的代码,想要做我自己。

lexfile.l:

{%
    typedef enum { EQ=0, NE, PLUS, MINUS, SEMICOLON } punctuationType;
    typedef enum { PRINT=100, WHILE, IDENT } keywordType;
%}

%%
    "!="                            {   return NEQ; }
    "="                             {   return EQ; }
    "+"                             {   return PLUS; }
    "-"                             {   return MINUS; }
    ";"                             {   return SEMICOLON; }

%%

有更好的解决方案吗?

我已经搜索了一个解决方案,但另一个解决方案是定义常量。

#define EQ 0
#define NE 1
...

输出示例:

 Operator  EQ
 Operator  NE

问题只是,如果有更好的类型而不是 Enum

4

1 回答 1

1

无论您返回什么,编译器都必须理解。如果您正在使用yacc,,您将没有选择:您必须遵守%token为您定义的任何生成,因为y.tab.h.:您根本不需要做任何事情。

另一方面,flex对于单字符特殊字符,不需要名称或规则:您可以只为所有这些字符返回并在文件yytext[0]中使用相应的文字。.y

您确实没有提供足够的详细信息以供进一步评论。

于 2013-04-11T08:52:36.837 回答