anchor.diff:  
   // 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);
   
  
positive.code: grammar QlsGrammar;
  
  stylesheet
      : STYLESHEET Identifier (page)*
      ;
  
  page
      : PAGE Identifier OPEN_BRACE (section|defaultBlock)* CLOSE_BRACE
      ;
  
  section
      : SECTION StringLiteral OPEN_BRACE (question|section|defaultBlock)* CLOSE_BRACE
      ;
  
  question	
  	: QUESTION Identifier widget?
  	;
  
  widget
  	: WIDGET widgetType 
  	;
  
  defaultBlock
  	: DEFAULT type widget
  	| DEFAULT type OPEN_BRACE (styleRule)* widget CLOSE_BRACE
  	;
  
  styleRule
  	: 'height' COLON IntegerLiteral     # heightStyleRule
      | 'width' COLON IntegerLiteral      # widthStyleRule
      | 'fontsize' COLON IntegerLiteral   # fontSizeStyleRule
      | 'color' COLON HexColorLiteral     # colorStyleRule
      | 'fontstyle' COLON StringLiteral   # fontStyleStyleRule
      | 'font' COLON StringLiteral        # fontNameStyleRule
  	;
  
  widgetType
      : 'spinbox' # spinboxWidgetType
      | 'radio' optionsList # radioWidgetType
      | 'dropdown' optionsList # dropdownWidgetType
      | 'checkbox' # checkboxWidgetType
      ;
  
  optionsList
  	: OPEN_PARENTHESIS option CLOSE_PARENTHESIS
  	;
  
  option
  
negative.code:     
  LineComment 
      :   '//' ~[\r\n]* -> channel(HIDDEN);
  
  BooleanLieral :  'true' | 'false';
  IntegerLiteral  :   ('0'..'9')+;
  