anchor.diff:      
   LineComment 
       :   '//' ~[\r\n]* -> channel(HIDDEN);
  -
  -Boolean : 'bool';
  -Integer : 'int';
  -String : 'str';
   
   BooleanLieral :  'true' | 'false';
   IntegerLiteral  :   ('0'..'9')+;
  
positive.code: 
  // Lexer tokens. Move to separate file?
  
  // Keywords
  STYLESHEET : 'stylesheet';
  PAGE : 'page';
  QUESTION : 'question';
  SECTION: 'section';
  WIDGET: 'widget';
  DEFAULT: 'default';
  
  
  // Syntax
  OPEN_BRACE : '{';
  CLOSE_BRACE : '}';
  OPEN_PARENTHESIS : '(';
  CLOSE_PARENTHESIS : ')';
  SEMICOLON : ';';
  COLON: ':';
  
  WhiteSpace : (' ' | '\t' | '\n' | '\r') -> channel(HIDDEN);
  
  
negative.code: grammar QlsGrammar;
  
  stylesheet
      : 'stylesheet' Identifier (page)*
      ;
  
  page
      : 'page' Identifier '{' (section|defaultBlock)* '}'
      ;
  
  section
      : 'section' StringLiteral '{' (question|section|defaultBlock)* '}'
      ;
  
  question	
  	: 'question' Identifier widget?
  	;
  
  widget
  	: 'widget' widgetType 
  	;
  
  defaultBlock
  	: 'default' type widget
  	| 'default' type '{' (styleRule)* widget '}'
  	;
  
  styleRule
  	: 'height' ':' IntegerLiteral     # heightStyleRule
      | 'width' ':' IntegerLiteral      # widthStyleRule
      | 'fontsize' ':' IntegerLiteral   # fontSizeStyleRule
      | 'color' ':' HexColorLiteral     # colorStyleRule
      | 'fontstyle' ':' StringLiteral   # fontStyleStyleRule
      | 'font' ':' StringLiteral        # fontNameStyleRule
  	;
  
  widgetType
      : 'spinbox'                 # spinboxWidgetType
      | 'radio' optionsList       # radioWidgetType
      | 'dropdown' optionsList    # dropdownWidgetType
      | 'checkbox'                # checkboxWidgetType
      ;
  
  optionsList
  	: '(' option ')'
  	;
  
  option
  