+ -
当前位置:首页 → 问答吧 → JavaCC JJTree

JavaCC JJTree

时间:2014-03-12

来源:互联网

工作关系, 有堆 PL/SQL 唔想单靠肉眼睇, 想准确啲用电脑睇. 於是谂返起 yacc 嗰啲嘢, 最后搵到 JavaCC.

JavaCC 即系 "Java Compiler Compiler, The Java Parser Generator" (https://javacc.java.net/).

FreeMarker 呢个 template library 都系用佢.

javacc 个 grammar repository 咁啱又有目标文法个档, 就下载嚟试试.

搅咗几日先识用, 终於可以将想要既嘢拎到出嚟. 效果唔错. 用呢个工具产生出嚟既 parser 产生出嚟既 abstract syntax tree 可以继续写 Java 去探访每个节点, 达到非常准确的语意分析, 从而分析 SP 入面 call 某个 procedure 用咗啲乜嘢 parameters, 最终会整理出一个给人看的列表.

深感 JavaCC, JJTree 及其 Eclipse plugin 之好用, 在此绍介给大家.

作者: a8d7e8   发布时间: 2014-03-12

如果想做更复杂嘅嘢,又或想用一个更多功能、更先进、较活跃(指更新、维护)嘅替代品,我推荐 ANTLR:
http://www.antlr.org/

作者: fitcat07   发布时间: 2014-03-12

谢谢! 你有无用过 ANTLR?

感觉上 ANTLR 既学习曲线都几 steep. 如果可以可以在这里讨论下吗?
引用:原帖由 fitcat07 於 2013-12-8 13:50 发表
如果想做更复杂嘅嘢,又或想用一个更多功能、更先进、较活跃(指更新、维护)嘅替代品,我推荐 ANTLR:
http://www.antlr.org/

作者: a8d7e8   发布时间: 2014-03-12

咦, 原来 anltr4 简化咗, 可以用 custom parse listener 处理需要既 nodes, 不过未搵到 antlr4 的 pl/sql grammar....

如果有 Grammar file 应该方便过 JavaCC!

作者: a8d7e8   发布时间: 2014-03-12

我未用过 ANTLR。
我睇紧 ANTLR 作者写嘅书:Language Implementation Patterns,书中大量使用 ANTLR V3 做例,睇落好好用,因此大胆推介。
啱啱用 google 搵到:
http://www.antlr3.org/grammar/list.html
入面都有好多 PL/SQL grammar 喎。

作者: fitcat07   发布时间: 2014-03-12

v3 的 grammar 我都搵到.

既然出咗 v4, 我当然想用返 v4.

因为睇呢度 的 v4 做法其实同 JavaCC + JJTree 好相似. (v3 版则好像不太好吧....)

都只系加 # NodeName, 再写 custom parse listener or visitor.

分别系 v4 似乎学习咗 JavaCC 的优点, 再将 JavaCC 需要用 JJTree 呢个依赖性移除, 直接在 v4 加入 AST, listener/visitor 等支援.

而且如果 anltr v4 可直接拎到 node 入面的 strings, 就会比 JavaCC+JJTree 简单得多. 后者每个 node 只有 firstToken 同 lastToken 可取用, 即系要做 recursion 去到 leaf 先可拎晒所有 function call 的 nodes (包括埋 comma..).
引用:原帖由 fitcat07 於 2013-12-9 11:22 发表
我未用过 ANTLR。
我睇紧 ANTLR 作者写嘅书:Language Implementation Patterns,书中大量使用 ANTLR V3 做例,睇落好好用,因此大胆推介。
啱啱用 google 搵到:
htt ...
Edit: 原来上面应为 v4(现为红色)的地方打错了 v3!

[ 本帖最后由 a8d7e8 於 2013-12-9 08:12 PM 编辑 ]

作者: a8d7e8   发布时间: 2014-03-12

用 V3 定系 V4,睇你想要做尐乜啦。
如果想快尐做到嘢,用 V3,因为已经有大把现成 grammar。
想学嘢,或想将来可以延伸及维护,V4 一定较好。佢本书我谂唔睇唔得:http://pragprog.com/book/tpantlr ... e-antlr-4-reference

作者: fitcat07   发布时间: 2014-03-12

引用:原帖由 fitcat07 於 2013-12-9 19:34 发表
用 V3 定系 V4,睇你想要做尐乜啦。
如果想快尐做到嘢,用 V3,因为已经有大把现成 grammar。
想学嘢,或想将来可以延伸及维护,V4 一定较好。佢本书我谂唔睇唔得:http://pragprog.com/book/tpantlr2 ...
我想抽取所有 doit() 的 procedure call, 并对 argument list 做 variable/function resolution 来得出一个可知道所有对 doit 呼叫的可能输入的列表:
复制内容到剪贴板代码:procedure.....
procedure doit(p1,p2,p3)
end;

begin
doit('well', var1, funcA(1,2,3));

doit(var2, 'asf', var3);
end;
用 JavaCC (要用 5.0, 事关 6.0 有 bug....) + JJTree 做法同 ANLTR v4 的做法大同小异, ANLTR v3 则未研究应该点写......

如你睇嗰本书啲例子咁啱有做呢样嘢, 可否分享下啊?

作者: a8d7e8   发布时间: 2014-03-12

唔太明白「所有对 doit 呼叫的可能输入的列表」所指,有输出例子最好。
照我所知,V3 同 V4 都支援建立 AST,同使用 tree visitor。而 V4 就好似更自动化,亦唔再支援 in-grammar actions。
Chapter 11 of LIP 就系讲 Translating Computer Languages。如果你要求系唔需要 semantic analysis,你可能只须要做一个简单嘅 language translator。就好似一见到呼叫 doit(),就将所有参数列出。作者称为 Syntax-Directed Translation (Pattern 29),即喺 grammar 内,加入 actions,当遇到呼叫 doit() 就呼叫相应函数,来将所需资料输出。不过,呢个做法,好似 V4 唔再支援。可能要改用更通用嘅 Target-Specific Generator Classes (Pattern 31)。主要分别系唔会喺 grammar 内加入 actions,而系利用 visitor 嚟 traverse ANTLR 所产生嘅 AST。

作者: fitcat07   发布时间: 2014-03-12

引用:原帖由 fitcat07 於 2013-12-9 22:58 发表
唔太明白「所有对 doit 呼叫的可能输入的列表」所指,有输出例子最好。
照我所知,V3 同 V4 都支援建立 AST,同使用 tree visitor。而 V4 就好似更自动化,亦唔再支援 in-grammar actions。
Chapter 11 of LIP 就系 ...
谢谢分享! 你讲的嘢我好认同.

用 SDT keyword 搵到 http://www.antlr.org/wiki/display/ST/Language+Translation+Using+ANTLR+and+StringTemplate , antlr 可直接 f=formalParameter 咁拎啲 嘢(唔知点形容喇) 嚟用.

JavaCC 要去到 token 层面拎嘢用. 如果识用 antlr3 做 SDT 应该可减少程式码做人手处理既嘢.


系呢, 点解你会无端端睇佢本书既?

作者: a8d7e8   发布时间: 2014-03-12

Chapter 12 就系讲 Template,功能更强大,啱啱睇到,未睇完。

其实一直对 compiler/interpreter 都有兴趣。想当年,因为师兄话呢科超难,选科时唔敢拣,只想 hea 读。亦都庆幸无拣,听同学讲真系读得好辛苦。


试过写一个名为 KiGB 嘅 emulator,做到执行 Z80 嘅 interpreter,真系几过瘾。


亦有自修过,奈何资质所限,都只系学到皮毛。


唯有就系迫自己睇多尐书,希望有日会明白多尐囉。

作者: fitcat07   发布时间: 2014-03-12

KiGB 超坚喎近乎完美! 条呢 link 我都未睇过添!!!

对对, 睇书/paper系学习既门路, 奈何我懒根深殖, hahaaaa. (你讲本书我都有睇返你提嗰啲 chapter 架)

我都系对呢啲嘢有兴趣, 选科遇唔啱无得拣 >< 睇 yacc/bison 嗰啲好似明明地, 但又谂唔通, 又无需要用到.

宜家有真实需要, 实践过, 将来可以试多啲嘢了.
引用:原帖由 fitcat07 於 2013-12-10 13:23 发表
Chapter 12 就系讲 Template,功能更强大,啱啱睇到,未睇完。 其实一直对 compiler/interpreter 都有兴趣。想当年,因为师兄话呢科超难,选科时唔敢拣,只想 hea 读。亦都庆幸无拣,听同学讲真系读得好 ...

作者: a8d7e8   发布时间: 2014-03-12

我好同意你讲:「斋睇唔做好难明白」!
因此,我不断做 SPOJ 嘅题目,练习多咗,真系有尐尐进步㗎。
另外,解答别人问题,亦系一个好嘅练习。有时睇落好简单,分析过后先知背后道理。老生常谈:「温故知新」,真系啱嘅。

作者: fitcat07   发布时间: 2014-03-12