以下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 = '\0';
/* 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 '\0777777'
*/
}
<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++;
}
答案 0 :(得分:0)
缺少该代码段:
如何处理错误条件。
哪种令牌类型返回到解析器,以及如何表示语义类型。
测试以查看固定长度的内部缓冲区是否已满。
在通过string_buffer_ptr
进行的每次分配之后,第三个人将需要进行测试,这可能会导致错误状态,因此它也可以回到上面的第一点。
基本上,这些完全取决于您的应用程序。您如何处理其他类型的错误?您是尝试恢复并继续进行解析还是只是写一条错误消息并放弃?您需要将这些错误的处理与其他错误处理保持一致。
传达结果的最可能代码如下:
BEGIN(INITIAL);
*string_buf_ptr = '\0';
/* return string constant token type and
* value to parser
*/
yylval.str = strdup(string_buf);
return STRING_LITERAL;
但是,当然,您需要在语义联盟中用str
的正确标签替换char*
(假设您使用的是一个),并用{正确的令牌名称。并且您可能更愿意使用return
和malloc
而不是strcpy
,尽管要确保您拥有strdup
的备用定义还有很多困难,需要一个。