ANTRL простая грамматика и идентификатор - PullRequest
1 голос
/ 23 декабря 2011

Я написал эту простую грамматику для ANTLR

grammar ALang;

@members {

public static void main(String[] args) throws Exception {   
    ALangLexer lex = new ALangLexer(new ANTLRFileStream("antlr/ALang.al"));
    CommonTokenStream tokens = new CommonTokenStream(lex);
    ALangParser parser = new ALangParser(tokens);
    parser.prog();
} 

}

prog : 
    ID | PRINT
    ;

PRINT : 'print';
ID : ( 'a'..'z' | 'A'..'Z' )+;
WS : (' ' | '\t' | '\n' | '\r')+ { skip(); };

Использование в качестве ввода:

print

единственный найденный токен - это токен типа ID. Разве недостаточно поместить определение токена PRINT прямо перед определением идентификатора?

1 Ответ

1 голос
/ 23 декабря 2011

ALang.g: 21: 1: Следующие определения токенов никогда не могут быть сопоставлены, поскольку предыдущие токены совпадают с одним и тем же входом: PRINT

Да, этого достаточно.Если вы определите PRINT после ID, ANTLR выдаст ошибку:

ALang.g:21:1: The following token definitions can never be matched because prior tokens match the same input: PRINT 

Извините, я не хотел использовать эту продукцию: ПЕЧАТЬ: «печать»;но производство без запаздывания: PRINT: 'print';Проблема в том, что «print» получен из ID, а не из PRINT

Нет, это не может быть так.

Следующее:

grammar ALang;

@members {
  public static void main(String[] args) throws Exception {  
    ALangLexer lex = new ALangLexer(new ANTLRStringStream("sprint print prints foo"));
    CommonTokenStream tokens = new CommonTokenStream(lex);
    ALangParser parser = new ALangParser(tokens);
    parser.prog();
  } 
}

prog
 : ( ID    {System.out.printf("ID    :: '\%s'\n", $ID.text);}
   | PRINT {System.out.printf("PRINT :: '\%s'\n", $PRINT.text);}
   )*
   EOF
 ;

PRINT : 'print';
ID    : ('a'..'z' | 'A'..'Z')+;
WS    : (' ' | '\t' | '\n' | '\r')+ {skip();};

напечатает:

ID    :: 'sprint'
PRINT :: 'print'
ID    :: 'prints'
ID    :: 'foo'

Как видите, PRINT правило соответствует совпадению "print".

...