我需要扩展一个复杂的语法(在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”'添加到您的 源?
答案 0 :(得分:0)
查看these示例,有一些C示例可以帮助您。
BTW错误消息来自于您正在使用预编译头进行编译,因此它希望stdafx.h包含在.cpp文件的开头,您可以在头文件{}部分的语法中添加它。