Как написать простой Lexer / Parser с antlr 2.7? - PullRequest
2 голосов
/ 22 апреля 2010

У меня есть сложная грамматика (в 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 голосов
/ 22 апреля 2010

посмотрите на эти примеры, есть несколько примеров C, которые должны помочь вам в пути.

Кстати, сообщение об ошибке приходит из-за того, что вы компилируете с предварительно скомпилированными заголовками, поэтому он хочет, чтобы stdafx.h включал в начале вашего файла .cpp, вы можете добавить это в грамматику в разделе header {}.

...