diff --git a/css3/css3Lexer.g4 b/css3/css3Lexer.g4 new file mode 100644 index 0000000000..21b5fec920 --- /dev/null +++ b/css3/css3Lexer.g4 @@ -0,0 +1,556 @@ +lexer grammar css3Lexer; + +channels { ERROR } + +OpenBracket: '['; +CloseBracket: ']'; +OpenParen: '('; +CloseParen: ')'; +OpenBrace: '{'; +CloseBrace: '}'; +SemiColon: ';'; +Equal: '='; +Colon: ':'; +Dot: '.'; +Multiply: '*'; +Divide: '/'; +Pipe: '|'; +Underscore: '_'; +At: '@'; + +fragment Hex + : [0-9a-fA-F] + ; + +fragment NewlineOrSpace + : '\r\n' + | [ \t\r\n\f] + | + ; + +fragment Unicode + : '\\' Hex Hex? Hex? Hex? Hex? Hex? NewlineOrSpace + ; + +fragment Escape + : Unicode + | '\\' ~[\r\n\f0-9a-fA-F] + ; + +fragment Nmstart + : [_a-zA-Z] + | Nonascii + | Escape + ; + +fragment Nmchar + : [_a-zA-Z0-9\-] + | Nonascii + | Escape + ; + +// CSS2.2 Grammar defines the following, but I'm not sure how to add them to parser for error handling +// BadString : +// BadUri : +// BadComment : +// BadUri : + +Comment + : '/*' ~'*'* '*'+ ( ~[/*] ~'*'* '*'+ )* '/' + ; + +fragment Name + : Nmchar+ + ; + +fragment Url + : ( [!#$%&*-~] | Nonascii | Escape )* + ; + +Space + : [ \t\r\n\f]+ + ; + +fragment Whitespace + : Space + | + ; + +fragment Newline + : '\n' + | '\r\n' + | '\r' + | '\f' + ; + +fragment ZeroToFourZeros + : '0'? '0'? '0'? '0'? + ; + +fragment A + : 'a' + | 'A' + | '\\' ZeroToFourZeros ('41'|'61') NewlineOrSpace + ; + +fragment B + : 'b' + | 'B' + | '\\' ZeroToFourZeros ('42'|'62') NewlineOrSpace + ; + +fragment C + : 'c' + | 'C' + | '\\' ZeroToFourZeros ('43'|'63') NewlineOrSpace + ; + +fragment D + : 'd' + | 'D' + | '\\' ZeroToFourZeros ('44'|'64') NewlineOrSpace + ; + +fragment E + : 'e' + | 'E' + | '\\' ZeroToFourZeros ('45'|'65') NewlineOrSpace + ; + +fragment F + : 'f' + | 'F' + | '\\' ZeroToFourZeros ('46'|'66') NewlineOrSpace + ; + +fragment G + : 'g' + | 'G' + | '\\' ZeroToFourZeros ('47'|'67') NewlineOrSpace + | '\\g' + | '\\G' + ; + +fragment H + : 'h' + | 'H' + | '\\' ZeroToFourZeros ('48'|'68') NewlineOrSpace + | '\\h' + | '\\H' + ; + +fragment I + : 'i' + | 'I' + | '\\' ZeroToFourZeros ('49'|'69') NewlineOrSpace + | '\\i' + | '\\I' + ; + +fragment K + : 'k' + | 'K' + | '\\' ZeroToFourZeros ('4b'|'6b') NewlineOrSpace + | '\\k' + | '\\K' + ; + +fragment L + : 'l' + | 'L' + | '\\' ZeroToFourZeros ('4c'|'6c') NewlineOrSpace + | '\\l' + | '\\L' + ; + +fragment M + : 'm' + | 'M' + | '\\' ZeroToFourZeros ('4d'|'6d') NewlineOrSpace + | '\\m' + | '\\M' + ; + +fragment N + : 'n' + | 'N' + | '\\' ZeroToFourZeros ('4e'|'6e') NewlineOrSpace + | '\\n' + | '\\N' + ; + +fragment O + : 'o' + | 'O' + | '\\' ZeroToFourZeros ('4f'|'6f') NewlineOrSpace + | '\\o' + | '\\O' + ; + +fragment P + : 'p' + | 'P' + | '\\' ZeroToFourZeros ('50'|'70') NewlineOrSpace + | '\\p' + | '\\P' + ; + +fragment Q + : 'q' + | 'Q' + | '\\' ZeroToFourZeros ('51'|'71') NewlineOrSpace + | '\\q' + | '\\Q' + ; + +fragment R + : 'r' + | 'R' + | '\\' ZeroToFourZeros ('52'|'72') NewlineOrSpace + | '\\r' + | '\\R' + ; + +fragment S + : 's' + | 'S' + | '\\' ZeroToFourZeros ('53'|'73') NewlineOrSpace + | '\\s' + | '\\S' + ; + +fragment T + : 't' + | 'T' + | '\\' ZeroToFourZeros ('54'|'74') NewlineOrSpace + | '\\t' + | '\\T' + ; + +fragment U + : 'u' + | 'U' + | '\\' ZeroToFourZeros ('55'|'75') NewlineOrSpace + | '\\u' + | '\\U' + ; + +fragment V + : 'v' + | 'V' + | '\\' ZeroToFourZeros ('56'|'76') NewlineOrSpace + | '\\v' + | '\\V' + ; + +fragment W + : 'w' + | 'W' + | '\\' ZeroToFourZeros ('57'|'77') NewlineOrSpace + | '\\w' + | '\\W' + ; + +fragment X + : 'x' + | 'X' + | '\\' ZeroToFourZeros ('58'|'78') NewlineOrSpace + | '\\x' + | '\\X' + ; + +fragment Y + : 'y' + | 'Y' + | '\\' ZeroToFourZeros ('59'|'79') NewlineOrSpace + | '\\y' + | '\\Y' + ; + +fragment Z + : 'z' + | 'Z' + | '\\' ZeroToFourZeros ('5a'|'7a') NewlineOrSpace + | '\\z' + | '\\Z' + ; + +fragment DashChar + : '-' + | '\\' ZeroToFourZeros '2d' NewlineOrSpace + ; + +Cdo + : '' + ; + +Includes + : '~=' + ; + +DashMatch + : '|=' + ; + +Hash + : '#' Name + ; + +Import + : '@' I M P O R T + ; + +Page + : '@' P A G E + ; + +Media + : '@' M E D I A + ; + +Namespace + : '@' N A M E S P A C E + ; + +fragment AtKeyword + : '@' Ident + ; + +Charset + : '@charset ' + ; + +Important + : '!' ( Space | Comment )* I M P O R T A N T + ; + +fragment FontRelative + : Number E M + | Number E X + | Number C H + | Number R E M + ; + +// https://www.w3.org/TR/css3-values/#viewport-relative-lengths +fragment ViewportRelative + : Number V W + | Number V H + | Number V M I N + | Number V M A X + ; + +fragment AbsLength + : Number P X + | Number C M + | Number M M + | Number I N + | Number P T + | Number P C + | Number Q + ; + +fragment Angle + : Number D E G + | Number R A D + | Number G R A D + | Number T U R N + ; + +fragment Time + : Number M S + | Number S + ; + +fragment Freq + : Number H Z + | Number K H Z + ; + +Percentage + : Number '%' + ; + +Uri + : U R L '(' Whitespace String_ Whitespace ')' + | U R L '(' Whitespace Url Whitespace ')' + ; + +UnicodeRange + : [u|U] '+?' '?'? '?'? '?'? '?'? '?'? + | [u|U] '+' Hex '?'? '?'? '?'? '?'? '?'? + | [u|U] '+' Hex Hex '?'? '?'? '?'? '?'? + | [u|U] '+' Hex Hex Hex '?'? '?'? '?'? + | [u|U] '+' Hex Hex Hex Hex '?'? '?'? + | [u|U] '+' Hex Hex Hex Hex Hex '?'? + ; + +// https://www.w3.org/TR/css3-mediaqueries/ +MediaOnly + : O N L Y + ; + +Not + : N O T + ; + +And + : A N D + ; + +fragment Resolution + : Number D P I + | Number D P C M + | Number D P P X + ; + +fragment Length + : AbsLength + | FontRelative + | ViewportRelative + ; + +Dimension + : Length + | Time + | Freq + | Resolution + | Angle + ; + +UnknownDimension + : Number Ident + ; + +// https://www.w3.org/TR/css3-selectors/ +fragment Nonascii + : ~[\u0000-\u007f] + ; + +Plus + : '+' + ; + +Minus + : '-' + ; + +Greater + : '>' + ; + +Comma + : ',' + ; + +Tilde + : '~' + ; + +PseudoNot + : ':' N O T '(' + ; + +Number + : [0-9]+ + | [0-9]* '.' [0-9]+ + ; + +String_ + : '"' ( ~[\n\r\f\\"] | '\\' Newline | Nonascii | Escape )* '"' + | '\'' ( ~[\n\r\f\\'] | '\\' Newline | Nonascii | Escape )* '\'' + ; + +PrefixMatch + : '^=' + ; + +SuffixMatch + : '$=' + ; + +SubstringMatch + : '*=' + ; + +// https://www.w3.org/TR/css-fonts-3/#font-face-rule +FontFace + : '@' F O N T DashChar F A C E + ; + +// https://www.w3.org/TR/css3-conditional/ +Supports + : '@' S U P P O R T S + ; + +Or + : O R + ; + +// https://www.w3.org/TR/css3-animations/ +fragment VendorPrefix + : '-' M O Z '-' + | '-' W E B K I T '-' + | '-' O '-' + ; + +Keyframes + : '@' VendorPrefix? K E Y F R A M E S + ; + +From + : F R O M + ; + +To + : T O + ; + +// https://www.w3.org/TR/css3-values/#calc-syntax +Calc + : 'calc(' + ; + +// https://www.w3.org/TR/css-device-adapt-1/ +Viewport + : '@' V I E W P O R T + ; + +// https://www.w3.org/TR/css-counter-styles-3/ +CounterStyle + : '@' C O U N T E R DashChar S T Y L E + ; + +// https://www.w3.org/TR/css-fonts-3/ +FontFeatureValues + : '@' F O N T DashChar F E A T U R E DashChar V A L U E S + ; + +// https://msdn.microsoft.com/en-us/library/ms532847.aspx +DxImageTransform + : 'progid:DXImageTransform.Microsoft.' Function_ + ; + +// Variables +// https://www.w3.org/TR/css-variables-1 +Variable + : '--' Nmstart Nmchar* + ; + +Var + : 'var(' + ; + +// Give Ident least priority so that more specific rules matches first +Ident + : '-'? Nmstart Nmchar* + ; + +Function_ + : Ident '(' + ; + +UnexpectedCharacter: . -> channel(ERROR); diff --git a/css3/css3.g4 b/css3/css3Parser.g4 similarity index 54% rename from css3/css3.g4 rename to css3/css3Parser.g4 index 34e95237ee..a64769731c 100644 --- a/css3/css3.g4 +++ b/css3/css3Parser.g4 @@ -1,9 +1,8 @@ -grammar css3; +parser grammar css3Parser; -// This grammar follows the formal CSS2.2 grammar closely https://www.w3.org/TR/CSS22/grammar.html -// and adds some extent of error handling from https://www.w3.org/TR/CSS22/syndata.html#parsing-errors -// CSS3 modifications are then applied -// IE and vendor specific rules are added for real world usage +options { + tokenVocab=css3Lexer; +} stylesheet : ws ( charset ( Comment | Space | Cdo | Cdc )* )* ( imports ( Comment | Space | Cdo | Cdc )* )* ( namespace_ ( Comment | Space | Cdo | Cdc )* )* ( nestedStatement ( Comment | Space | Cdo | Cdc )* )* EOF @@ -434,539 +433,3 @@ ident ws : ( Comment | Space )* ; - -// Tokens -fragment Hex - : [0-9a-fA-F] - ; - -fragment NewlineOrSpace - : '\r\n' - | [ \t\r\n\f] - | - ; - -fragment Unicode - : '\\' Hex Hex? Hex? Hex? Hex? Hex? NewlineOrSpace - ; - -fragment Escape - : Unicode - | '\\' ~[\r\n\f0-9a-fA-F] - ; - -fragment Nmstart - : [_a-zA-Z] - | Nonascii - | Escape - ; - -fragment Nmchar - : [_a-zA-Z0-9\-] - | Nonascii - | Escape - ; - -// CSS2.2 Grammar defines the following, but I'm not sure how to add them to parser for error handling -// BadString : -// BadUri : -// BadComment : -// BadUri : - -Comment - : '/*' ~'*'* '*'+ ( ~[/*] ~'*'* '*'+ )* '/' - ; - -fragment Name - : Nmchar+ - ; - -fragment Url - : ( [!#$%&*-~] | Nonascii | Escape )* - ; - -Space - : [ \t\r\n\f]+ - ; - -fragment Whitespace - : Space - | - ; - -fragment Newline - : '\n' - | '\r\n' - | '\r' - | '\f' - ; - -fragment ZeroToFourZeros - : '0'? '0'? '0'? '0'? - ; - -fragment A - : 'a' - | 'A' - | '\\' ZeroToFourZeros ('41'|'61') NewlineOrSpace - ; - -fragment B - : 'b' - | 'B' - | '\\' ZeroToFourZeros ('42'|'62') NewlineOrSpace - ; - -fragment C - : 'c' - | 'C' - | '\\' ZeroToFourZeros ('43'|'63') NewlineOrSpace - ; - -fragment D - : 'd' - | 'D' - | '\\' ZeroToFourZeros ('44'|'64') NewlineOrSpace - ; - -fragment E - : 'e' - | 'E' - | '\\' ZeroToFourZeros ('45'|'65') NewlineOrSpace - ; - -fragment F - : 'f' - | 'F' - | '\\' ZeroToFourZeros ('46'|'66') NewlineOrSpace - ; - -fragment G - : 'g' - | 'G' - | '\\' ZeroToFourZeros ('47'|'67') NewlineOrSpace - | '\\g' - | '\\G' - ; - -fragment H - : 'h' - | 'H' - | '\\' ZeroToFourZeros ('48'|'68') NewlineOrSpace - | '\\h' - | '\\H' - ; - -fragment I - : 'i' - | 'I' - | '\\' ZeroToFourZeros ('49'|'69') NewlineOrSpace - | '\\i' - | '\\I' - ; - -fragment K - : 'k' - | 'K' - | '\\' ZeroToFourZeros ('4b'|'6b') NewlineOrSpace - | '\\k' - | '\\K' - ; - -fragment L - : 'l' - | 'L' - | '\\' ZeroToFourZeros ('4c'|'6c') NewlineOrSpace - | '\\l' - | '\\L' - ; - -fragment M - : 'm' - | 'M' - | '\\' ZeroToFourZeros ('4d'|'6d') NewlineOrSpace - | '\\m' - | '\\M' - ; - -fragment N - : 'n' - | 'N' - | '\\' ZeroToFourZeros ('4e'|'6e') NewlineOrSpace - | '\\n' - | '\\N' - ; - -fragment O - : 'o' - | 'O' - | '\\' ZeroToFourZeros ('4f'|'6f') NewlineOrSpace - | '\\o' - | '\\O' - ; - -fragment P - : 'p' - | 'P' - | '\\' ZeroToFourZeros ('50'|'70') NewlineOrSpace - | '\\p' - | '\\P' - ; - -fragment Q - : 'q' - | 'Q' - | '\\' ZeroToFourZeros ('51'|'71') NewlineOrSpace - | '\\q' - | '\\Q' - ; - -fragment R - : 'r' - | 'R' - | '\\' ZeroToFourZeros ('52'|'72') NewlineOrSpace - | '\\r' - | '\\R' - ; - -fragment S - : 's' - | 'S' - | '\\' ZeroToFourZeros ('53'|'73') NewlineOrSpace - | '\\s' - | '\\S' - ; - -fragment T - : 't' - | 'T' - | '\\' ZeroToFourZeros ('54'|'74') NewlineOrSpace - | '\\t' - | '\\T' - ; - -fragment U - : 'u' - | 'U' - | '\\' ZeroToFourZeros ('55'|'75') NewlineOrSpace - | '\\u' - | '\\U' - ; - -fragment V - : 'v' - | 'V' - | '\\' ZeroToFourZeros ('56'|'76') NewlineOrSpace - | '\\v' - | '\\V' - ; - -fragment W - : 'w' - | 'W' - | '\\' ZeroToFourZeros ('57'|'77') NewlineOrSpace - | '\\w' - | '\\W' - ; - -fragment X - : 'x' - | 'X' - | '\\' ZeroToFourZeros ('58'|'78') NewlineOrSpace - | '\\x' - | '\\X' - ; - -fragment Y - : 'y' - | 'Y' - | '\\' ZeroToFourZeros ('59'|'79') NewlineOrSpace - | '\\y' - | '\\Y' - ; - -fragment Z - : 'z' - | 'Z' - | '\\' ZeroToFourZeros ('5a'|'7a') NewlineOrSpace - | '\\z' - | '\\Z' - ; - -fragment DashChar - : '-' - | '\\' ZeroToFourZeros '2d' NewlineOrSpace - ; - -Cdo - : '' - ; - -Includes - : '~=' - ; - -DashMatch - : '|=' - ; - -Hash - : '#' Name - ; - -Import - : '@' I M P O R T - ; - -Page - : '@' P A G E - ; - -Media - : '@' M E D I A - ; - -Namespace - : '@' N A M E S P A C E - ; - -fragment AtKeyword - : '@' Ident - ; - -Charset - : '@charset ' - ; - -Important - : '!' ( Space | Comment )* I M P O R T A N T - ; - -fragment FontRelative - : Number E M - | Number E X - | Number C H - | Number R E M - ; - -// https://www.w3.org/TR/css3-values/#viewport-relative-lengths -fragment ViewportRelative - : Number V W - | Number V H - | Number V M I N - | Number V M A X - ; - -fragment AbsLength - : Number P X - | Number C M - | Number M M - | Number I N - | Number P T - | Number P C - | Number Q - ; - -fragment Angle - : Number D E G - | Number R A D - | Number G R A D - | Number T U R N - ; - -fragment Time - : Number M S - | Number S - ; - -fragment Freq - : Number H Z - | Number K H Z - ; - -Percentage - : Number '%' - ; - -Uri - : U R L '(' Whitespace String_ Whitespace ')' - | U R L '(' Whitespace Url Whitespace ')' - ; - -UnicodeRange - : [u|U] '+?' '?'? '?'? '?'? '?'? '?'? - | [u|U] '+' Hex '?'? '?'? '?'? '?'? '?'? - | [u|U] '+' Hex Hex '?'? '?'? '?'? '?'? - | [u|U] '+' Hex Hex Hex '?'? '?'? '?'? - | [u|U] '+' Hex Hex Hex Hex '?'? '?'? - | [u|U] '+' Hex Hex Hex Hex Hex '?'? - ; - -// https://www.w3.org/TR/css3-mediaqueries/ -MediaOnly - : O N L Y - ; - -Not - : N O T - ; - -And - : A N D - ; - -fragment Resolution - : Number D P I - | Number D P C M - | Number D P P X - ; - -fragment Length - : AbsLength - | FontRelative - | ViewportRelative - ; - -Dimension - : Length - | Time - | Freq - | Resolution - | Angle - ; - -UnknownDimension - : Number Ident - ; - -// https://www.w3.org/TR/css3-selectors/ -fragment Nonascii - : ~[\u0000-\u007f] - ; - -Plus - : '+' - ; - -Minus - : '-' - ; - -Greater - : '>' - ; - -Comma - : ',' - ; - -Tilde - : '~' - ; - -PseudoNot - : ':' N O T '(' - ; - -Number - : [0-9]+ - | [0-9]* '.' [0-9]+ - ; - -String_ - : '"' ( ~[\n\r\f\\"] | '\\' Newline | Nonascii | Escape )* '"' - | '\'' ( ~[\n\r\f\\'] | '\\' Newline | Nonascii | Escape )* '\'' - ; - -PrefixMatch - : '^=' - ; - -SuffixMatch - : '$=' - ; - -SubstringMatch - : '*=' - ; - -// https://www.w3.org/TR/css-fonts-3/#font-face-rule -FontFace - : '@' F O N T DashChar F A C E - ; - -// https://www.w3.org/TR/css3-conditional/ -Supports - : '@' S U P P O R T S - ; - -Or - : O R - ; - -// https://www.w3.org/TR/css3-animations/ -fragment VendorPrefix - : '-' M O Z '-' - | '-' W E B K I T '-' - | '-' O '-' - ; - -Keyframes - : '@' VendorPrefix? K E Y F R A M E S - ; - -From - : F R O M - ; - -To - : T O - ; - -// https://www.w3.org/TR/css3-values/#calc-syntax -Calc - : 'calc(' - ; - -// https://www.w3.org/TR/css-device-adapt-1/ -Viewport - : '@' V I E W P O R T - ; - -// https://www.w3.org/TR/css-counter-styles-3/ -CounterStyle - : '@' C O U N T E R DashChar S T Y L E - ; - -// https://www.w3.org/TR/css-fonts-3/ -FontFeatureValues - : '@' F O N T DashChar F E A T U R E DashChar V A L U E S - ; - -// https://msdn.microsoft.com/en-us/library/ms532847.aspx -DxImageTransform - : 'progid:DXImageTransform.Microsoft.' Function_ - ; - -// Variables -// https://www.w3.org/TR/css-variables-1 -Variable - : '--' Nmstart Nmchar* - ; - -Var - : 'var(' - ; - -// Give Ident least priority so that more specific rules matches first -Ident - : '-'? Nmstart Nmchar* - ; - -Function_ - : Ident '(' - ; diff --git a/css3/pom.xml b/css3/pom.xml index c0afb71701..9d02ac7f13 100644 --- a/css3/pom.xml +++ b/css3/pom.xml @@ -18,7 +18,8 @@ ${basedir} - css3.g4 + css3Lexer.g4 + css3Parser.g4 true true