IDEA开发多步骤对话框和ANTLR的生成的树的访问方式

  首先书写如何搞一个连续对话框,这里需要引用的是IDEA自带的东西,其中有一些步骤需要自己写一个重复对话框的时候需要注意。详细步骤如下:

        对话框需要extends的是AbstractEx,而不是WrapperDialog类。

        然后就是重写函数和注意点

        1.重写上下文相关的方法,首先是getStepId,需要给当前的页面一个ID,上下文可以标识到,根据自己的实际写,需要的是Object类

        2. 然后就是获取连续对话框上下文的方法 getNextStepID和getPreviousID两个函数,注意点是第一个和最后一个节点没有前和后节点,应该去返回null,如果有的话,请正确的指向。返回的结果stepID就是每一个都要getStepId中设置的。

        3. 下一个重写的方法是 getComplete。也不需要判断,这个就是能否点下一步的开关,可以在此添加整个对话完整性的限制。

        4.Commit 相当于暂存按钮,这个需要放以下这个步骤的提交按照dook的写即可,这样的话,上一步和下一步回来后内容也会在。

        5.Compenenet UI通用

        6. 以上是单个节点的需要注意重写的几个方法,其中构造函数就不再赘述,接下来是他的上一层,就是整个连续的对话框队列的设置。

        7. 首先是村一整个的过程的节点,使用一个类型为AbstractEx来将初始化好的节点放到list里面

        8.将上述数组整体传入一个ComponentCreationWizard中new的三个传参为整个连续框的名称、project,和7的list

        9.接下来每个对话框内部定义一个awe,注释内容是增加双向引用,每一个对话框的awe都要服职位刚才初始化的ComponentCreationWizard.

        10 之后可以考虑ide的事件队列,防止卡顿。IDEventQueue.Instance.getpopupManager.closeAllpopups.

         11 ComponentCreationWizard是一个事件对话框,showandget即可。

使用antlr。一个强力的文发生产工具,直接书写最基础的文峰,帮忙生成语法和词法解析,只需要在他的生成树下操作节点即可完成修改等情况。他的便利和递归是前后文强一致的,只需要按在层级包裹,每一个此都会放到合适的完全和原上下文一致的位置上。

        本次使用的是以C源文法为基础,进行一定程度的改造适应需要改造的文法,主要比较麻烦的点是上下文注释的强一致性将注释进行完美保留,则需要尽力考虑到注释可能出现的所有位置,而其他的类似的都没有考虑注释的问题,直接将注释放到另外一个通道skip了,就不用担心上下文问题。

        接下来介绍一下通道和树的概念,antlr中的树都是只考虑默认通道0中的元素来构造一个树,一些独立的内容等情况自己可以在文法中将其放到不同的通道中去,可以先跑一个的时候获取通道中的内容,这些也都会具有上下文相关的内容,只不过需要添加到上下文需要进行额外的分析,放到通道内的建议是可以独立法呢系的情况。而有一些将要舍弃的内容 例如/r/。。多余的space 都可以-》skip给舍弃掉。

        下面写以下实际调用通道中内容和通道0中每一个节点的方法。生成利用antlr 命令行或者工具。

        1.首先是通用的要传入文件,需要将文件给传到一个antlrInputStream 看源码是可以传入字符和reader的。但是没有额外处理,流是比较快的。但是主要要调整编码格式,特别是含汉字的时候。

        之后要利用他的lexer词法生成的类,根据文法具体名称使用具体的lexer将流转换成一个elexer, New laxer(stream)

        然后就是利用 一个CommonTokenStream将上文中的lexer传入初始化,生成一个CommonTokenStream。

        2. 这里是写取其他通道的数据的情况,如果想获取,需要操作CommonTokenStream。利用

CommonTokenStream。fills方法后以Token为sign 循环CommonTokenStream即可

        此时利用getchanel获取信道参数,是几号信道直接比较即可,主要是获取其他信道要先fills。否则的话获取不到,fills会有额外耗时。

        3.接下来是形成parser,这一步是必须的,new parser(CommonTokenStream)来获取,然后parser就可以形成树了,需要告诉其入口,就是树的根节点。或者文法的某一部分的话是其他节点。将parser直接(.入口符号)即形成了树,然后是两个不同的引入自己写的扩展节点的类,分别是visitor和listener,两种方式就覆盖原生的方法,树便利是会走这重写的方法。区别是 listener没有返回值,而visitor有返回值。对于节点的修改,分别是利用返回值和直接修改默认值来完成。

        4.visitor的调用形式 new 以下自己写的visitor 容纳后调用visitor.visit(tree) 3中得到

        5.Listener形式,进入某节点,修改上下文节点上的内容,不写返回值。会将上下文返回回来,调用方式,new ParesTreeWalk() walk.walk(new Listener,tree)、listener多引入了一个walker,在walker传入listener和tree

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值