代码的上下文敏感标记化
context sensitive tokenization of code
我正在为一种语言开发解析器
标识符(例如,一个字母后跟多个字母数字字符或下划线),
整数(任意数量的数字和可能的插入符 ^
),
一些运算符,
文件名(一些字母数字字符,可能还有斜杠和点)
显然文件名与整数和标识符重叠,所以通常我无法确定我是否有文件名或标识符,除非文件名包含斜杠或点。
但是文件名只能跟在特定的运算符后面。
我的问题是在标记化过程中通常如何处理这种情况?我有一个 table 驱动的分词器(词法分析器),但我不确定如何从整数或标识符中区分文件名。这是怎么做到的?
如果文件名是整数和标识符的超集,那么我可能会有可以处理它的语法产生式,但是标记重叠...
Flex 和其他词法分析器有start conditions 的概念。本质上,词法分析器是一个状态机,它的确切行为将取决于它的当前状态。
在您的示例中,当您的词法分析器遇到文件名前面的运算符时,它应该切换到 FilenameMode
状态(或其他状态),然后在生成它期望的文件名标记后切换回来。
编辑:
只是为了在超链接这一边给出一些具体代码:
当你遇到操作员时你会触发你的FILENAME_MODE
...
{FILENAME_PREFIX} { BEGIN(FILENAME_MODE); }
您将定义解析文件名的规则:
<FILENAME_MODE>{FILENAME_CHARS}+ { BEGIN(INITIAL); }
...在动作中切换回INITIAL
状态
我正在为一种语言开发解析器
标识符(例如,一个字母后跟多个字母数字字符或下划线),
整数(任意数量的数字和可能的插入符
^
),一些运算符,
文件名(一些字母数字字符,可能还有斜杠和点)
显然文件名与整数和标识符重叠,所以通常我无法确定我是否有文件名或标识符,除非文件名包含斜杠或点。
但是文件名只能跟在特定的运算符后面。
我的问题是在标记化过程中通常如何处理这种情况?我有一个 table 驱动的分词器(词法分析器),但我不确定如何从整数或标识符中区分文件名。这是怎么做到的?
如果文件名是整数和标识符的超集,那么我可能会有可以处理它的语法产生式,但是标记重叠...
Flex 和其他词法分析器有start conditions 的概念。本质上,词法分析器是一个状态机,它的确切行为将取决于它的当前状态。
在您的示例中,当您的词法分析器遇到文件名前面的运算符时,它应该切换到 FilenameMode
状态(或其他状态),然后在生成它期望的文件名标记后切换回来。
编辑:
只是为了在超链接这一边给出一些具体代码:
当你遇到操作员时你会触发你的FILENAME_MODE
...
{FILENAME_PREFIX} { BEGIN(FILENAME_MODE); }
您将定义解析文件名的规则:
<FILENAME_MODE>{FILENAME_CHARS}+ { BEGIN(INITIAL); }
...在动作中切换回INITIAL
状态