Dan*_*iel 4 f# parsing lexical-analysis fsyacc fslex
我试图捕获没有引号的引用字符串.我有这个终端
%token <string> STRING
Run Code Online (Sandbox Code Playgroud)
而这个生产
constant:
| QUOTE STRING QUOTE { String($2) }
Run Code Online (Sandbox Code Playgroud)
以及这些词法规则
| '\'' { QUOTE }
| [^ '\'']* { STRING (lexeme lexbuf) } //final regex before eof
Run Code Online (Sandbox Code Playgroud)
它似乎正在解释导致QUOTE单个词汇的所有内容,而不是解析.所以也许我的问题在语法的其他地方 - 不确定.我是以正确的方式来做这件事的吗?在我尝试从字符串中排除引号之前,它解析得很好.
我认为以下词法分析器规则可能存在一些含糊之处
let name = alpha (alpha | digit | '_')*
let identifier = name ('.' name)*
Run Code Online (Sandbox Code Playgroud)
之前的规则如下 STRING
| identifier { ID (lexeme lexbuf) }
Run Code Online (Sandbox Code Playgroud)
有没有办法消除这些歧义,而不包括STRING正则表达式中的引号?
在词法分析器中对字符串和数字文字等常量进行语义分析是很正常的,所以你可以考虑像你的字符串常量那样的lex规则
| '\'' [^ '\'']* '\''
{ STRING (let s = lexeme lexbuf in s.Substring(1, s.Length - 2)) }
Run Code Online (Sandbox Code Playgroud)