如何将令牌种类及其相关信息从lexer传递给预处理器,然后传递给解析器 尝试实现一个简单的C/C++解析器,尝试部分解析C++语言。所以我需要创建一个Lexer、一个预处理器和一个解析器类

如何将令牌种类及其相关信息从lexer传递给预处理器,然后传递给解析器 尝试实现一个简单的C/C++解析器,尝试部分解析C++语言。所以我需要创建一个Lexer、一个预处理器和一个解析器类,c++,parsing,lexer,C++,Parsing,Lexer,我正在考虑从这三个层传递信息所需的数据类型。通常,这里需要一个令牌类,因为现在,我的令牌类如下所示: struct Token { TokenKind id; std::string lexeme; int fileIndex; int line; int column; } const cpp_token *token = cpp_get_token (pfile); 我认为最重要的部分是TokenKind(它可以是IDENTIFIER或CL

我正在考虑从这三个层传递信息所需的数据类型。通常,这里需要一个令牌类,因为现在,我的令牌类如下所示:

struct Token 
{
    TokenKind id; 
    std::string lexeme; 
    int fileIndex;
    int line; 
    int column;
}
const cpp_token *token = cpp_get_token (pfile);
我认为最重要的部分是TokenKind(它可以是
IDENTIFIER
CLASS\u关键字
或任何其他标点符号,如
LPAREN
),有时,lexeme也很重要,因为它通常包含类型名或变量名信息

我看了一些关于如何将令牌传递给解析器的实现

1,我看到
Clang
在它的预处理器类中有一些函数,比如

你看,一个引用作为函数参数传递,函数用结果填充对象,请参见a Clang教程中的另一个引用:,这里实例
tok
在循环中重用

Token tok;
do {
    ci.getPreprocessor().Lex(tok);
    if( ci.getDiagnostics().hasErrorOccurred())
        break;
    ci.getPreprocessor().DumpToken(tok);
    std::cerr << std::endl;
} while ( tok.isNot(clang::tok::eof));
Lexer返回一个TokenPtr,它是指向解析器的令牌对象的智能指针,因此整个令牌都返回给解析器

4,GCC的cpp库具有
cpp\u get\u token()
函数的一些接口,如下所示:

struct Token 
{
    TokenKind id; 
    std::string lexeme; 
    int fileIndex;
    int line; 
    int column;
}
const cpp_token *token = cpp_get_token (pfile);
然后,
token->type
就像TokenKind字段一样

所以,我的问题是:这些实现的优缺点是什么。上面提到的一些方法甚至没有预处理层,对我来说,我确实需要三层(lexer、预处理器和解析器)

请注意,我的解析器不够大,不能作为
clang
GCC
的解析器。我的主要想法是我的解析器只能解析非常有限的C++语言部分,我想让它们都手写。
编辑这里有一个类似的问题,几天前我也在那里发表了一些评论,但这个问题不涉及三层。

我觉得你的结构标记很好。对于更简单的语言,我会为标量添加一个数字字段,但你可以在解析器中这样做。然而,在预处理之后(假设cpp是集成的)@MalcolmMcLean谢谢,看起来我的问题在将近一个月内没有得到回答。我的主要问题是如何将整个标记信息从低层(lexer)传递到高层(parser)。Roger Ferrer在他的博客中给了我一些评论:。