注释和转义序列(例如字符串文字)在常规符号表示中非常特殊。
我很难理解常规词法分析器如何标记它们。
像lex
,flex
等词法分析器如何处理这种符号?有通用的方法吗?或者只是逐个案例的每种语言?
答案 0 :(得分:1)
注释和转义序列(例如字符串文字)在常规符号表示中非常特殊。
我不确定你的意思,但这句话肯定是错的。两条注释(除非它们可能是嵌套的)和带有转义序列的字符串都允许使用简单的常规语言描述。
例如,允许\\
,\"
,\n
和\r
的转义序列可以通过以下常规语法描述(带有起始符号E
):
E -> \ S
S -> \
S -> "
S -> n
S -> r
…
字符串只是零个或多个非转义符号或转义序列的重复(即两个常规语言的Kleene闭包,这本身就是常规语言)。
答案 1 :(得分:1)
我不能为lex
说些什么,但在我的语言词法(使用C ++风格//评论)中,我已经按行划分输入(因为它是一种Python风格的语言),我有一个与//匹配的正则表达式,然后是任意数量的任何字符。
答案 2 :(得分:1)
我认为 - 逐个案例的每种语言 - 是真的
如果在字符串文字中存在注释启动器,则词法分析器必须忽略它。
类似地,在C中,如果字符串文字中存在转义双引号\"
,
lexer必须忽略它
为此,flex具有启动条件。
这样可以进行上下文分析
例如,有一个C评论分析的例子(在/*
和*/
之间)
在flex texinfo手册中:
<INITIAL>"/*" BEGIN(IN_COMMENT);
<IN_COMMENT>{
"*/" BEGIN(INITIAL);
[^*\n]+ /* eat comment in chunks */
"*" /* eat the lone star */
\n yylineno++;
}
启动条件还启用字符串文字分析。 有一个如何使用start匹配C风格引用字符串的示例 项目开始条件中的条件,和 还有一个标题为FAQ的项目 如何在C风格的引用字符串中扩展反斜杠转义序列? 在flex texinfo手册中 可能这将直接回答你关于字符串文字的问题。