parsing - 如何捕获没有引号字符的字符串

标签 parsing f# lexical-analysis fsyacc fslex

我试图在没有引号的情况下捕获带引号的字符串。我有这个终端

%token <string> STRING

和这个生产
constant:
    | QUOTE STRING QUOTE { String($2) }

连同这些词法分析器规则
| '\''       { QUOTE }
| [^ '\'']*  { STRING (lexeme lexbuf) } //final regex before eof

它似乎正在解释导致 QUOTE 的所有内容。作为单个词素,不解析。所以也许我的问题出在语法的其他地方——不确定。我会以正确的方式解决这个问题吗?在我尝试从字符串中排除引号之前,它解析得很好。

更新

我认为以下词法分析器规则可能存在一些歧义
let name = alpha (alpha | digit | '_')*
let identifier = name ('.' name)*

以下规则在 STRING 之前
| identifier    { ID (lexeme lexbuf) }

有没有办法消除这些歧义而不在 STRING 中包含引号?正则表达式?

最佳答案

在词法分析器中对字符串和数字文字等常量进行语义分析是很正常的,因此您可以考虑为字符串常量使用 lex 规则,例如

| '\'' [^ '\'']* '\'' 
    { STRING (let s = lexeme lexbuf in s.Substring(1, s.Length - 2)) }

关于parsing - 如何捕获没有引号字符的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8216412/

相关文章:

java - 在 Java 中将字符串解析为 Map

c# - 我应该如何用科学记数法(+301)解析一个非常大的数字?

f# - 获取具有特定值的数组元素的索引

regex - Haskell 中的正则表达式与词法分析器

python - 使用正则表达式在 Python 中分割句子

python - 是否有适用于 Python 的范围分析器?

java - 将日期格式化为特定格式

bash - 从 bash 脚本中的 URL 中提取文件名和路径

f# - 在F#中生成斐波那契数列

generics - 在 F# 中使用泛型创建 EnumArray 类型