Mirror von
https://github.com/IntellectualSites/FastAsyncWorldEdit.git
synchronisiert 2024-12-26 02:50:06 +01:00
Add initial ANTLR setup + lex/parser
Dieser Commit ist enthalten in:
Ursprung
21f3d967c3
Commit
7d52374fc0
@ -1,7 +1,10 @@
|
|||||||
|
import org.gradle.plugins.ide.idea.model.IdeaModel
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
id("java-library")
|
id("java-library")
|
||||||
id("net.ltgt.apt-eclipse")
|
id("net.ltgt.apt-eclipse")
|
||||||
id("net.ltgt.apt-idea")
|
id("net.ltgt.apt-idea")
|
||||||
|
id("antlr")
|
||||||
}
|
}
|
||||||
|
|
||||||
applyPlatformAndCoreConfiguration()
|
applyPlatformAndCoreConfiguration()
|
||||||
@ -23,6 +26,10 @@ dependencies {
|
|||||||
"compile"("org.slf4j:slf4j-api:1.7.26")
|
"compile"("org.slf4j:slf4j-api:1.7.26")
|
||||||
"compile"("it.unimi.dsi:fastutil:8.2.1")
|
"compile"("it.unimi.dsi:fastutil:8.2.1")
|
||||||
|
|
||||||
|
val antlrVersion = "4.7.2"
|
||||||
|
"antlr"("org.antlr:antlr4:$antlrVersion")
|
||||||
|
"implementation"("org.antlr:antlr4-runtime:$antlrVersion")
|
||||||
|
|
||||||
"compileOnly"(project(":worldedit-libs:core:ap"))
|
"compileOnly"(project(":worldedit-libs:core:ap"))
|
||||||
"annotationProcessor"(project(":worldedit-libs:core:ap"))
|
"annotationProcessor"(project(":worldedit-libs:core:ap"))
|
||||||
// ensure this is on the classpath for the AP
|
// ensure this is on the classpath for the AP
|
||||||
@ -36,6 +43,26 @@ tasks.withType<JavaCompile>().configureEach {
|
|||||||
options.compilerArgs.add("-Aarg.name.key.prefix=")
|
options.compilerArgs.add("-Aarg.name.key.prefix=")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tasks.named<AntlrTask>("generateGrammarSource").configure {
|
||||||
|
val pkg = "com.sk89q.worldedit.antlr"
|
||||||
|
outputDirectory = file("build/generated-src/antlr/main/${pkg.replace('.', '/')}")
|
||||||
|
arguments = listOf(
|
||||||
|
"-visitor", "-package", pkg,
|
||||||
|
"-Xexact-output-dir"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Give intellij info about where ANTLR code comes from
|
||||||
|
plugins.withId("idea") {
|
||||||
|
configure<IdeaModel> {
|
||||||
|
afterEvaluate {
|
||||||
|
module.sourceDirs.add(file("src/main/antlr"))
|
||||||
|
module.sourceDirs.add(file("build/generated-src/antlr/main"))
|
||||||
|
module.generatedSourceDirs.add(file("build/generated-src/antlr/main"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
sourceSets {
|
sourceSets {
|
||||||
main {
|
main {
|
||||||
java {
|
java {
|
||||||
|
186
worldedit-core/src/main/antlr/com/sk89q/worldedit/antlr/Expression.g4
Normale Datei
186
worldedit-core/src/main/antlr/com/sk89q/worldedit/antlr/Expression.g4
Normale Datei
@ -0,0 +1,186 @@
|
|||||||
|
grammar Expression;
|
||||||
|
|
||||||
|
// Lexer tokens:
|
||||||
|
|
||||||
|
PLUS : '+' ;
|
||||||
|
MINUS : '-' ;
|
||||||
|
TIMES : '*' ;
|
||||||
|
DIVIDE : '/' ;
|
||||||
|
MODULO : '%' ;
|
||||||
|
POWER : '^' | '**' ;
|
||||||
|
LEFT_SHIFT : '<<' ;
|
||||||
|
RIGHT_SHIFT : '>>' ;
|
||||||
|
ASSIGN : '=' ;
|
||||||
|
COMPLEMENT : '~' ;
|
||||||
|
|
||||||
|
PLUS_ASSIGN : '+=' ;
|
||||||
|
MINUS_ASSIGN : '-=' ;
|
||||||
|
TIMES_ASSIGN : '*=' ;
|
||||||
|
DIVIDE_ASSIGN : '/=' ;
|
||||||
|
MODULO_ASSIGN : '%=' ;
|
||||||
|
POWER_ASSIGN : '^=' ;
|
||||||
|
|
||||||
|
EQUAL : '==' ;
|
||||||
|
NOT_EQUAL : '!=' ;
|
||||||
|
NEAR : '~=' ;
|
||||||
|
LESS_THAN : '<' ;
|
||||||
|
LESS_THAN_OR_EQUAL : '<=' ;
|
||||||
|
GREATER_THAN : '>' ;
|
||||||
|
GREATER_THAN_OR_EQUAL : '>=' ;
|
||||||
|
// SC = "Short Circuit"
|
||||||
|
// Non-SC variants not currently implemented.
|
||||||
|
AND_SC : '&&' ;
|
||||||
|
OR_SC : '||' ;
|
||||||
|
|
||||||
|
INCREMENT : '++' ;
|
||||||
|
DECREMENT : '--' ;
|
||||||
|
|
||||||
|
COMMA : ',' ;
|
||||||
|
OPEN_PAREN : '(' ;
|
||||||
|
CLOSE_PAREN : ')' ;
|
||||||
|
OPEN_BRACKET : '{' ;
|
||||||
|
CLOSE_BRACKET : '}' ;
|
||||||
|
SEMI_COLON : ';' ;
|
||||||
|
QUESTION_MARK : '?' ;
|
||||||
|
COLON : ':' ;
|
||||||
|
EXCLAMATION_MARK : '!' ;
|
||||||
|
|
||||||
|
IF : 'if' ;
|
||||||
|
ELSE : 'else' ;
|
||||||
|
WHILE : 'while' ;
|
||||||
|
DO : 'do' ;
|
||||||
|
FOR : 'for' ;
|
||||||
|
BREAK : 'break' ;
|
||||||
|
CONTINUE : 'continue' ;
|
||||||
|
RETURN : 'return' ;
|
||||||
|
SWITCH : 'switch' ;
|
||||||
|
CASE : 'case' ;
|
||||||
|
DEFAULT : 'default' ;
|
||||||
|
|
||||||
|
fragment DIGIT : [0-9] ;
|
||||||
|
fragment SIGN : [+-] ;
|
||||||
|
fragment EXP_CHAR : [eE] ;
|
||||||
|
fragment DECIMAL : '.' DIGIT+ ( EXP_CHAR SIGN? DIGIT+ )? ;
|
||||||
|
|
||||||
|
// All numbers are treated the same. No int/dec divide.
|
||||||
|
NUMBER : SIGN? ( DIGIT+ DECIMAL? | DECIMAL ) ;
|
||||||
|
|
||||||
|
ID : [A-Za-z] [0-9A-Za-z_]* ;
|
||||||
|
|
||||||
|
WS : [ \t\r\n\u000C]+ -> skip ;
|
||||||
|
|
||||||
|
// Parser rules:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* All statements parseable from the input. Forces consumption of EOF token.
|
||||||
|
*/
|
||||||
|
allStatements : statements EOF ;
|
||||||
|
|
||||||
|
statements : statement+ ;
|
||||||
|
|
||||||
|
statement
|
||||||
|
: block
|
||||||
|
| ifStatement
|
||||||
|
| whileStatement
|
||||||
|
| doStatement
|
||||||
|
| forStatement
|
||||||
|
| breakStatement
|
||||||
|
| continueStatement
|
||||||
|
| returnStatement
|
||||||
|
| switchStatement
|
||||||
|
| expressionStatement
|
||||||
|
| SEMI_COLON
|
||||||
|
;
|
||||||
|
|
||||||
|
block : '{' statements '}' ;
|
||||||
|
|
||||||
|
ifStatement : IF '(' expression ')' statement ( ELSE statement ) ;
|
||||||
|
|
||||||
|
whileStatement : WHILE '(' expression ')' statement ;
|
||||||
|
|
||||||
|
doStatement : DO statement WHILE '(' expression ')' SEMI_COLON ;
|
||||||
|
|
||||||
|
forStatement
|
||||||
|
: FOR '('
|
||||||
|
// C-style for loop
|
||||||
|
( expression ';' expression ';' expression
|
||||||
|
// Range for loop
|
||||||
|
| ID ASSIGN ID ',' ID
|
||||||
|
)
|
||||||
|
')' statement ;
|
||||||
|
|
||||||
|
breakStatement : BREAK ;
|
||||||
|
|
||||||
|
continueStatement : CONTINUE ;
|
||||||
|
|
||||||
|
returnStatement : RETURN expression? ;
|
||||||
|
|
||||||
|
switchStatement : SWITCH '(' expression ')' '{' (switchLabel ':' statements )+ '}' ;
|
||||||
|
|
||||||
|
switchLabel
|
||||||
|
: CASE constantExpression
|
||||||
|
| DEFAULT
|
||||||
|
;
|
||||||
|
|
||||||
|
expressionStatement : expression SEMI_COLON ;
|
||||||
|
|
||||||
|
expression
|
||||||
|
: constantExpression
|
||||||
|
| functionCall
|
||||||
|
| identifierExpression
|
||||||
|
| '(' expression ')'
|
||||||
|
| unaryOp expression
|
||||||
|
| identifierExpression binaryAssignOp expression
|
||||||
|
| expression binaryOp expression
|
||||||
|
| expression postUnaryOp
|
||||||
|
;
|
||||||
|
|
||||||
|
constantExpression : NUMBER ;
|
||||||
|
|
||||||
|
functionCall : ID '(' (expression ( ',' expression )*)? ')' ;
|
||||||
|
|
||||||
|
identifierExpression : ID ;
|
||||||
|
|
||||||
|
unaryOp
|
||||||
|
: MINUS
|
||||||
|
| EXCLAMATION_MARK
|
||||||
|
| COMPLEMENT
|
||||||
|
| INCREMENT
|
||||||
|
| DECREMENT
|
||||||
|
;
|
||||||
|
|
||||||
|
postUnaryOp
|
||||||
|
: INCREMENT
|
||||||
|
| DECREMENT
|
||||||
|
| EXCLAMATION_MARK
|
||||||
|
;
|
||||||
|
|
||||||
|
binaryOp
|
||||||
|
: POWER
|
||||||
|
| TIMES
|
||||||
|
| DIVIDE
|
||||||
|
| MODULO
|
||||||
|
| PLUS
|
||||||
|
| MINUS
|
||||||
|
| LEFT_SHIFT
|
||||||
|
| RIGHT_SHIFT
|
||||||
|
| LESS_THAN
|
||||||
|
| GREATER_THAN
|
||||||
|
| LESS_THAN_OR_EQUAL
|
||||||
|
| GREATER_THAN_OR_EQUAL
|
||||||
|
| EQUAL
|
||||||
|
| NOT_EQUAL
|
||||||
|
| NEAR
|
||||||
|
| AND_SC
|
||||||
|
| OR_SC
|
||||||
|
;
|
||||||
|
|
||||||
|
binaryAssignOp
|
||||||
|
: ASSIGN
|
||||||
|
| PLUS_ASSIGN
|
||||||
|
| MINUS_ASSIGN
|
||||||
|
| TIMES_ASSIGN
|
||||||
|
| DIVIDE_ASSIGN
|
||||||
|
| MODULO_ASSIGN
|
||||||
|
| POWER_ASSIGN
|
||||||
|
;
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren