如何用两个新标记替换词法分析器标记?

发布于 2025-01-09 04:13:54 字数 842 浏览 0 评论 0原文

在 XML 中,空元素可以用以下任一方式表示:

<foo></foo>
<foo/>

如果输入包含后者,那么我想像前者一样对其进行标记。

也就是说,如果输入是 那么我希望词法分析器生成这个 (token kind, token value) 对序列:

('<', '<')
("foo", STAG)
('>', '>')
("</foo>", ETAG)

我尝试了这个(其中 是独占状态,st 是保存元素名称的全局变量,在本例中为 "foo") :

<START_TAG>{
   "/>"    { yytext = ">";
             return(">");
             yytext = strcat(strcat("<", st), ">");
             yyval.strval = strdup(yytext);
             yy_pop_state();
             return(ETAG); 
           }
}

但它不起作用。

本质上,我希望词法分析器用以下两个标记替换此标记 "/>"">""".我该怎么做?

In XML an empty element can be represented in either of these ways:

<foo></foo>
<foo/>

If the input contains the latter, then I want to tokenize it like the former.

That is, if the input is <foo/> then I want the lexer to generate this sequence of (token kind, token value) pairs:

('<', '<')
("foo", STAG)
('>', '>')
("</foo>", ETAG)

I tried this (where <START_TAG> is an exclusive state and st is a global variable holding the element name, which is "foo" in this example):

<START_TAG>{
   "/>"    { yytext = ">";
             return(">");
             yytext = strcat(strcat("<", st), ">");
             yyval.strval = strdup(yytext);
             yy_pop_state();
             return(ETAG); 
           }
}

but it doesn't work.

Essentially I want the lexer to replace this token "/>" with these two tokens: ">" and "</foo>". How do I do that?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

‘画卷フ 2025-01-16 04:13:54

在返回语句 return(">"); 之后,您不会执行任何其他操作。

另外,用 yytext = ">"; 更改内部变量 yytext 从来都不是一个好主意。首先strdup(yytext),然后在新指针中更改您需要的任何内容。

After the returning statement return(">"); you don't execute anything else.

Also, changing the internal variable yytext with yytext = ">"; is never a good idea. First strdup(yytext) and then change anything you need in the new pointer.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文