如何return Flex 中令牌的最短匹配?
How to return the shortest match for a token in Flex?
我正在为 Python 2.7 编写词法分析器。我对长字符串项的正则表达式有疑问。这是我为这种字符串编写的代码:
ESCAPESEQ \\x
SHORTSTRINGITEM {SHORTSTRINGCHAR}|{ESCAPESEQ}
SHORTSTRING (\'{SHORTSTRINGITEM}*\')|(\"{SHORTSTRINGITEM}*\")
LONGSTRINGCHAR [^\(\'\'\')(\"\"\")]
LONGSTRINGITEM {LONGSTRINGCHAR}|{ESCAPESEQ}
LONGSTRING (\'\'\'{LONGSTRINGITEM}*\'\'\')|(\"\"\"{LONGSTRINGITEM}*\"\"\")
LONGSTRINGLITERAL {STRINGPREFIX}?{LONGSTRING}
如果我分析一个 Python 代码,它有两个与其他标记分开的长字符串,我的分析器 return 将这两个长字符串和它们之间的代码作为标记。那是因为 Flex 尝试 return 最长的匹配。但是我想 return 仅针对此令牌长字符串进行最短匹配。
谢谢你的回答。
尝试这样定义它:
DOCUMENTACION_D \"\"\"
DOCUMENTACION {DOCUMENTACION_D}([^\"]|\\"|\n)*{DOCUMENTACION_D}
规则是这样的:
{DOCUMENTACION} {
doSomething();
}
我正在为 Python 2.7 编写词法分析器。我对长字符串项的正则表达式有疑问。这是我为这种字符串编写的代码:
ESCAPESEQ \\x
SHORTSTRINGITEM {SHORTSTRINGCHAR}|{ESCAPESEQ}
SHORTSTRING (\'{SHORTSTRINGITEM}*\')|(\"{SHORTSTRINGITEM}*\")
LONGSTRINGCHAR [^\(\'\'\')(\"\"\")]
LONGSTRINGITEM {LONGSTRINGCHAR}|{ESCAPESEQ}
LONGSTRING (\'\'\'{LONGSTRINGITEM}*\'\'\')|(\"\"\"{LONGSTRINGITEM}*\"\"\")
LONGSTRINGLITERAL {STRINGPREFIX}?{LONGSTRING}
如果我分析一个 Python 代码,它有两个与其他标记分开的长字符串,我的分析器 return 将这两个长字符串和它们之间的代码作为标记。那是因为 Flex 尝试 return 最长的匹配。但是我想 return 仅针对此令牌长字符串进行最短匹配。 谢谢你的回答。
尝试这样定义它:
DOCUMENTACION_D \"\"\"
DOCUMENTACION {DOCUMENTACION_D}([^\"]|\\"|\n)*{DOCUMENTACION_D}
规则是这样的:
{DOCUMENTACION} {
doSomething();
}