代码之家  ›  专栏  ›  技术社区  ›  Vinayak S

TypeScript antlr4ts侦听器类型引发错误

  •  2
  • Vinayak S  · 技术社区  · 7 年前

    我正在尝试在角度项目中使用antlr4解析器。

    有一个dataservice类,其中调用的函数如下所示

    parseRule() {
      const ruleString = ' STRING TO PARSE';
    
      const inputStream = new ANTLRInputStream(ruleString);
      const lexObject = new lexer.scopeLexer(inputStream);
      const tokenStream = new CommonTokenStream(lexObject);
      const parseObject = new parser.scopeParser(tokenStream);
      const result = parseObject.file();
      const evaluator = new ScopeEvaluator();
      const walker = new ParseTreeWalker();
    
      walker.walk(evaluator, result);
      console.log(' result :', result.text);
    }
    

    客户侦听器正在实现仅使用一个方法(enterNonGraphScope)导出的接口。

    import { scopeListener } from './antlrscope/scopeListener';
    import { NonGraphScopeContext, NamesetSimpleContext } from './antlrscope/scopeParser';
    
    export class ScopeEvaluator implements scopeListener {
    
      constructor() {
        console.log('constructed the asdfasf');
      }
    
      enterNonGraphScope = function (ctx: NonGraphScopeContext) {
        console.log('Tis ', ctx.text);
      };
    
    }
    

    正在粘贴scopeListener中的某些代码段。ts用于说明接口

    export interface scopeListener extends ParseTreeListener {
    
    /**
     * Enter a parse tree produced by the `NonGraphScope`
     * labeled alternative in `scopeParser.scope`.
     * @param ctx the parse tree
    */
    enterNonGraphScope?: (ctx: NonGraphScopeContext) => void;
    

    当我运行angular ng serve时,它正在编译typescript代码。 我出错了

    src/app/rule解析器出错。服务ts(31,17):错误TS2559:“ScopeEvaluator”类型没有与“ParseTreeListener”类型相同的属性。

    下面是在typescript中生成的侦听器。(已删除内容和antlr生成的注释)

    export interface scopeListener extends ParseTreeListener {
        enterNonGraphScope?: (ctx: NonGraphScopeContext) => void;
        exitNonGraphScope?: (ctx: NonGraphScopeContext) => void;
        enterBlockScope?: (ctx: BlockScopeContext) => void;
        exitBlockScope?: (ctx: BlockScopeContext) => void;
        enterNamesetSimple?: (ctx: NamesetSimpleContext) => void;
        exitNamesetSimple?: (ctx: NamesetSimpleContext) => void;
        enterGrainExpression?: (ctx: GrainExpressionContext) => void;
        exitGrainExpression?: (ctx: GrainExpressionContext) => void;
        enterGrainSimple?: (ctx: GrainSimpleContext) => void;
        exitGrainSimple?: (ctx: GrainSimpleContext) => void;
        enterNamesetExpression?: (ctx: NamesetExpressionContext) => void;
    }
    

    这似乎与typescript解释或键入有关。 我是javascript/typescript的新手。你能帮帮我吗?

    网页包/生成的javascript代码功能正常,但此错误阻止生成。

    非常感谢!

    -维纳亚克

    1 回复  |  直到 7 年前
        1
  •  1
  •   Vinayak S    7 年前

    我在谷歌上搜索了一下,发现这与弱类型处理更改有关。有关以下链接的更多详细信息。

    https://blogs.msdn.microsoft.com/typescript/2017/06/12/announcing-typescript-2-4-rc/

    在此基础上,在 After upgrading TypeScript, Angular controller registration now fails to compile

    下面是对实现接口的类的修改。 选项1更好,因为它只是一个类型断言。

    选项1

        parseRule() {
          const ruleString = ' Scope: (Dim1.Attr1 * &Namset1);' +
            ' Measure.[asdfa] = ddd ;' +
            'end scOPe;';
    
          const inputStream = new ANTLRInputStream(ruleString);
          const lexObject = new lexer.scopeLexer(inputStream);
          const tokenStream = new CommonTokenStream(lexObject);
          const parseObject = new parser.scopeParser(tokenStream);
          const result = parseObject.file();
          const evaluator = new ScopeEvaluator();
          const walker = new ParseTreeWalker();
          console.log(' type of ' , evaluator);
          walker.walk(evaluator as ParseTreeListener, result);
            // Parse and execute the code.
            console.log(' p :', parseObject);
          console.log(' result :', result.text);
        }
    

    选项2-涉及重新澄清材料?

                import { scopeListener } from './antlrscope/scopeListener';
                import { NonGraphScopeContext, NamesetSimpleContext } from './antlrscope/scopeParser';
                import { ParseTreeListener } from 'antlr4ts/tree/ParseTreeListener';
    
    
                export class ScopeEvaluator implements scopeListener {
    
                    visitTerminal = () => { };
                    visitErrorNode = () => { };
                    enterEveryRule = () => { };
                    exitEveryRule = () => { };
                    enterNonGraphScope = function (ctx: NonGraphScopeContext) {
                        console.log('Tis ', ctx.text);
                    };
                }
    

    如果你觉得这样做不对,请发表评论。我对typescript的理解还不完整。