代码之家  ›  专栏  ›  技术社区  ›  Akusete

分离flex中的保留标识符

  •  0
  • Akusete  · 技术社区  · 15 年前

    我有一种语言,我正在做一个包含函数调用的解析器。一些函数名是保留的,我希望在语法中以不同的方式处理它们。在ebnf中,它看起来像

    FunctionCall ::= FunctionName '(' ')'
    SpecialFunctionCall :: SpecialName '(' ')'
    
    FunctionName ::= VariableName - SpecialFunctionName
    
    SpecialFunctionName ::= "special_function_a" | "special_function_b"
    

    我的问题是翻译 例外 来自的运算符 EBNF 弯曲。

    FunctionName    {Letter}{LetterOrDigit}
    

    是一组超级 特殊功能名称 ,这是一个硬编码字符串

    SpecialFunctionName   "special_function_a" | "special_function_b"
    

    所以我得到了野牛的警告说 特殊功能 永远不会匹配。我应该合并标记并比较解析器中的字符串,还是有一种在flex中解决这种歧义的推荐方法?

    2 回复  |  直到 13 年前
        1
  •  3
  •   Jonathan Leffler    15 年前

    处理这种情况的正常方法是让词汇分析器识别特殊名称,并为特殊名称返回正确的令牌类型(特殊名称),为其他令牌返回常规标识符令牌(显然是函数名)。

    然而,它通常需要词法分析器有一种不适当的预见性,即一个特定的(非保留的、非特殊的)单词是一个函数名,而不是一个简单的标识符(也可能是一个简单的变量),除非你已经走上了使用sigil的Perl路线。从函数中识别变量)。

        2
  •  0
  •   Chris Dodd    13 年前

    只要你把 SpecialFunction lexer文件中的第一个规则:

    {SpecialFunctionName}    { return SpecialName; }
    {FunctionName}           { return FunctionName; }
    

    匹配这两种模式的任何标识符都将触发第一个规则,从而返回 SpecialName 而不是 FunctionName .

    推荐文章