【问题标题】:How to edit this html lexer rule?如何编辑此 html 词法分析器规则?
【发布时间】:2020-11-27 21:34:37
【问题描述】:

我想编辑这个 HTML 词法分析器规则,我需要正则表达式方面的帮助 TAG_NAME 指的是任何 HTML 属性,例如:(必需、类、id 等...)。 我想对其进行编辑以使其不接受这种确切的语法:'az-'。 我认为这需要修改正则表达式,我查了一下,但我无法将我在网上找到的内容与这些规则的编写方式相结合。 我第一次尝试删除 Tag_NameChar 中的“-”,但这使得 HTML 无法识别“data-target”等属性。

这个sn-p是为了规则:

这个展示了如何识别属性。

【问题讨论】:

  • " 我想编辑它以使其不接受这个确切的语法:'az-'" 这是否意味着你特别不想允许确切的标签名称az-,但是说ab- 可以吗?或者您不想接受任何以破折号结尾的名称?或者由两个字母后跟一个破折号组成的任何名称?或者是其他东西? “我无法将我在网上找到的内容与这些规则的编写方式相结合”你在网上找到了什么?
  • ab- 没问题 我希望完全排除 az- 我正在使用 antlr4 我发现这个正则表达式: (?![enp])[a-z] 只排除我想要的 a-z 中的字母排除整个字符串
  • stackoverflow.com/questions/65044060/… 这是我找到的链接

标签: html regex compiler-construction tokenize lexer


【解决方案1】:

ANTLR 不像某些正则表达式引擎那样支持前瞻语法,因此没有简单的方法可以从正则表达式中排除某些匹配项。 可能重写正则表达式以排除给定的字符串(正则表达式在否定和交集下是封闭的),但它通常最终会很痛苦。在您的情况下,您最终会得到遵循“标签名称可以少于 3 个字符,多于 3 个字符,或者它可以包含三个字符,其中第一个不是 'a', second 不是 'z' 或 last 不是 '-'"。

如果标签名称的文本等于az-,则使用返回false 的谓词是不那么痛苦但也少跨语言的解决方案。所以像{getText().equals("az-")}? 这样的东西取决于语言。

如果您同意引入额外的词法分析器规则,您还可以引入与 az- 完全匹配且在 TAG_NAME 之前定义的规则 INVALID_TAG_NAME(或任何您想调用的名称)。这样,任何完全命名为 az- 的标签都会生成 INVALID_TAG_NAME 令牌而不是 TAG_NAME 令牌。

根据您的要求,您也可以完全保持语法不变,当您在侦听器或访问者中遍历树时看到名为 az- 的标记时,只会产生错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 2012-03-04
    • 2019-05-07
    相关资源
    最近更新 更多