需要帮助编译一个ANTLR语法文件

时间:2014-10-18 23:47:22

标签: java antlr grammar

我是ANTLR的新手,我不知道如何编译我的语法。 我正在使用ANTLR的v4.4和.g4文件,其中包含:

grammar JayGrammar;
program: KEYWORD_VOI KEYWORD_MAI SEPARATOR_PAB SEPARATOR_PCD (declarations statements);
declarations: (declaration)*;
declaration: (type identifiers);
type: (KEYWORD_INT | KEYWORD_BOO);
identifiers: (IDENTIFIER)*;
statements: (statement)*;
statement: (block | assignment | ifstatement | whilestatementk);
block: SEPARATOR_LAB statements SEPARATOR_LCD;
assignment: (IDENTIFIER OPERATOR_IGU expression);
ifstatement: KEYWORD_IF SEPARATOR_PAB expression SEPARATOR_PCD statement (KEYWORD_ELS statement)?;
whilestatementk: KEYWORD_WHI SEPARATOR_PAB expression SEPARATOR_PCD statement;
expression: conjunction ((OPERATOR_O) conjunction)*;
conjunction: relation ((OPERATOR_Y) relation)*;
relation: addition ((OPERATOR_REL) addition)*;
addition: term ((OPERATOR_SUM|OPERATOR_RES) term)*;
term: negation ((OPERATOR_POR|OPERATOR_DIV) negation)*;
negation:(OPERATOR_NO) factor;
factor: IDENTIFIER|LITERAL|SEPARATOR_PAB expression SEPARATOR_PCD;

    INPUTELEMENT: (WHITESPACE|TOKEN);
    WHITESPACE: (' '|'\t'|'\r'|'\n'|'\f');

    TOKEN: (IDENTIFIER|KEYWORD_BOO|KEYWORD_ELS|KEYWORD_IF|KEYWORD_MAI|KEYWORD_VOI|KEYWORD_WHI|LITERAL
           |SEPARATOR_COM|SEPARATOR_LAB|SEPARATOR_LCD|SEPARATOR_PAB|SEPARATOR_PCD|SEPARATOR_PYC
           |OPERATOR_REL|OPERATOR_DIV|OPERATOR_IGU|OPERATOR_NO|OPERATOR_O|OPERATOR_POR|OPERATOR_RES|OPERATOR_SUM|OPERATOR_Y);

    LITERAL: (BOOLEAN INTEGER);

    KEYWORD_BOO: BOOLEAN;
    KEYWORD_ELS:'else';
    KEYWORD_IF: 'if';
    KEYWORD_INT: 'int';
    KEYWORD_MAI: 'main';
    KEYWORD_VOI: 'void';
    KEYWORD_WHI: 'while';
    BOOLEAN: ('true'|'false');

    INTEGER: (DIGIT+);
    IDENTIFIER: (LETTER (LETTER| DIGIT)*);
    DIGIT: ('0'..'9')+;
    LETTER: ('a'..'z'|'A'..'Z')+;


    SEPARATOR_PAB: '(';
    SEPARATOR_PCD: ')';
    SEPARATOR_LAB: '{';
    SEPARATOR_LCD: '}';
    SEPARATOR_PYC: ';';
    SEPARATOR_COM: ',';


    OPERATOR_IGU: ('=');
    OPERATOR_SUM: ('+');
    OPERATOR_RES: ('-');
    OPERATOR_POR: ('*');
    OPERATOR_DIV: ('/');
    OPERATOR_REL: ('<'|'<='|'>'|'>='|'=='|'!=');
    OPERATOR_Y:   ('&&');
    OPERATOR_O:   ('||');
    OPERATOR_NO:  ('!');

如果有人能告诉我如何使用扩展名“.java”创建词法分析器和解析器,然后编译它们以创建类,我将非常高兴。 我一直在使用NetBeans,但我真的很困惑,如果有其他IDE我可以使用或其他任何东西,请帮助我。

1 个答案:

答案 0 :(得分:2)

Antlr4 "Getting Started"页面对此进行了解释。

手工完成就像这样简单:

$ antlr4 YourGrammar.g4
$ javac YourGrammar*.java

...假设您已安装并配置了Java JDK和Antlr。


有许多方法可以在Netbeans IDE中使用Antrlr:

  • 只需编写/生成Ant构建脚本,然后对其进行修改以包含运行antlr4等的规则。允许您将Antlr合并到构建中,而无需任何特定于IDE的集成。

  • 关于将Antlr集成到Netbeans中的the instructions here

  • 安装并使用Antlrworks 2 plugin