summaryrefslogtreecommitdiff
path: root/language/src
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2023-09-07 14:32:31 -0700
committerGitHub <noreply@github.com>2023-09-07 14:32:31 -0700
commitee3a2f571897b23caecfe9cfe4f5e4338007f885 (patch)
tree5a32a60e3070347c99b4ee6fa572533f90d77085 /language/src
parent1571eeeb41c3af5cc2da23ce4edbc69cf53bd383 (diff)
parentdbd9798602c3b80bc00c93c797b942dcb0e234c1 (diff)
downloadSimple-ee3a2f571897b23caecfe9cfe4f5e4338007f885.tar.gz
Simple-ee3a2f571897b23caecfe9cfe4f5e4338007f885.zip
Merge pull request #2 from dibyendumajumdar/main
Initial framework for the project
Diffstat (limited to 'language/src')
-rw-r--r--language/src/main/antlr4/com/seaofnodes/simple/antlr/SimpleLanguage.g4170
1 files changed, 170 insertions, 0 deletions
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