Programming languages 如何实现C++;0x原始字符串文字?
如何定义lexer和parser(exempli gratia:flex和bison)的工作集来支持C++0x样式的原始字符串文本 您可能已经知道,C++0x中的新字符串文本可以非常灵活地表示Programming languages 如何实现C++;0x原始字符串文字?,programming-languages,string,language-design,c++11,Programming Languages,String,Language Design,C++11,如何定义lexer和parser(exempli gratia:flex和bison)的工作集来支持C++0x样式的原始字符串文本 您可能已经知道,C++0x中的新字符串文本可以非常灵活地表示 R“…”-在此代码中,几乎可以是所有内容,也不需要转义字符 任何类型的括号都可以用来分隔字符串的结尾: 我爱那些渴望不可能的人(歌德《浮士德》) 可以使用相同字符的相等匹配项简单地定义文本块: R";***************************( ; TINY BASIC FOR INTEL
R“…”代码>-在此代码中,
几乎可以是所有内容,也不需要转义字符
任何类型的括号都可以用来分隔字符串的结尾:
我爱那些渴望不可能的人(歌德《浮士德》)代码>
可以使用相同字符的相等匹配项简单地定义文本块:
R";***************************(
; TINY BASIC FOR INTEL 8080
; VERSION 2.0
; BY LI-CHEN WANG
; MODIFIED AND TRANSLATED
; TO INTEL MNEMONICS
; BY ROGER RAUSKOLB
; 10 OCTOBER, 1976
; @COPYLEFT
; ALL WRONGS RESERVED )
;***************************";
更多信息可以在(维基百科)和(att)上找到
我想在我正在开发的语言中使用这个奇妙的特性
那么,我如何定义一个合适的标记器和语法分析器来获得结果呢
提前感谢您的回答 您可以在词法分析阶段对文本进行预处理,并将其转换为类似元标记的内容
Input:
int a;
char *b = R"....";
Preprocessed:
int a;
char *b = R*literal[0]*;
Tokenized:
INT symbol[0] DELIM
CHAR OP_ASTR symbol[1] OP_EQ symbol[2] *literal[0]* DELIM
Symbol table contents { "a", "b", "R" }
Literal table contents { "...." }
文本[0]是指向原始文本的指针。我认为第二个示例不是有效的原始文本,它应该包含括号(R“(;***…”)。不,不…序列;***…是字符串的分界符;原始字符串内容开始于括号之后。以下是来自wikipedia的示例:R“分隔符(字符串数据\Stuff”)delimiter“。我认为由于它需要一个反向引用,它不是严格的规则,我不确定flex是否能为您做到这一点。匹配类似内容的Perl模式可能是/R”([^()]+)[(](.*)[)]\1"/
。任何允许反向引用和不情愿的量词的词法生成器都应该能够做类似的事情。否则,您可能需要编写某种预处理器。祝您好运……您可以在词法分析阶段使用自定义子例程处理任何不规则的特殊语法结构。这是一种混合词汇语法分析我想我理解这个想法了!谢谢!