Mike75
Mike75

Reputation: 524

ANTLR4 parser detection

This is my first try with an ANTLR4-grammar. It should recognize a very easy statement, starting with the command 'label', followed by a colon, then an arbitrary text, ended by semicolon. But the parser does not recognize 'label' as description. Why?

grammar test;



 prog: stat+;

  stat:  
    description content
  ;

  description: 
     'label' COLON   
  ;

  content: 
    TEXT 
  ;

  TEXT: 
     .*? ';'
  ;

  STRING : '"' ('""'|~'"')* '"' ; // quote-quote is an escaped quote

  COMMENT
    : '//' (~('\n'|'\r'))*
  ; 

  COLON      : ':' ;
  ID: [a-zA-z]+;
  INT: [0-9]+;
  NEWLINE: '\r'? '\n';
  WS  :   [ \t\n\r]+ -> skip ;

An example for the code:

label: 
this is an error;


wronglabel:YYY
this should be a error;

The error is:

line 1:0 mismatched input 'label: \nthis is an error;' expecting 'label' (prog label: \nthis is an error; \n\n\nwronglabel:YYY\nthis should be a error; \n)

Upvotes: 2

Views: 144

Answers (1)

Mike75
Mike75

Reputation: 524

This works much better:

grammar test;

 prog: stat+;

  stat:  
    description content
  ;

  description: 
     'label' COLON   
  ;

  content: 
    text 
  ;

  text: 
     .*? ';'
  ;

  STRING : '"' ('""'|~'"')* '"' ; // quote-quote is an escaped quote

  COMMENT
    : '//' (~('\n'|'\r'))*
  ; 

  COLON      : ':' ;
  ID: [a-zA-z]+;
  NEWLINE: '\r'? '\n';
  WS  :   [ \t\n\r]+ -> skip ;

Seems I mixed lexer and parser rules: lexer rules have to be lower case, parser rules uppercase. So I changed the TEXT-rule into a text-rule.

Upvotes: 1

Related Questions