Если у вас есть существующая грамматика ANTLR и вы хотите подсчитывать определенные вещи во время анализа, вы можете сделать что-то вроде этого:
grammar ExistingGrammar;
// ...
@parser::members {
public int loc = 0;
}
// ...
someParserRule
: SomeLexerRule someOtherParserRule {loc++;}
;
// ...
Итак, всякий раз, когда ваш опарсер встречает someParserRule
, вы увеличиваете loc
на единицу, помещая {loc++;}
после (или до) правила.
Итак, каким бы ни было ваше определение строки кода , просто поместите {loc++;}
в правило, чтобы увеличить счетчик. Будьте осторожны, чтобы не увеличить его вдвое:
statement
: someParserRule {loc++;}
| // ...
;
someParserRule
: SomeLexerRule someOtherParserRule {loc++;}
;
EDIT
Я только что заметил, что в заголовке вашего вопроса вы спрашивали, можно ли это сделать во время лексизма. Это не будет возможно. Допустим, LoC всегда заканчивается ';'
. Во время lexing вы не сможете провести различие между ';'
после, скажем, присваивания (которое является одним LoC), и 2 ';'
s внутри оператора for(int i = 0; i < n; i++) { ... }
(который не будет быть 2 LoC).