如何使 c 字符串词法分析器示例工作?



以下 f/lex 代码来自其手册。但它不会自行运行。需要一些额外的代码才能使其运行。但是我不知道如何添加所需的额外代码。有人可以给我看吗?谢谢。

%x str
%%
char string_buf[MAX_STR_CONST];
char *string_buf_ptr;
"      string_buf_ptr = string_buf; BEGIN(str);
<str>" { /* saw closing quote - all done */
BEGIN(INITIAL);
*string_buf_ptr = '';
/* return string constant token type and
* value to parser
*/
}
<str>n {
/* error - unterminated string constant */
/* generate error message */
}
<str>\[0-7]{1,3} {
/* octal escape sequence */
int result;
(void) sscanf( yytext + 1, "%o", &result );
if ( result > 0xff )
/* error, constant is out-of-bounds */
*string_buf_ptr++ = result;
}
<str>\[0-9]+ {
/* generate error - bad escape sequence; something
* like '48' or '777777'
*/
}
<str>\n *string_buf_ptr++ = 'n';
<str>\t *string_buf_ptr++ = 't';
<str>\r *string_buf_ptr++ = 'r';
<str>\b *string_buf_ptr++ = 'b';
<str>\f *string_buf_ptr++ = 'f';
<str>\(.|n) *string_buf_ptr++ = yytext[1];
<str>[^\n"]+ {
char *yptr = yytext;
while ( *yptr ) *string_buf_ptr++ = *yptr++;
}

该代码片段中缺少:

  • 如何处理错误条件。

  • 返回到分析器的令牌类型,以及如何表示语义类型。

  • 测试固定长度的内部缓冲区是否已满。

第三个需要在每次作业后进行测试string_buffer_ptr,这可能会导致错误条件,因此它也回到上面的第一点。

基本上,这些完全取决于您的应用程序。您如何处理其他类型的错误?您是尝试恢复并继续解析,还是只是编写错误消息并放弃?您需要将这些错误的处理与其他错误处理保持一致。

传达结果的最可能代码是这样的:

BEGIN(INITIAL);
*string_buf_ptr = '';
/* return string constant token type and
* value to parser
*/
yylval.str = strdup(string_buf);
return STRING_LITERAL;

但是,当然,您需要将str替换为语义联合中char*的正确标记(假设您正在使用一个),并将return值替换为正确的令牌名称。您可能更喜欢使用mallocstrcpy而不是strdup,尽管有很多东西需要沙特,以确保您有一个备份定义strdup以防万一。

最新更新