2010-06-24 90 views
5

如何定义一个工作集的词法分析器和解析器(范例: flex和bison)以支持C++ 0x样式的原始字符串文字?如何实现C++ 0x原始字符串文字?

正如您可能已经知道的那样,C++ 0x中的新字符串文字可以以非常灵活的方式表达。

R"<delim>...<delim>"; - 在此代码中,<delim>几乎可以应有尽有,也不需要转义字符。

任何种类的括号的可用于分隔字符串的末尾:

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  ) 
    ;***************************"; 

更多:

R"(I love those who yearn for the impossible. (Von Goethe, "Faust"))";

文本的块可以使用的相同的字符等于出现简单地定义信息可以发现here(维基百科)和here(att)。

我想在我现在正在开发的语言中使用这个奇妙的功能。

那么,我如何定义一个合适的标记器和语法分析器来实现结果呢?

在此先感谢您的答案!

+0

我认为你的第二个例子不是一个有效的原始文字它应该包含圆括号(R“(; *** ...”) – Motti 2010-06-27 06:07:17

+0

不,不...序列; *** ...是一个字符串的分隔符;原始字符串的内容在括号后面开始 – Rizo 2010-06-27 09:36:49

+0

下面是维基百科的例子:R“delimiter(The String Data \ Stuff”)delimiter“ – Rizo 2010-06-27 10:02:42

回答

2

您可以在词法分析阶段提炼文字,并将它们转换为元标记之类的东西。

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]是指针到原来的文字文本。

+0

你可以处理任何不规则的,在词法分析阶段使用特殊的语法结构g自定义子程序。 – 9dan 2010-12-31 12:18:00

+0

这是一种混合词汇语法分析;我想我理解了这个主意!谢谢! – Rizo 2011-01-12 21:47:34