仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 477|回复: 12
打印 上一主题 下一主题

[学习教程] JAVA网页设计javaCC进修条记

[复制链接]
再见西城 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:22:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
最初被命名为Oak,目标设定在家用电器等小型系统的编程语言,来解决诸如电视机、电话、闹钟、烤面包机等家用电器的控制和通讯问题。条记
javaCC的功效和yacc类似,次要依据bnf范式天生剖析程序,不外javaCC是汇合了词法剖析和语法剖析天生java剖析代码,主页为:https://javacc.dev.java.net/

javaCC有三个工具

javaCC用来处置语法文件(jj)天生剖析代码;

jjTree用来处置jjt文件,天生树节点代码和jj文件,然后再经由过程javaCC天生剖析代码;

jjDoc依据jj文件天生bnf范式文档(html)

javaCC利用的各类言语的Grammar文件这里有良多http://www.cobase.cs.ucla.edu/pub/javacc/,比方html,xml,python,vb…..,良多充足用了,呵呵。



javaCC的利用

javaCC天生的文件中,最次要的是《Grammar》.java这个就是剖析器的主程序了了,《Grammar》名由jj中界说。



如今依据例子申明jj文件的界说:

BNF范式为:

Expression
::=
((<NEWLINE>)*Simple_Expression<NEWLINE>)*<EOF>

Simple_Expression
::=
Term(addopTerm)*

addop
::=
<PLUS>


|
<MINUS>

Term
::=
Factor(mulopFactor)*

mulop
::=
<TIMERS>


|
<OVER>

Factor
::=
<ID>


|
<NUM>


|
<MINUS>


|
<PLUS>


|
<LPAREN>Simple_Expression<RPAREN>




/*这是一个整数的四则运算的例子*/

/*运转javaCCGrammar.jj

javac*.java

javaGrammar

>>>1+1*(1+1)

3

>>>^Z

*/



PARSER_BEGIN(Grammar)/*剖析代码的出口*/



publicclassGrammar{



publicstaticfinalintPlusOP=1;

publicstaticfinalintMinusOP=2;

publicstaticfinalintTimersOP=3;

publicstaticfinalintOverOP=4;





publicstaticvoidmain(Stringargs[])throwsParseException{

Grammarparser=newGrammar(System.in);



parser.Expression();

}

}



PARSER_END(Grammar)



SKIP:/*不处置的字符*/

{

""|"        "

}



TOKEN:/*天生token的字符界说*/

{



<ID:["a"-"z","A"-"Z","_"](["a"-"z","A"-"Z","_","0"-"9"])*>



|<NUM:(["0"-"9"])+>



|<PLUS:"+">



|<MINUS:"-">



|<TIMERS:"*">



|<OVER:"/">



|<LPAREN:"(">



|<RPAREN:")">

|<NEWLINE:("
"|"
"|"")>

}







voidExpression():

/*完成Expression::=((<NEWLINE>)*Simple_Expression<NEWLINE>)*<EOF>的配陪*/

{



intvalue=0;/*这个{}中是Expression()的界说的部分变量*/



}



{



{

System.out.print(">>>");

}

((<NEWLINE>/*起首婚配NEWLINE这个taken,完成后转到下一个剖析*/

{

System.out.print(">>>");/*在<NEWLINE>下的{}中为假如婚配到<NEWLINE>实行的java代码。*/

}

)*value=Simple_Expression()<NEWLINE>/*在换行之前Simple_Expression()剖析表达式,输出换行后,一个预算剖析完成*/



{System.out.println(value);

System.out.print(">>>");/*在<NEWLINE>下的{}中为完成表达式剖析,婚配到<NEWLINE>实行的java代码。*/



}

)*

<EOF>/*体系界说的taken,输出停止符*/

}



intSimple_Expression():

/*完成Simple_Expression::=bnfTerm(addopTerm)*配陪*/

{

/*这个{}中是Simple_Expression()的界说的部分变量*/



intvalue;



inttValue;



intop;



}



{



value=Term(){}/*配陪Term相*/



(



op=addop()tValue=Term()



{

switch(op)

{

casePlusOP:

value=value+tValue;

break;

caseMinusOP:

value=value-tValue;

break;

}

}

)*/*婚配(addopTerm)**/

{returnvalue;}

}



intaddop():{}

{

<PLUS>{returnPlusOP;}

|<MINUS>{returnMinusOP;}

}



intTerm():

{

intvalue;

inttValue;

intop;

}

{

value=Factor(){}

(

op=mulop()tValue=Factor()

{

switch(op)

{

caseTimersOP:

value=value*tValue;

break;

caseOverOP:

value=value/tValue;

break;

}

}



)*

{

returnvalue;

}

}

intmulop():{}

{

<TIMERS>{returnTimersOP;}

|<OVER>{returnOverOP;}

}



intFactor():

{

intvalue;

Tokent;

}

{

t=<ID>/*取得<ID>的剖析的值*/

{

value=100;

returnvalue;



}

|

t=<NUM>

{

value=(Integer.valueOf(t.image)).intValue();

returnvalue;

}

|

t=<MINUS>

{

value=0-Factor();

returnvalue;

}

|

t=<PLUS>

{



value=Factor();

returnvalue;

}

|



<LPAREN>value=Simple_Expression()<RPAREN>

{

returnvalue;

}

}



依据例子:基础上是一个taken下跟一个{}用于处置以后tabkn的java代码





jjTree的利用:



jjTree的利用,必要依据实践情形写本人的Node类,可是都必需完成Node.java接口,jjTree供应一个SimpleNode.java的复杂完成,也能够承继它,大概重写这个类。



给出一个javaCC本人带例子,也是四则运算:

语法界说:

Start
::=
Expression";"

Expression
::=
AdditiveExpression

AdditiveExpression
::=
(MultiplicativeExpression(("+"|"-")MultiplicativeExpression)*)

MultiplicativeExpression
::=
(UnaryExpression(("*"|"/"|"%")UnaryExpression)*)

UnaryExpression
::=
"("Expression")"


|
Identifier


|
Integer

Identifier
::=
<IDENTIFIER>

Integer
::=
<INTEGER_LITERAL>






options{

MULTI=true;

VISITOR=true;/*完成婚配的visitor形式代码*/

NODE_DEFAULT_VOID=true;/*剖析函数默许不天生node类*/

}

/*jtt默许的天生node类名,都带AST前缀加受骗前剖析的语意的称号*/



PARSER_BEGIN(eg4)



classeg4{

publicstaticvoidmain(Stringargs[]){

System.out.println("Readingfromstandardinput...");

eg4t=neweg4(System.in);

try{

ASTStartn=t.Start();

eg4Visitorv=neweg4DumpVisitor();

n.jjtAccept(v,null);

System.out.println("Thankyou.");

}catch(Exceptione){

System.out.println("Oops.");

System.out.println(e.getMessage());

e.printStackTrace();

}

}

}



PARSER_END(eg4)

SKIP:

{

""

|"        "

|"
"

|""

|<"//"(~["
",""])*("
"|""|"
")>

|<"/*"(~["*"])*"*"(~["/"](~["*"])*"*")*"/">

}



TOKEN:/*LITERALS*/

{

<INTEGER_LITERAL:

<DECIMAL_LITERAL>(["l","L"])?

|<HEX_LITERAL>(["l","L"])?

|<OCTAL_LITERAL>(["l","L"])?

>

|

<#DECIMAL_LITERAL:["1"-"9"](["0"-"9"])*>

|

<#HEX_LITERAL:"0"["x","X"](["0"-"9","a"-"f","A"-"F"])+>

|

<#OCTAL_LITERAL:"0"(["0"-"7"])*>

}



TOKEN:/*IDENTIFIERS*/

{

<IDENTIFIER:<LETTER>(<LETTER>|<DIGIT>)*>

|

<#LETTER:["_","a"-"z","A"-"Z"]>

|

<#DIGIT:["0"-"9"]>

}



ASTStartStart()#Start:{}/*#Start天生界说的节点类,称号为前缀+Start.Java*/

{

Expression()";"

{returnjjtThis;}

}





voidExpression():{}

{

AdditiveExpression()

}



voidAdditiveExpression():{}

{

(

MultiplicativeExpression()(("+"|"-")MultiplicativeExpression())*

)#Add(>1)/*Add#当满意前提(>1),Add天生界说的节点类,称号为前缀+Add.Java*/

}



voidMultiplicativeExpression():{}

{

(

UnaryExpression()(("*"|"/"|"%")UnaryExpression())*

)#Mult(>1)/*#Mult当满意前提(>1),Mult天生界说的节点类,称号为前缀+Mult.Java*/



}



voidUnaryExpression():{}

{

"("Expression()")"|Identifier()|Integer()

}



voidIdentifier()#MyOtherID:/*#MyOtherID天生界说的节点类,称号为前缀+MyOtherID.Java*/

{

Tokent;

}

{

t=<IDENTIFIER>

{

jjtThis.setName(t.image);

}

}



voidInteger()#Integer:{}/*#Integer天生界说的节点类,称号为前缀+Integer.Java*/



{

<INTEGER_LITERAL>

}





jjDoc的利用很复杂。





假如必要天生别的言语的(比方C#)剖析器,除处置C的yacc和lex外,ANTLR(http://www.antlr.org/)也是一个不错的选择。



你对java乐观有点盲目。java的关键就是在服务器上表现优异,而且它提供了整个开发所需要的工具。应该是说,看哪天。net有没有机会赶上java。
admin 该用户已被删除
沙发
发表于 2015-1-20 22:05:46 | 只看该作者
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
小女巫 该用户已被删除
板凳
发表于 2015-1-29 06:26:02 | 只看该作者
接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。
柔情似水 该用户已被删除
地板
发表于 2015-2-2 22:09:06 | 只看该作者
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
变相怪杰 该用户已被删除
5#
发表于 2015-2-4 21:33:54 | 只看该作者
接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。
飘灵儿 该用户已被删除
6#
发表于 2015-2-6 02:35:12 | 只看该作者
《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。
若相依 该用户已被删除
7#
发表于 2015-2-15 01:49:21 | 只看该作者
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
兰色精灵 该用户已被删除
8#
发表于 2015-2-25 21:56:59 | 只看该作者
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
分手快乐 该用户已被删除
9#
发表于 2015-2-27 14:54:38 | 只看该作者
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
简单生活 该用户已被删除
10#
发表于 2015-3-2 15:39:23 | 只看该作者
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
乐观 该用户已被删除
11#
发表于 2015-3-11 04:18:59 | 只看该作者
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
小魔女 该用户已被删除
12#
发表于 2015-3-17 20:10:33 | 只看该作者
Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)
愤怒的大鸟 该用户已被删除
13#
发表于 2015-3-24 23:43:09 | 只看该作者
是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-15 09:14

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表