【问题标题】:Using Flex/Bison to parse underscore delimited value使用 Flex/Bison 解析下划线分隔值
【发布时间】:2013-12-17 22:38:10
【问题描述】:

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

例如

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

我将如何设置我的 flex/yacc 来做到这一点?

【问题讨论】:

  • 你不需要 bison 或 yacc 来做这个,或者真的是 flex。一个简单的正则表达式就可以了。

标签: parsing bison yacc lex flex-lexer


【解决方案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;
                       }

一定要检查溢出!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多