blob: fce5e6a542593efc5a7f6ce64971fc7267c2f4dc [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE
* file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file
* to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
lexer grammar TomlLexer;
channels { COMMENTS, WHITESPACE }
tokens { TripleQuotationMark, TripleApostrophe, StringChar, Comma }
@header {
package org.apache.tuweni.toml.internal;
}
@members {
private final IntegerStack arrayDepthStack = new IntegerStack();
private int arrayDepth = 0;
private void resetArrayDepth() {
arrayDepthStack.clear();
arrayDepth = 0;
}
private void pushArrayDepth() {
arrayDepthStack.push(arrayDepth);
arrayDepth = 0;
}
private void popArrayDepth() {
arrayDepth = arrayDepthStack.pop();
}
}
fragment WSChar : [ \t];
fragment NL : '\r'? '\n';
fragment COMMENT : '#' (~'\n')*;
fragment Alpha : [A-Za-z];
fragment Digit : [0-9];
fragment Digit1_9 : [1-9];
fragment Digit0_7 : [0-7];
fragment Digit0_1 : [0-1];
fragment HexDig : Digit | [A-Fa-f];
fragment UNQUOTED_KEY : (Alpha | Digit | '-' | '_')+;
Dot : '.';
Equals : '=' { resetArrayDepth(); } -> pushMode(ValueMode);
QuotationMark : '"' -> pushMode(BasicStringMode);
Apostrophe : '\'' -> pushMode(LiteralStringMode);
TableKeyStart : '[';
TableKeyEnd : ']';
ArrayTableKeyStart : '[[';
ArrayTableKeyEnd : ']]';
UnquotedKey : UNQUOTED_KEY;
WS : WSChar+ -> channel(WHITESPACE);
Comment : COMMENT -> channel(COMMENTS);
NewLine : NL { setText(System.lineSeparator()); };
Error : .;
mode KeyMode;
KeyDot : '.' -> type(Dot);
KeyQuotationMark : '"' -> type(QuotationMark), pushMode(BasicStringMode);
KeyApostrophe : '\'' -> type(Apostrophe), pushMode(LiteralStringMode);
KeyUnquotedKey : UNQUOTED_KEY -> type(UnquotedKey);
KeyWS : WSChar+ -> type(WS), channel(WHITESPACE);
KeyError : . -> type(Error);
mode ValueMode;
// Strings
ValueQuotationMark : '"' -> type(QuotationMark), mode(BasicStringMode);
ValueTripleQuotationMark : '"""' NL? -> type(TripleQuotationMark), mode(MLBasicStringMode);
ValueApostrophe : '\'' -> type(Apostrophe), mode(LiteralStringMode);
ValueTripleApostrophe : '\'\'\'' NL? -> type(TripleApostrophe), mode(MLLiteralStringMode);
// Integers
fragment DecInt : [-+]? (Digit | Digit1_9 ('_'? Digit)+);
DecimalInteger : DecInt { "-:".indexOf(_input.LA(1)) < 0 }? -> popMode;
HexInteger : '0x' HexDig ('_'? HexDig)* -> popMode;
OctalInteger : '0o' Digit0_7 ('_'? Digit0_7)* -> popMode;
BinaryInteger : '0b' Digit0_1 ('_'? Digit0_1)* -> popMode;
// Float
fragment Exp : [eE] DecInt;
fragment Frac : '.' Digit ('_'? Digit)*;
FloatingPoint : DecInt (Exp | Frac Exp?) -> popMode;
FloatingPointInf: [-+]? 'inf' -> popMode;
FloatingPointNaN : [-+]? 'nan' -> popMode;
// Boolean
TrueBoolean : 'true' -> popMode;
FalseBoolean : 'false' -> popMode;
// Date and Time
ValueDateStart : Digit+ { "-:".indexOf(_input.LA(1)) >= 0 }? -> type(DateDigits), mode(DateMode);
// Array
ArrayStart : '[' { arrayDepth++; } -> pushMode(ValueMode);
ArrayEnd : ']' { arrayDepth--; } -> popMode;
ArrayComma : ',' { arrayDepth > 0 }? -> type(Comma), pushMode(ValueMode);
// Table
InlineTableStart : '{' { pushArrayDepth(); } -> mode(InlineTableMode);
ValueWS : WSChar+ -> type(WS), channel(WHITESPACE);
ValueComment : COMMENT -> type(Comment), channel(COMMENTS);
ArrayNewLine: NL { arrayDepth > 0}? -> type(NewLine);
ValueNewLine: NL { arrayDepth == 0}? -> type(NewLine), popMode;
ValueError : . -> type(Error), popMode;
mode BasicStringMode;
BasicStringEnd : '"' -> type(QuotationMark), popMode;
BasicStringUnescaped : ~[\u0000-\u001F"\\\u007F] -> type(StringChar);
EscapeSequence
: '\\' ~[\n]
| '\\u' HexDig HexDig HexDig HexDig
| '\\U' HexDig HexDig HexDig HexDig HexDig HexDig HexDig HexDig;
BasicStringNewLine: NL { setText(System.lineSeparator()); } -> type(NewLine), popMode;
BasicStringError : . -> type(Error), popMode;
mode MLBasicStringMode;
MLBasicStringEnd : '"""' -> type(TripleQuotationMark), popMode;
MLBasicStringLineEnd : '\\' [ \t]* NL { setText(System.lineSeparator()); } -> type(NewLine);
MLBasicStringUnescaped : ~[\u0000-\u001F\\\u007F] -> type(StringChar);
MLBasicStringEscape :
('\\u' HexDig HexDig HexDig HexDig
| '\\U' HexDig HexDig HexDig HexDig HexDig HexDig HexDig HexDig
| '\\' .) -> type(EscapeSequence);
MLBasicStringNewLine: NL { setText(System.lineSeparator()); } -> type(NewLine);
MLBasicStringError : . -> type(Error), popMode;
mode LiteralStringMode;
LiteralStringEnd : '\'' -> type(Apostrophe), popMode;
LiteralStringChar : ~[\u0000-\u0008\u000A-\u001F'\u007F] -> type(StringChar);
LiteralStringNewLine: NL { setText(System.lineSeparator()); } -> type(NewLine), popMode;
LiteralStringError : . -> type(Error), popMode;
mode MLLiteralStringMode;
MLLiteralStringEnd : '\'\'\'' -> type(TripleApostrophe), popMode;
MLLiteralStringChar : ~[\u0000-\u0008\u000A-\u001F\u007F] -> type(StringChar);
MLLiteralStringNewLine: NL { setText(System.lineSeparator()); } -> type(NewLine);
MLLiteralStringError : . -> type(Error), popMode;
mode DateMode;
Dash : '-';
Plus : '+';
Colon : ':';
DateDot : '.' -> type(Dot);
Z : 'Z';
TimeDelimiter : [Tt] | (' ' { _input.LA(1) >= '0' && _input.LA(1) <= '9' }?);
DateDigits : Digit+;
DateWS : WSChar+ -> type(WS), channel(WHITESPACE), popMode;
DateComment : COMMENT -> type(Comment), channel(COMMENTS), popMode;
DateNewLine: NL { setText(System.lineSeparator()); } -> type(NewLine), popMode;
DateComma: ',' -> type(Comma), popMode;
DateError : . -> type(Error), popMode;
mode InlineTableMode;
InlineTableEnd : '}' { popArrayDepth(); } -> popMode;
InlineTableDot : '.' -> type(Dot);
InlineTableEquals : '=' -> type(Equals), pushMode(ValueMode);
InlineTableComma : ',' -> type(Comma);
InlineTableQuotationMark : '"' -> type(QuotationMark), pushMode(BasicStringMode);
InlineTableApostrophe : '\'' -> type(Apostrophe), pushMode(LiteralStringMode);
InlineTableUnquotedKey : UNQUOTED_KEY -> type(UnquotedKey);
InlineTableWS : WSChar+ -> type(WS), channel(WHITESPACE);
InlineTableComment : COMMENT -> type(Comment), channel(COMMENTS), popMode;
InlineTableNewLine : NL { setText(System.lineSeparator()); } -> type(NewLine), popMode;
InlineTableError : . -> type(Error), popMode;