Java使用ANTLR从语法构建AST
所以,我被分配了一个任务,从头开始构造AST。到目前为止,我已经使用ANTLR 4定义了语法,但是由于它不再支持AST(从ANTLR 4中弃用),构建AST的正确方法是什么?我知道我应该使用ANTLR提供并生成接口的访问者、侦听器和操作,但是如何使用呢?例如,我应该将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
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'->跳过;//单行注释
注释:'/*'.'*/'->跳过;//多行注释