/**

Copyright 2019 Alain Dargelas

Licensed 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.

*/

// WIP

lexer grammar SV3_1aSplitterLexer;

// A.9.2 Comments

One_line_comment : '//' Comment_text '\r'? '\n' ;

Block_comment : '/*' Comment_text '*/' ;

fragment Comment_text : (WS | CR | TAB)* | .*? ;

MODULE : 'module';

ENDMODULE : 'endmodule' ;

INTERFACE : 'interface' ;

ENDINTERFACE : 'endinterface' ;

PROGRAM : 'program' ;

ENDPROGRAM : 'endprogram' ;

PRIMITIVE : 'primivite' ;

ENDPRIMITIVE : 'endprimitive' ;

PACKAGE : 'package' ;

ENDPACKAGE : 'endpackage' ;

CHECKER : 'checker' ;

ENDCHECKER : 'endchecker' ;

CONFIG : 'config' ;

ENDCONFIG : 'endconfig' ;
 
String
 : '"'                          // a opening quote
   (                            // start group
     '\\' ~('\r')        // an escaped char other than a line break char
     |                          // OR
     ~('\\' | '"'| '\r' | '\n') // any char other than '"', '\' and line breaks
   )*                           // end group and repeat zero or more times
   '"'                          // the closing quote
 ;

Spaces : (WS | TAB)+;



fragment WS : [ ]+ ;

fragment TAB : [\t]+ ;

CR : [\r\n] ;


ANY : .;
