我正在为我创建的标记语言编写一个解析器(用python编写,但这与这个问题并不相关-实际上,如果这似乎是一个坏主意,我希望有一个更好的建议) 。
我在这里了解有关解析器的信息:http : //www.ferg.org/parsing/index.html,并且我正在编写词法分析器,如果我理解正确的话,应将内容拆分为标记。我无法理解的是我应该使用哪种令牌类型或如何创建它们。例如,我链接到的示例中的令牌类型为:
- 串
- 识别码
- 数
- 白空间
- 评论
- 紧急行动
- 许多符号,例如{和(算作自己的标记类型
我遇到的问题是,更通用的令牌类型对我来说似乎有些武断。例如,为什么要STRING自己使用单独的令牌类型,而不要使用IDENTIFIER。字符串可以表示为STRING_START +(IDENTIFIER | WHITESPACE)+ STRING_START。
这也可能与我的语言困难有关。例如,变量声明编写为,{var-name var value}
并使用进行部署{var-name}
。看起来'{'
并且'}'
应该是它们自己的令牌,但是VAR_NAME和VAR_VALUE是否符合令牌类型,或者这两者都属于IDENTIFIER吗?而且,VAR_VALUE实际上可以包含空格。after后面的空格var-name
用于表示声明中值的开始。其他任何空格都是该值的一部分。这个空格会成为自己的令牌吗?在这种情况下,空白仅具有该含义。而且,{
可能不是变量声明的开始..它取决于上下文(再次有该词!)。 {:
开始一个名称声明,然后{
甚至可以用作某些价值的一部分。
我的语言与Python类似,因为代码块是使用缩进创建的。我正在阅读有关Python如何使用词法分析器创建INDENT和DEDENT令牌的信息(它们或多或少的作用{
以及}
在许多其他语言中的作用)。Python声称是无上下文的,这对我来说意味着,至少词法分析器在创建令牌时不必关心它在流中的位置。Python的词法分析器如何在不知道先前字符的情况下就知道要构建特定长度的INDENT令牌(例如,上一行是换行符,因此开始为INDENT创建空间)?我问,因为我也需要知道这一点。
我的最后一个问题是最愚蠢的问题:为什么一个词法分析器甚至是必要的?在我看来,解析器可以逐个字符地找出它在哪里以及它期望什么。词法分析器是否增加了简单性的好处?