关于解析:使用Flex/Bison解析下划线分隔的值

Using Flex/Bison to parse underscore delimited value

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

例如

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

我将如何设置我的 flex/yacc 来这样做?


这是一个潜在的弹性答案(用 C 语言):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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。否则,有许多更有效的方法来处理这个问题。

如果你只需要数字字符串,试试这个:

1
2
3
4
5
6
7
8
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;
                       }

一定要检查溢出!