Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java使用ANTLR从语法构建AST_Java_Parsing_Antlr_Grammar_Abstract Syntax Tree - Fatal编程技术网

Java使用ANTLR从语法构建AST

Java使用ANTLR从语法构建AST,java,parsing,antlr,grammar,abstract-syntax-tree,Java,Parsing,Antlr,Grammar,Abstract Syntax Tree,所以,我被分配了一个任务,从头开始构造AST。到目前为止,我已经使用ANTLR 4定义了语法,但是由于它不再支持AST(从ANTLR 4中弃用),构建AST的正确方法是什么?我知道我应该使用ANTLR提供并生成接口的访问者、侦听器和操作,但是如何使用呢?例如,我应该将org.eclipse.jdt.core.dom.AST类与ASTParser对象一起使用吗?或者到底是什么?AST层次结构如何 我问这个问题是因为在理论上一切听起来都很完美,但在实践中,这是相当困难的 以下是ANTLR语法: pr

所以,我被分配了一个任务,从头开始构造AST。到目前为止,我已经使用ANTLR 4定义了语法,但是由于它不再支持AST(从ANTLR 4中弃用),构建AST的正确方法是什么?我知道我应该使用ANTLR提供并生成接口的访问者、侦听器和操作,但是如何使用呢?例如,我应该将
org.eclipse.jdt.core.dom.AST
类与ASTParser对象一起使用吗?或者到底是什么?AST层次结构如何

我问这个问题是因为在理论上一切听起来都很完美,但在实践中,这是相当困难的

以下是ANTLR语法:

prog    : form+ EOF ;

form    : 'form' ID '{' quest+ stat* decl* '}' ;

quest   : 'question' STRING '=' QuestionLiteral '{' decl stat* expr* '}' ;

stat : value                                // Value, e.g. value = false; value = someX * someY;
 | ifStat                               // If statement
 | ID '=' expr ';'                      // Assignment
 ;

decl : ID ':' primitiveType ';' ;   // The definition of e.g. hasBoughtHouse : boolean -> restricted only to primitive types

expr        : expr EXP<assoc=right> expr                                #Exp
        | expr (MUL | DIV) expr                                     #MulDiv
        | expr (ADD | SUB) expr                                     #AddSub
        | expr (LESS | LESS_EQUAL | GREATER | GREATER_EQUAL) expr   #LessGreater
        | expr ('==' | '!=') expr                                   #Equal_NotEqual
        | expr '&&' expr                                            #LogAnd
        | expr '||' expr                                            #LogOr
        | '(' expr ')'                                              #Par
        | literal                                                   #ExprLit
        ;


ifStat      : 'if' '(' expr ')' '{' quest* stat* decl* '}'
        | 'if' '(' expr ')' '{' stat '}' 'else' '(' quest* stat* decl* ')';

value       : ID '.' 'value' '=' expr ';' ; // hasSoldHouse.value = true; hasSoldHouse.value = 2+3; 

literal     : BooleanLiteral
        | NumberLiteral
        | ID
        ;

QuestionLiteral : 'OrdinaryQuestion'
            | 'ComputableQuestion'
            ;

BooleanLiteral  : 'true'
            | 'false'
            ;

NumberLiteral   : (INT | ('(-'INT')'))
            | (FLOAT | ('(-'FLOAT')'))
            | (CURRENCY | ('(-'CURRENCY')'))
            ;

primitiveType   : 'boolean'
            | 'float'
            | 'currency'
            | 'string'
            ;

WS          : (' ' | NL | '\t') -> skip;

ID          : ID_LETTER (ID_LETTER | INT)* ;

/* It gets form, if etc as an identifier and not as keywords */

ID_LETTER   : 'a'..'z' | 'A'..'Z' | '_' ;

INT         : '0' | [1-9] [0-9]*  ; // We cannot use [0-9]+ because this would mean that 01 + 3 would be acceptable

FLOAT       : INT+ '.' INT* // How to set the precision to for instance 4? That it returns a value of this precision
        | '.' INT+;

CURRENCY    : FLOAT;

STRING      : '"'   (ESC|.)*? '"';
fragment
ESC         : '\\' | '\\\\' ;

LINE_COMMENT: '//' .*? '\n' -> skip;    // Single line comments
COMMENT     : '/*' .*? '*/' -> skip;    // Multi line comments
prog:form+EOF;
表单:'form'ID'{'quest+stat*decl*'}';
任务:'question'STRING'='QuestionLiteral'{'decl stat*expr*'}';
stat:value//value,例如value=false;值=someX*someY;
|ifStat//If语句
|ID“=”expr“;”//分配
;
decl:ID':'primitiveType';';//例如hasBoughtHouse的定义:boolean->仅限于基本类型
expr:expr expr expr#EXP
|expr(MUL|DIV)expr#MulDiv
|expr(ADD | SUB)expr#AddSub
|expr(更少|更少|相等|更大|更大|相等)expr#更少|相等
|expr(“==”|“!=”)expr#Equal_NotEqual
|expr'和&'expr#LogAnd
|expr'| | expr#LogOr
|“(“expr”)”#第
|文字表达
;
ifStat:'if'('expr')'{'quest*stat*decl*'}'
|'如果'('expr')''{'stat'}'其他'('quest*stat*decl*');
值:ID“.”值“=”expr“;”;//hasSoldHouse.value=true;hasSoldHouse.value=2+3;
文字:布尔文字
|数量上
|身份证
;
QuestionLiteral:“普通问题”
|“可计算问题”
;
布尔文:“真”
|“假”
;
编号:(INT |(“('INT')))
|(浮点数(“(“浮点数”))
|(货币|(“(‘货币’)))
;
基本类型:“布尔”
|“浮动”
|“货币”
|“字符串”
;
WS:(''NL'\t')->跳过;
ID:ID字母(ID字母| INT)*;
/*它将form,if,etc作为标识符,而不是关键字*/
ID|U字母:'a'..'z'|'a'..'z'|';
INT:'0'|[1-9][0-9]*;//我们不能使用[0-9]+,因为这意味着01+3是可以接受的
FLOAT:INT+'.'INT*//如何将精度设置为例如4?它将返回此精度的值
|"INT+",;
货币:浮动;
字符串:“”(ESC |.*?”;
碎片
ESC:“\\'”\\\\”;
行注释:“/”*\n'->跳过;//单行注释
注释:'/*'.'*/'->跳过;//多行注释