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

Parsing 使用Flex/Bison解析下划线分隔的值,parsing,bison,yacc,lex,flex-lexer,Parsing,Bison,Yacc,Lex,Flex Lexer,我想解析一些输入,主要是数字,为了用户可读性,可以使用下划线(3;)分隔这些输入 前 1_0001_000->1000100 000\u 000\u 111->000000 111 我将如何设置我的flex/yacc来做到这一点?这里有一个可能的flex答案(在C中): 数字[0-9] %% {DIGIT}+(“{DIGIT}+*{int numUnderscores=0; 对于(int i=0;i

我想解析一些输入,主要是数字,为了用户可读性,可以使用下划线(3;)分隔这些输入

  • 1_0001_000->1000100
  • 000\u 000\u 111->000000 111

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

这里有一个可能的flex答案(在C中):

数字[0-9]
%%
{DIGIT}+(“{DIGIT}+*{int numUnderscores=0;
对于(int i=0;i
  • 如果知道数字的最大大小,可以使用静态大小的数组,而不是动态为字符串分配空间
  • 如前所述,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;
                       }
数字[0-9]
%%
{DIGIT}+(“{DIGIT}+*{int number=0;
对于(int i=0;i

只是要确保检查溢出

你不需要bison或yacc,或者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;
                       }