antlr html pcdata

发布于 2024-12-21 20:49:46 字数 529 浏览 5 评论 0原文

我正在尝试使用 ANTLR 编写非常简单的 HTML 解析器,但我面临着问题,即 ~ 规则应该匹配所有内容,直到指定的字符不起作用。

我的词法分析器语法:

lexer grammar HtmlParserLexer;

HTML: OHTML PCDATA CHTML;

PCDATA :(~'<') ; //match all until <

OHTML: '<html>';

CHTML: '</html>';

我试图匹配:

<html>foo bar</html>

来自 Eclipse ANTLR 插件解释器的错误:

MismatchedTokenException: line 1:7 mismatched input UNKNOW expecting '<'

这意味着我的语法忽略了 PCDATA 规则,我不知道为什么。 预先感谢您的帮助。

Im trying to write very simple HTML parser with ANTLR and Im facing problem, that ~ rule which should match all until specified character is not working.

My lexer grammar:

lexer grammar HtmlParserLexer;

HTML: OHTML PCDATA CHTML;

PCDATA :(~'<') ; //match all until <

OHTML: '<html>';

CHTML: '</html>';

Im trying to match:

<html>foo bar</html>

Error from Eclipse ANTLR plugin Interpreter:

MismatchedTokenException: line 1:7 mismatched input UNKNOW expecting '<'

Which means, that my grammar ignore PCDATA rule and I dont know why.
Thanks in advance for your help.

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

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

发布评论

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

评论(1

深海里的那抹蓝 2024-12-28 20:49:46

规则 PCDATA :(~'<') ; 匹配 '<' 之外的单个字符。您需要重复一次或多次:PCDATA :(~'<')+ ;(注意 +)。

您可能还希望允许 之间没有任何内容)。在这种情况下,您不应将 PCDATA :(~'<')+ ; 更改为 PCDATA :(~'<')* ;,但应这样做相反:

HTML: OHTML PCDATA? CHTML;

PCDATA : (~'<')+ ;

因为您不应该创建可能与空字符串匹配的词法分析器规则。

The rule PCDATA :(~'<') ; matches a single character other than '<'. You'll need to repeat it once or more: PCDATA :(~'<')+ ; (notice the +).

You may also want to allow <html></html> (nothing in between<html> and </html>). In that case, you shouldn't change PCDATA :(~'<')+ ; into PCDATA :(~'<')* ;, but do this instead:

HTML: OHTML PCDATA? CHTML;

PCDATA : (~'<')+ ;

because you shouldn't create lexer rules that could potentially match an empty string.

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