如何用antlr 2.7编写一个简单的Lexer / Parser?

时间:2010-04-22 06:29:08

标签: c++ visual-studio-2005 antlr

我需要扩展一个复杂的语法(在antlr 2.7中)。从来没有使用过antlr,我想先写一个非常简单的Lexer和Parser。

我找到了对antlr3的一个非常好的解释,并试图改编它:

header{
    #include <iostream>
    using namespace std;
}

options { 
    language="Cpp"; 
}

class P2 extends Parser;

/* This will be the entry point of our parser. */
eval
    :    additionExp
    ;

/* Addition and subtraction have the lowest precedence. */
additionExp
    :    multiplyExp 
         ( "+" multiplyExp 
         | "-" multiplyExp
         )* 
    ;

/* Multiplication and addition have a higher precedence. */
multiplyExp
    :    atomExp
         ( "*" atomExp 
         | "/" atomExp
         )* 
    ;

/* An expression atom is the smallest part of an expression: a number. Or 
   when we encounter parenthesis, we're making a recursive call back to the
   rule 'additionExp'. As you can see, an 'atomExp' has the highest precedence. */
atomExp
    :    Number
    |    "(" additionExp ")"
    ;

/* A number: can be an integer value, or a decimal value */
number
    :    ("0".."9")+ ("." ("0".."9")+)?
    ;

/* We're going to ignore all white space characters */
protected
ws  
    :   (" " | "\t" | "\r" | "\n") { newline(); }
    ;

它确实生成了四个没有错误的文件:P2.cpp,P2.hpp,P2TokenTypes.hpp和P2TokenTypes.txt。但现在呢?如何用它创建一个工作程序?我试图将这些文件添加到VS2005-WinConsole-Project但它不能编译:

  

p2.cpp(277):致命错误C1010:   看起来意外的文件结束   对于预编译的头文件。你忘了吗   将'#include“stdafx.h”'添加到您的   源?

1 个答案:

答案 0 :(得分:0)

查看these示例,有一些C示例可以帮助您。

BTW错误消息来自于您正在使用预编译头进行编译,因此它希望stdafx.h包含在.cpp文件的开头,您可以在头文件{}部分的语法中添加它。