Skip to content

Instantly share code, notes, and snippets.

@marijnh
Last active March 24, 2023 11:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save marijnh/8bc74e7b0941606b02f9ea602d2d60e0 to your computer and use it in GitHub Desktop.
Save marijnh/8bc74e7b0941606b02f9ea602d2d60e0 to your computer and use it in GitHub Desktop.
@top LibraryDeclaration {
expression
}
expression {
literal
}
literal[@isGroup=Literal] {
NullLiteral |
BoolLiteral |
NumericLiteral |
StringLiteral
}
NullLiteral {
'null'
}
BoolLiteral {
'true' | 'false'
}
NumericLiteral {
DIGIT+ ('.' DIGIT+)? EXPONENT? |
'.' DIGIT+ EXPONENT? |
'0x' HEX_DIGIT+ |
'0X' HEX_DIGIT+
}
StringLiteral {
(SingleLineString | MultiLineString)+
}
Interpolation<startQuote> {
startQuote expression "}"
}
@skip {} {
SingleLineString {
RAW_SINGLE_LINE_STRING |
SINGLE_LINE_STRING_SQ_BEGIN (
SINGLE_LINE_STRING_SQ_CONTENT |
SINGLE_LINE_STRING_SQ_ESCAPE |
Interpolation<SINGLE_LINE_STRING_SQ_START_INTER> |
SINGLE_LINE_STRING_SQ_INTER
)* SINGLE_LINE_STRING_SQ_END |
SINGLE_LINE_STRING_DQ_BEGIN (
SINGLE_LINE_STRING_DQ_CONTENT |
SINGLE_LINE_STRING_DQ_ESCAPE |
Interpolation<SINGLE_LINE_STRING_DQ_START_INTER> |
SINGLE_LINE_STRING_DQ_INTER
)* SINGLE_LINE_STRING_DQ_END
}
MultiLineString {
RAW_MULTI_LINE_STRING |
MULTI_LINE_STRING_SQ_BEGIN (
MULTI_LINE_STRING_SQ_CONTENT |
MULTI_LINE_STRING_SQ_ESCAPE |
Interpolation<MULTI_LINE_STRING_SQ_START_INTER> |
MULTI_LINE_STRING_SQ_INTER
)* MULTI_LINE_STRING_SQ_END |
MULTI_LINE_STRING_DQ_BEGIN (
MULTI_LINE_STRING_DQ_CONTENT |
MULTI_LINE_STRING_DQ_ESCAPE |
Interpolation<MULTI_LINE_STRING_DQ_START_INTER> |
MULTI_LINE_STRING_DQ_INTER
)* MULTI_LINE_STRING_DQ_END
}
}
BUILT_IN_IDENTIFIER {
@specialize<IDENTIFIER_NO_DOLLAR, 'abstract' |
'as' |
'covariant' |
'deferred' |
'dynamic' |
'export' |
'external' |
'extension' |
'factory' |
'Function' |
'get' |
'implements' |
'import' |
'interface' |
'late' |
'library' |
'mixin' |
'operator' |
'part' |
'required' |
'set' |
'static' |
'typedef'>
}
@local tokens {
SINGLE_LINE_STRING_SQ_ESCAPE { ESCAPE_SEQUENCE }
SINGLE_LINE_STRING_SQ_START_INTER { "${" }
SINGLE_LINE_STRING_SQ_INTER { SIMPLE_STRING_INTERPOLATION }
SINGLE_LINE_STRING_SQ_END { "'" }
@else SINGLE_LINE_STRING_SQ_CONTENT
}
@local tokens {
SINGLE_LINE_STRING_DQ_ESCAPE { ESCAPE_SEQUENCE }
SINGLE_LINE_STRING_DQ_START_INTER { "${" }
SINGLE_LINE_STRING_DQ_INTER { SIMPLE_STRING_INTERPOLATION }
SINGLE_LINE_STRING_DQ_END { '"' }
@else SINGLE_LINE_STRING_DQ_CONTENT
}
@local tokens {
MULTI_LINE_STRING_SQ_ESCAPE { ESCAPE_SEQUENCE }
MULTI_LINE_STRING_SQ_START_INTER { "${" }
MULTI_LINE_STRING_SQ_INTER { SIMPLE_STRING_INTERPOLATION }
MULTI_LINE_STRING_SQ_END { "'''" }
@else MULTI_LINE_STRING_SQ_CONTENT
}
@local tokens {
MULTI_LINE_STRING_DQ_ESCAPE { ESCAPE_SEQUENCE }
MULTI_LINE_STRING_DQ_START_INTER { "${" }
MULTI_LINE_STRING_DQ_INTER { SIMPLE_STRING_INTERPOLATION }
MULTI_LINE_STRING_DQ_END { '"""' }
@else MULTI_LINE_STRING_DQ_CONTENT
}
@tokens {
WHITESPACE {
('\t' | ' ' | '\r' | '\n'| '\r\n')+
}
DIGIT {
$[0-9]
}
LETTER {
$[a-zA-Z]
}
HEX_DIGIT {
$[0-9a-fA-F]
}
EXPONENT {
$[eE] $[+-]? DIGIT+
}
RAW_SINGLE_LINE_STRING {
'r' "'" (!['\r\n])* "'" |
'r' '"' (!['\r\n])* '"'
}
ESCAPE_SEQUENCE {
'\n' | '\r' | '\f' | '\b' | '\t' | '\v' |
'\x' HEX_DIGIT HEX_DIGIT |
'\u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT |
'\u{' HEX_DIGIT HEX_DIGIT? HEX_DIGIT? HEX_DIGIT? HEX_DIGIT? HEX_DIGIT? '}' |
'\\' ![nrbtvxu\r\n]
}
SIMPLE_STRING_INTERPOLATION {
'$' IDENTIFIER_NO_DOLLAR
}
SINGLE_LINE_STRING_SQ_BEGIN { "'" }
SINGLE_LINE_STRING_DQ_BEGIN { '"' }
RAW_MULTI_LINE_STRING {
'r' "'''" _* "'''" |
'r' '"""' _* '"""'
}
MULTI_LINE_STRING_SQ_BEGIN { "'''" }
MULTI_LINE_STRING_DQ_BEGIN { '"""' }
@precedence { RAW_MULTI_LINE_STRING, RAW_SINGLE_LINE_STRING }
IDENTIFIER_NO_DOLLAR {
IDENTIFIER_START_NO_DOLLAR IDENTIFIER_PART_NO_DOLLAR*
}
IDENTIFIER_START_NO_DOLLAR {
LETTER | '_'
}
IDENTIFIER_PART_NO_DOLLAR {
IDENTIFIER_START_NO_DOLLAR | DIGIT
}
}
@skip {
WHITESPACE
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment