Вы можете увидеть пример этого в анализаторе Java Учебного автомата, который здесь .
Сначала вам нужно изменить тип SimpleNode
, включив в него поле для строкичисло.В TM я добавил объявление
private SourceCoords myCoords ;
, где SourceCoords
- это тип, который включает в себя не только номер строки, но и информацию о том, в каком файле была строка. Вы можете просто использовать int
поле.Также в SimpleNode
вам необходимо объявить некоторые методы, подобные этому
public void setCoords( SourceCoords toSet ) { myCoords = toSet ; }
public SourceCoords getCoords() { return myCoords ; }
Возможно, вы захотите объявить их и в интерфейсе Node
.
Over в вашем файле .jjt
,используйте опцию
NODE_SCOPE_HOOK=true;
и объявите два метода в вашем классе синтаксического анализатора
void jjtreeOpenNodeScope(Node n) {
((SimpleNode)n).setCoords( new SourceCoords( file, getToken(1).beginLine ) ) ;
}
void jjtreeCloseNodeScope(Node n) {
}
Хмм.Вероятно, я должен был объявить методы в Node
, чтобы избежать этого уродливого приведения.
Еще одна вещь, вы сами ведете счет строк.Лучше получить номер строки из токена, как я.Ваш счетчик будет обычно на один токен впереди.Но когда синтаксический анализатор смотрит вперед, он может быть на несколько токенов впереди.
Если менеджер токенов не правильно учитывает количество строк, тогда используйте свой собственный счетчик, но сообщайте его парсеру через дополнительныеполе в Token
классе.
Обычно плохая идея вычислять что-либо в менеджере токенов, а затем использовать его в анализаторе, если только его информация не хранится в токенах.