summaryrefslogtreecommitdiff
path: root/language
diff options
context:
space:
mode:
Diffstat (limited to 'language')
-rw-r--r--language/.gitignore28
-rw-r--r--language/README.md6
-rw-r--r--language/examples/all-features.lang21
-rw-r--r--language/pom.xml80
-rw-r--r--language/src/main/antlr4/com/seaofnodes/simple/antlr/SimpleLanguage.g4170
5 files changed, 305 insertions, 0 deletions
diff --git a/language/.gitignore b/language/.gitignore
new file mode 100644
index 00000000..58314a2c
--- /dev/null
+++ b/language/.gitignore
@@ -0,0 +1,28 @@
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+target/*
+
+.idea
+*.iml \ No newline at end of file
diff --git a/language/README.md b/language/README.md
new file mode 100644
index 00000000..09593ab5
--- /dev/null
+++ b/language/README.md
@@ -0,0 +1,6 @@
+# Simple Demo Language
+
+The language is a small subset of the C language.
+
+The grammar of the language is not yet finalized, but for the current definition,
+please look at [grammar](src/main/antlr4/com/seaofnodes/simple/antlr/SimpleLanguage.g4). \ No newline at end of file
diff --git a/language/examples/all-features.lang b/language/examples/all-features.lang
new file mode 100644
index 00000000..132e4b9c
--- /dev/null
+++ b/language/examples/all-features.lang
@@ -0,0 +1,21 @@
+int i;
+int j;
+
+i = 0;
+j = 100;
+while ( 1 )
+{
+ i = i + 1;
+ j = j - 1;
+ if (i >= j)
+ break;
+}
+
+if (1)
+ i = i + 5;
+else if (2)
+ i = i - 1;
+else
+{
+ j = 0;
+} \ No newline at end of file
diff --git a/language/pom.xml b/language/pom.xml
new file mode 100644
index 00000000..7d748aa1
--- /dev/null
+++ b/language/pom.xml
@@ -0,0 +1,80 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>com.seaofnodes</groupId>
+ <artifactId>simple</artifactId>
+ <version>1.0</version>
+ </parent>
+ <artifactId>language-grammar</artifactId>
+ <packaging>jar</packaging>
+ <name>SeaOfNodes Demo Simple Language Grammar</name>
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <maven.compiler.target>17</maven.compiler.target>
+ <maven.compiler.source>17</maven.compiler.source>
+ <antlr4test-maven-plugin.version>1.22</antlr4test-maven-plugin.version>
+ <antlr.version>4.11.1</antlr.version>
+ <antlr4test-maven-plugin.version>1.21</antlr4test-maven-plugin.version>
+ <junit.version>4.13.2</junit.version>
+ </properties>
+ <dependencies>
+ <dependency>
+ <groupId>org.antlr</groupId>
+ <artifactId>antlr4-runtime</artifactId>
+ <version>${antlr.version}</version>
+ <type>jar</type>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <pluginManagement>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>3.10.1</version>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ <plugins>
+ <plugin>
+ <groupId>org.antlr</groupId>
+ <artifactId>antlr4-maven-plugin</artifactId>
+ <version>${antlr.version}</version>
+ <configuration>
+ <visitor>true</visitor>
+ <listener>true</listener>
+ </configuration>
+ <executions>
+ <execution>
+ <phase>generate-sources</phase>
+ <goals>
+ <goal>antlr4</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>com.khubla.antlr</groupId>
+ <artifactId>antlr4test-maven-plugin</artifactId>
+ <version>${antlr4test-maven-plugin.version}</version>
+ <configuration>
+ <verbose>false</verbose>
+ <showTree>false</showTree>
+ <entryPoint>program</entryPoint>
+ <grammarName>SimpleLanguage</grammarName>
+ <packageName>com.seaofnodes.simple.antlr</packageName>
+ <exampleFiles>examples/</exampleFiles>
+ </configuration>
+ <executions>
+ <execution>
+ <goals>
+ <goal>test</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/language/src/main/antlr4/com/seaofnodes/simple/antlr/SimpleLanguage.g4 b/language/src/main/antlr4/com/seaofnodes/simple/antlr/SimpleLanguage.g4
new file mode 100644
index 00000000..6779e5a2
--- /dev/null
+++ b/language/src/main/antlr4/com/seaofnodes/simple/antlr/SimpleLanguage.g4
@@ -0,0 +1,170 @@
+grammar SimpleLanguage;
+
+program
+ : declaration* statement+ EOF
+ ;
+
+declaration
+ : type IDENTIFIER ';'
+ ;
+
+type
+ : 'int'
+ ;
+
+statement
+ : 'if' '(' expression ')' statement
+ | 'if' '(' expression ')' statement 'else' statement
+ | 'while' '(' expression ')' statement
+ | IDENTIFIER '=' expression ';'
+ | '{' declaration* statement+ '}'
+ | 'break' ';'
+ ;
+
+expression
+ : primaryExpression # PrimaryExpression_
+ | ('-' | '!') expression # UnaryExpression
+ | expression ('*' | '/' ) expression # ArithmeticOrLogicalExpression
+ | expression ('+' | '-') expression # ArithmeticOrLogicalExpression
+ | expression ('==' | '!='| '>'| '<'| '>='| '<=') expression # ComparisonExpression
+ | expression '&&' expression # BooleanExpression
+ | expression '||' expression # BooleanExpression
+ ;
+
+primaryExpression
+ :
+ | INTEGER_LITERAL
+ | IDENTIFIER
+ | '(' expression ')'
+ ;
+
+///////////////////////////////////////////////////////////////////
+
+IDENTIFIER
+ : IDENTIFIER_NONDIGIT
+ ( IDENTIFIER_NONDIGIT
+ | DEC_DIGIT
+ )*
+ ;
+
+fragment
+IDENTIFIER_NONDIGIT
+ : NON_DIGIT
+ | UNIVERSAL_CHARACTER_NAME
+ ;
+
+fragment
+NON_DIGIT
+ : [a-zA-Z_]
+ ;
+
+
+fragment
+UNIVERSAL_CHARACTER_NAME
+ : '\\u' HEX_QUAD
+ | '\\U' HEX_QUAD HEX_QUAD
+ ;
+
+fragment
+HEX_QUAD
+ : HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT
+ ;
+
+// tokens char and string
+CHAR_LITERAL
+ : '\''
+ (
+ ~['\\\n\r\t]
+ | QUOTE_ESCAPE
+ | ASCII_ESCAPE
+ | UNICODE_ESCAPE
+ ) '\''
+ ;
+
+STRING_LITERAL
+ : '"'
+ (
+ ~["]
+ | QUOTE_ESCAPE
+ | ASCII_ESCAPE
+ | UNICODE_ESCAPE
+ | ESC_NEWLINE
+ )* '"'
+ ;
+RAW_STRING_LITERAL: 'r' RAW_STRING_CONTENT;
+fragment RAW_STRING_CONTENT: '#' RAW_STRING_CONTENT '#' | '"' .*? '"';
+BYTE_LITERAL: 'b\'' (. | QUOTE_ESCAPE | BYTE_ESCAPE) '\'';
+
+BYTE_STRING_LITERAL: 'b"' (~["] | QUOTE_ESCAPE | BYTE_ESCAPE)* '"';
+RAW_BYTE_STRING_LITERAL: 'br' RAW_STRING_CONTENT;
+fragment ASCII_ESCAPE: '\\x' OCT_DIGIT HEX_DIGIT | COMMON_ESCAPE;
+fragment BYTE_ESCAPE: '\\x' HEX_DIGIT HEX_DIGIT | COMMON_ESCAPE;
+fragment COMMON_ESCAPE: '\\' [nrt\\0];
+fragment UNICODE_ESCAPE
+ : '\\u{' HEX_DIGIT HEX_DIGIT? HEX_DIGIT? HEX_DIGIT? HEX_DIGIT? HEX_DIGIT? '}'
+ ;
+fragment QUOTE_ESCAPE: '\\' ['"];
+fragment ESC_NEWLINE: '\\' '\n';
+
+// number
+INTEGER_LITERAL
+ :
+ (
+ DEC_LITERAL
+ | BIN_LITERAL
+ | OCT_LITERAL
+ | HEX_LITERAL
+ ) INTEGER_SUFFIX?
+ ;
+DEC_LITERAL: DEC_DIGIT (DEC_DIGIT | '_')*;
+HEX_LITERAL: '0x' '_'* HEX_DIGIT (HEX_DIGIT | '_')*;
+OCT_LITERAL: '0o' '_'* OCT_DIGIT (OCT_DIGIT | '_')*;
+BIN_LITERAL: '0b' '_'* [01] [01_]*;
+FLOAT_LITERAL
+ : DEC_LITERAL
+ (
+ '.' DEC_LITERAL
+ )? FLOAT_EXPONENT? FLOAT_SUFFIX?
+ ;
+
+fragment INTEGER_SUFFIX
+ : 'u8'
+ | 'u16'
+ | 'u32'
+ | 'u64'
+ | 'u128'
+ | 'usize'
+ | 'i8'
+ | 'i16'
+ | 'i32'
+ | 'i64'
+ | 'i128'
+ | 'isize'
+ ;
+
+fragment FLOAT_SUFFIX: 'f32' | 'f64';
+fragment FLOAT_EXPONENT: [eE] [+-]? '_'* DEC_LITERAL;
+fragment OCT_DIGIT: [0-7];
+fragment DEC_DIGIT: [0-9];
+fragment HEX_DIGIT: [0-9a-fA-F];
+
+
+WHITESPACE
+ : [ \t]+
+ -> skip
+ ;
+
+NEWLINE
+ : ( '\r' '\n'?
+ | '\n'
+ )
+ -> skip
+ ;
+
+LINE_COMMENT
+ : '//' ~[\r\n]*
+ -> skip
+ ;
+
+
+ANY: . ; \ No newline at end of file