JavaScript中的Antlr:不可能再次解析代码的一部分



我试图开发JavaScript中的UI,以解析我的Antlr4语法中所述的特定代码。我使用访客来解析代码的所有部分并生成问卷。之后,根据用户以JavaScript形式的输入,我解析了代码的最后一部分以生成结果(它接近了ANTLR书籍中起草的计算机制)。到目前为止,一切都很好。但是,我想以JavaScript形式修改输入,并第二次解析以再生和重新计算一些结果。目前,AST树变为空。我试图重新启动解析器,访客是创建解析器的新实例。似乎以前的解析器和Lexer仍然活跃,不可能"将光标移动"再次解析我的源代码的特定块。感谢您的宝贵帮助。克里斯

以下摘要文件和脚本。grammar.g4

pre
    :   title ('n')+
        author ('n')+
    ;               
peri
    :   (statement ('n')+)*
        (answer ('n')+)*
    ;   
post
    :   (feedback ('n')+)* 
    ;
exercise
        :   pre peri post
        ;
//End of Grammar

JavaScript主类:

class MyExercise {
constructor(){
    this.chars = antlr4.CharStreams.fromBuffer(input,'utf-8');
    this.lexer = new MyLexer(this.chars);
    this.tokens  = new antlr4.CommonTokenStream(this.lexer);
    this.parser = new MyParser(this.tokens);
    this.visitor = new LabeledVisitor(this.exercise,this.parser);
    this.parser.buildParseTrees = true;
    tree = this.parser.pre();
    this.visitor.visitPre(tree);
    tree = this.parser.peri();
    this.visitor.visitPeri(tree); 
    this.generateAnswersHTML() // generate HTML results and also inputfields to collect values from user.
    this.generateSubmitButton(); // generate submit HTML button
}
generateSubmitButton(){
    var button = document.createElement('input');
    button.setAttribute('type','submit');
    button.setAttribute('value','Check answer');
    button.addEventListener("click",this.checkAnswers.bind(this)); 
    document.getElementById("answer").appendChild(button);
}
checkAnswers(object){
   var tree = this.parser.post();
   this.visitor.visitPost(tree);
  this.generateFeeback(); //Generate HTML feedbacks (function of inputed values by user)
}
}

它第一次运行良好,但是当我再次单击"调用checkanswer()方法的按钮checkanswer时,树变为空。

有两种方法可以使您的输入重新制作:

  1. 每次重新创建输入流,令牌源 解析器。
  2. 通过

    重置您的输入流和令牌源
    • 重新创建您的输入流或将新文本加载到现有文本中。
    • call parser.reset()。
    • 在令牌源中再次设置您的输入流(要重置它,只需调用.reset()不会剪切)即可。lexer.setInputStream(input);
    • 出于同样的原因,再次将您的令牌源设置在令牌流中。tokens.setTokenSource(lexer);

相关内容

  • 没有找到相关文章

最新更新