Html lexer应该区分不同类型的字符串标记吗?

Html lexer应该区分不同类型的字符串标记吗?,html,parsing,token,lexer,transpiler,Html,Parsing,Token,Lexer,Transpiler,我正在编写一种类似翡翠的语言,可以转换成html。以下是标记定义的外观: section #mainWrapper .container 这将传递给: <section id="mainWrapper" class="container"> 然后解析器将它们组装成一棵树 或者lexer应该非常原始,只返回匹配的字符串,然后解析器负责区分它们 [ {type: 'name', value: 'section'}, {type: 'name', value: '#ma

我正在编写一种类似翡翠的语言,可以转换成html。以下是标记定义的外观:

section #mainWrapper .container
这将传递给:

<section id="mainWrapper" class="container">
然后解析器将它们组装成一棵树

或者lexer应该非常原始,只返回匹配的字符串,然后解析器负责区分它们

[
    {type: 'name', value: 'section'},
    {type: 'name', value: '#mainWrapper'},
    {type: 'name', value: '.container'}
]

根据经验,标记器不应该解析,解析器不应该标记化

在这个具体的例子中,在我看来,像token这样的名字的每一个简单的使用——比如section——都不可能是一个标签。由于其语法上下文,节更可能是一个标记。如果tokeniser试图将其标记为标记,那么tokeniser将跟踪语法上下文,这意味着它正在解析

符号。而且不那么清晰。你可以考虑它们是单字符标记,语法会坚持一个名字,或者你会认为它们是一种特殊类型的字符串的第一个字符。有些事情可能会左右你:

这个符号可以用空格与下面的名称分开吗?主包装器。如果是这样的话,这个符号可能是一个标记

类或id的词法形式与名称不同吗?例如,考虑特殊字符的使用。如果你不能准确地识别这个对象,而不知道它前面有什么符号,那么最好把它看作一个标记

还有其他表示类名的方法吗。例如,如何表示多个类?我脑海中浮现出一些可能性:

#classA #classB
#(classA classB)
#"classA classB"
class = "classA classB"
如果第一个选项以外的任何选项有效,您可能只需要制作一个令牌。但正确处理带引号的字符串可能会带来其他挑战。特别是,它可能需要重新输入字符串文本的内容,这违反了解析器不应该标记的启发式规则。幸运的是,这些不是绝对的规则;复述有时是必要的。但要把它控制在最低限度

词法分析和句法分析的分离不应该是一件难事。它是一种代码组织技术,旨在使各个部分更易于编写、理解、调试和记录。通常但并非总是这样,分隔使您的语言的用户更容易理解语法,这一点也很重要。但这并不适用于每项解析任务,精确的边界是灵活的,但不是多孔的:您可以将边界放在最方便的位置,但一旦放置好,就不要试图将东西从裂缝中挤出去


如果您发现这种关注点分离对您的项目来说太困难,您应该重新考虑您的语言设计,或者尝试无扫描解析。

谢谢,我坚持将sigil和字符串作为一个名称处理。所以如果我理解正确的话,给定一个param=value对,我应该把param和value当作名称,=当作一个特殊的字符标记,对吗?可能有空间inbetween@mateusz:是的,基本上。我希望属性值编号、列表、带引号的字符串、甚至表达式还有其他可能,但理想情况下,标记器只需生成标记,并让解析器解决。
#classA #classB
#(classA classB)
#"classA classB"
class = "classA classB"