4

我正在尝试捕获没有引号的带引号的字符串。我有这个终端

%token <string> STRING

而这个制作

constant:
    | QUOTE STRING QUOTE { String($2) }

连同这些词法分析器规则

| '\''       { QUOTE }
| [^ '\'']*  { STRING (lexeme lexbuf) } //final regex before eof

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

更新

我认为以下词法分析器规则可能存在一些歧义

let name = alpha (alpha | digit | '_')*
let identifier = name ('.' name)*

以下规则先于STRING

| identifier    { ID (lexeme lexbuf) }

有没有办法在不包括STRING正则表达式的引号的情况下消除这些歧义?

4

3 回答 3

5

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

| '\'' [^ '\'']* '\'' 
    { STRING (let s = lexeme lexbuf in s.Substring(1, s.Length - 2)) }
于 2011-11-21T21:33:39.777 回答
1

您可以使用带引号的词素,但在解析器中修剪引号

词法分析器:

let constant       = ("'" ([^ '\''])* "'")
...
| constant         { STRING(lexeme lexbuf) } 

解析器:

%token <string> STRING

...
constant:
    | STRING { ($1).Trim([|'''|]) }

或者,如果您想从字符串中提取引号:

词法分析器:

let name = alpha (alpha | digit | '_')*
let identifier = name ('.' name)*
...

| '\''       { QUOTE }
| identifier { ID (lexeme lexbuf) }
| _          { STRING (lexeme lexbuf) } 

identifier将从 STRING 中删除符号,因此您的词位流可以像:QUOTE ID STRING ID .. QUOTE,您必须在解析器中处理它:

解析器:

constant:
     | QUOTE content QUOTE     { String($2) }

content:
     | ID content      { $1+$2 }
     | STRING content  { $1+$2 }
     | ID              { $1 }
     | STRING          { $1 }
于 2011-11-21T19:21:28.830 回答
0

我有一个类似的问题。我使用状态将它们捕获在“lexic.l”文件中。 这是我的自动回复

于 2014-01-10T10:42:05.753 回答