【问题标题】:Is it possible to parse a string of fixed length in yacc/lex?是否可以在 yacc/lex 中解析固定长度的字符串?
【发布时间】:2014-05-23 00:35:29
【问题描述】:

我有一个类似这样的文件格式

...
{string_length} {binary_string}
...

示例:

...
10 abcdefghij
...

是否可以使用 lexer/yacc 进行解析?字符串没有空终止符,所以我不知道如何标记它。

我目前正在为此使用 ply 的词法分析器和 yacc

【问题讨论】:

  • “字符串没有空终止符”,那么输入文件中j 之后的下一个字符是什么?你的输入文件是二进制文件吗?
  • @LeeDuhem 下一个字符是另一个节点的开始,大小为:二进制字符串

标签: parsing yacc lexer


【解决方案1】:

你不能用正则表达式来做到这一点,但你当然可以提取词位。您没有具体说明长度是如何终止的;在这里,我假设它由一个空格字符终止。我还假设yylval 有一些合适的struct 类型:

[[:digit:]]+" "  { unsigned long len = atol(yytext);
                   yylval.str = malloc(len);
                   yylval.len = len;
                   for (char *p = yylval.str; len; --len, ++p) {
                     int ch = input();
                     if (ch == EOF) { /* handle the lexical error */ }
                     *p = ch;
                   }
                   return BINARY_STRING;
                 }

还有其他解决方案(例如计数的开始条件和状态变量),但我认为上面是最简单的。

【讨论】:

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