我试图在没有引号的情况下捕获带引号的字符串。我有这个终端
%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/