Я смущен спецификацией Java о том, как этот код следует обозначать:
ArrayList<ArrayList<Integer>> i;
Спектр говорит:
Самый длинный возможный перевод используется на каждом шаге, даже если результат в конечном итоге не делает правильную программу, в то время как другой лексический перевод будет.
Как я понимаю, применение правила "longest match" приведет к токенам:
- ArrayList
- <
- ArrayList
- <
- Integer <Литий → >
- я
- ;
который не будет разбираться. Но, конечно, этот код разбирается просто отлично.
Какова правильная спецификация для этого случая?
Означает ли это, что правильный лексер должен быть контекстным? Это не представляется возможным с помощью regular lexer.