gpt4 book ai didi

f# - FParsec 标识符与关键字

转载 作者:行者123 更新时间:2023-12-05 00:35:07 26 4
gpt4 key购买 nike

对于带有关键字的语言,需要发生一些特殊的技巧以防止例如“if”被解释为标识符和“ifSomeVariableName”在 token 流中成为关键字“if”后跟标识符“SomeVariableName”。

对于递归下降和 Lex/Yacc,我只是采用了在词法分析器和解析器之间转换标记流的方法(根据有用的指令)。

但是,FParsec 似乎并没有真正执行单独的词法分析器步骤,所以我想知道处理这个问题的最佳方法是什么。说起来,好像 Haskell 的 Parsec 支持词法分析层,而 FParsec 不支持?

最佳答案

我想,这个问题很简单。答案是你必须:

  • 解析整个单词( [a-z]+ ),仅小写;
  • 检查它是否属于字典;如果是,返回 keyword ;否则,解析器将回退;
  • 解析 identifier分别地;

  • 例如。 (只是一个假设的代码,未经测试):
    let keyWordSet =
    System.Collections.Generic.HashSet<_>(
    [|"while"; "begin"; "end"; "do"; "if"; "then"; "else"; "print"|]
    )
    let pKeyword =
    (many1Satisfy isLower .>> nonAlphaNumeric) // [a-z]+
    >>= (fun s -> if keyWordSet.Contains(s) then (preturn x) else fail "not a keyword")

    let pContent =
    pLineComment <|> pOperator <|> pNumeral <|> pKeyword <|> pIdentifier

    上面的代码将解析关键字或标识符两次。要修复它,或者,您可以:
  • 解析整个单词( [a-z][A-Z]+[a-z][A-Z][0-9]+ ),例如一切字母数字;
  • 检查它是关键字还是标识符(小写并属于字典)以及
  • 返回关键字
  • 返回标识符

  • 附言不要忘记首先订购“更便宜”的解析器,如果它不会破坏逻辑。

    关于f# - FParsec 标识符与关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9763942/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com