使用Flex / Bison来解析下划线分隔值

时间:2013-12-17 22:38:10

标签: parsing bison yacc lex flex-lexer

我想解析一些输入,主要是数字,可以使用下划线(_)分隔,以提高用户的可读性。

实施例

  • 1_0001_000 - > 1000100
  • 000_000_111 - > 000000111

我如何设置我的flex / yacc呢?

1 个答案:

答案 0 :(得分:1)

这是一个潜在的灵活答案(在C中):

DIGIT    [0-9]
%%
{DIGIT}+("_"{DIGIT}+)* {  int numUnderscores = 0;
                          for(int i = 0; i < yyleng; i++)
                            if(yytext[i] == '_')
                              numUnderscores++;
                          int stringLength = yyleng - numUnderscores + 1;
                          char *string = (char*) malloc(sizeof(char) * stringLength);
                          /* be sure to check and ensure string isn't NULL */
                          int pos = 0;
                          for(int i = 0; i < yyleng; i++) {
                            if(yytext[i] != '_') {
                              string[pos] = yytext[i];
                              pos++;
                            }
                          }
                          return string;
                       }
  • 如果您知道数字的最大大小,则可以使用静态大小的数组,而不是为字符串动态分配空间。
  • 如前所述,flex不是解决此问题的最有效工具。如果这个问题是一个更大问题(如语言语法)的一部分,那么继续使用flex。否则,有更多有效的方法来处理这个问题。

如果您只需要数字字符串,请尝试:

DIGIT    [0-9]
%%
{DIGIT}+("_"{DIGIT}+)* {  int number = 0;
                          for(int i = 0; i < yyleng; i++)
                            if(yytext[i] != '_')
                              number = (number*10) + (yytext[i]-'0');
                          return number;
                       }

请务必检查是否有溢出!