【问题标题】:context sensitive tokenization of code代码的上下文敏感标记化
【发布时间】:2015-11-15 15:27:21
【问题描述】:

我正在开发一种语言的解析器

  • 标识符(例如,一个字母后跟多个字母数字字符或下划线),

  • 整数(任意位数,可能还有插入符号^),

  • 一些运算符,

  • 文件名(一些字母数字字符,可能还有斜线和点)

显然文件名与整数和标识符重叠,所以通常我无法确定我是否有文件名或标识符,除非文件名包含斜杠或点。

但文件名只能跟随特定的运算符。

我的问题是在标记化过程中通常如何处理这种情况?我有一个表驱动的标记器(词法分析器),但我不确定如何从整数或标识符中区分文件名。这是怎么做到的?

如果文件名是整数和标识符的超集,那么我可能有可以处理它的语法产生式,但是标记重叠......

【问题讨论】:

  • 我个人不会使用分词器。

标签: parsing token tokenize formal-languages


【解决方案1】:

Flex 和其他词法分析器有start conditions 的概念。词法分析器本质上是一个状态机,它的确切行为将取决于它的当前状态。

在您的示例中,当您的词法分析器遇到文件名前面的运算符时,它应该切换到 FilenameMode 状态(或其他状态),然后在生成它所期望的文件名令牌后切换回来。

编辑:

只是在超链接的这一边给出一些具体的代码:

遇到运营商会触发FILENAME_MODE...

{FILENAME_PREFIX} { BEGIN(FILENAME_MODE); }

你可以定义你的规则来解析一个文件名:

<FILENAME_MODE>{FILENAME_CHARS}+ { BEGIN(INITIAL); }

...在操作中切换回INITIAL 状态。

【讨论】:

    猜你喜欢
    • 2019-01-12
    • 1970-01-01
    • 2015-12-09
    • 2014-01-12
    • 1970-01-01
    • 2022-07-08
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多