Объявления JJTree Token Manager - PullRequest
       43

Объявления JJTree Token Manager

0 голосов
/ 15 декабря 2018

Привет всем У меня есть следующий код в моем файле .jjt для моего абстрактного синтаксического дерева для проверки отслеживания, где сделаны узлы в переданном ему файле, но я не могу получить доступ к этой переменной из своего класса семантической проверки.Код ниже и любая помощь будет оценена!Я перепробовал все и теряю надежду на этом этапе.Это целое число в файле .jjt, к которому я хотел бы получить доступ TOKEN_MGR_DECLS:

{
    static int commentNesting = 0;
    public  static int linenumber = 0;


}

SKIP : /*STRUCTURES AND CHARACTERS TO SCAPE*/
{
 " "
|  "\t"
|  "\n" {linenumber++;}
|  "\r"
|  "\f"
}

Пример одного из моих узлов

void VariableDeclaration() #VariableDeclaration : {Token t; String id; String type;}
{
    t = <VARIABLE> id = Identifier() <COLON> type = Type() 

}

Мой класс семантической проверки

public class SemanticCheckVisitor implements "My jjt file visitor" {
    public Object visit(VariableDeclaration node, Object data) {
        node.childrenAccept(this, data);
        return data;
    }

Как можно получить номер белья, который был объявлен этим узлом?Спасибо всем.

}

1 Ответ

0 голосов
/ 18 декабря 2018

Вы можете увидеть пример этого в анализаторе 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 классе.

Обычно плохая идея вычислять что-либо в менеджере токенов, а затем использовать его в анализаторе, если только его информация не хранится в токенах.

...