Atitit dsl对于数组的处理以及main函数的参数赋值
Atitit dsl对于数组的处理以及main函数的参数赋值
1.1. 词法解析..添加了[] 方括号的解析支持
public List getTokensV3() {
code_char_arr = code.toCharArray();
for (char c : code_char_arr) {
// get next char,,then change stat
// jude cur char and cur stat...then if or not chage stat
if (c == '[' && !this.curStat.equals("strStart"))
{
this.curStat="sqBrkStart";
Token tk2=new Token("[").setType("spltr");
tokens.add(tk2);
this.curTokenTxt = "";
continue;
}
if (c == ']' && !this.curStat.equals("strStart"))
{
this.curStat="sqBrkEnd";
Token tk2=new Token("]").setType("spltr");
tokens.add(tk2);
this.curTokenTxt = "";
continue;
}
1.2. Ast建立.添加了数组参数的支持..使用了递归下降法..getparam use recurs desc meth... Get arrayParam ya use recdesc meth..
if (isConstrutsced == false) { // static //first
// new method invoke exp
String className = refx.getClassName(text);
className = javaUtil.clr(className);
mi.Exp = new SimpleName(className); // cls name
mi.Name = refx.getMethodName(text);
isConstrutsced = true;
// param push
List<Expression> params=buildAstV2_params(tokens);
mi.arguments=params;
return mi;
} //end static
private List<Expression> buildAstV2_params(List<Token> tokens2) {
//List<Expression> li=Lists.newArrayList();
m_index++;
Token cur = tokens.get(m_index);
//build array param
if (cur.getText().equals("[") && cur.getType().equals("spltr"))
{
//params.add(e);
ArrayCreation ac=getArrayCreation();
params.add(ac);
return buildAstV2_params(tokens2);
}
//close param
if (cur.getText().equals(")") && cur.Type.equals("op")) {
//PARAMS close
return listUtil.clone(params);
}
//add param
if(cur.getText().equals(",") )
return buildAstV2_params(tokens2);
params.add(cur);
return buildAstV2_params(tokens2);
}
private ArrayCreation getArrayCreation() {
//m_index++;
ArrayCreation ac =new ArrayCreation();
ArrayInitializer ai=new ArrayInitializer();
List<Object> params=Lists.newArrayList();
// param push
while (true) {
m_index++;
Tokencur = tokens.get(m_index);
if (cur.getText().equals("]"))
{
//System.out.println("dbg");
}
if (cur.getText().equals("]") && cur.Type.equals("spltr")) {
ai.expressions=params;
ac.optionalInitializer=ai;
return ac;
}
if(cur.getText().equals(","))
continue;
params.add(cur.Text);
if(cur.getType().equals("str"))
ac.arrayType="string";
}
//return null;
}
1.3. Ast解析 的支持
private Object SimpleName_staticProcess(Expression ast) {
MethodInvocation mi = (MethodInvocation) ast;
Expression exp = mi.Exp;
Class<?> threadClazz = null;
if (exp instanceof SimpleName) {
SimpleName sn = (SimpleName) exp;
try {
threadClazz = Class.forName(sn.IDENTIFIER);
} catch (ClassNotFoundException e) {
ExUtil.throwExV2(e);
}
}
mi.arguments=arrParamProcess(mi.arguments);
private List arrParamProcess(List arguments) {
List li=Lists.newArrayList();
for (Object object : arguments) {
if(object instanceof ArrayCreation)
{
Object arr=getArr(( ArrayCreation)object );
li.add(arr);
}
}
return li;
}
private Object getArr(ArrayCreation ac) {
if(ac.arrayType.equals("string"))
{
List<String> li=Lists.newArrayList();
List li_tmp=ac.optionalInitializer.expressions;
for (Object object : li_tmp) {
li.add((String) object);
}
return li.toArray(new String[ li.size()]);
}
return null;
}
作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 )
汉字名:艾提拉(艾龙), EMAIL:1466519819@qq.com
转载请注明来源: http://www.cnblogs.com/attilax/
Atiend
Atitit dsl对于数组的处理以及main函数的参数赋值的更多相关文章
- 指针数组与带参main函数
(一)指针数组 指针数组就是每一个元素存放一个地址,相当于一个指针变量.如:int *p[4]指针数组比较适合用来指向若干字符串,使得处理字符串更加灵活.例如,现在要将若干字符串按字母顺序由小到大输出 ...
- C语言中main函数的参数
转自:http://blog.csdn.net/cnctloveyu/article/details/3905720 我们经常用的main函数都是不带参数的.因此main 后的括号都是空括号.实际上, ...
- 关于main函数传参数的问题
argc是命令行总的参数个数 argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数 命令行后面跟的用户输入的参数,比如: int main(int ...
- C++向main函数传递参数的方法(实例已上传至github)
通常情况下,我们定义的main函数都只有空形参列表: int main(){...} 然而,有时我们确实需要给mian传递实参,一种常见的情况是用户设置一组选项来确定函数所要执行的操作.例如,假定ma ...
- 关于main函数的参数问题
我们经常用的main函数都是不带参数的.因此main 后的括号都是空括号.实际上,main函数可以带参数,这个参数可以认为是 main函数的形式参数.C语言规定main函数的参数只能有两个, 习惯上这 ...
- C++ main函数的参数
C++的main函数可以没有输入参数,也可以有输入参数,而且只能有两个参数,习惯上coding如下: int main(int argc, char* argv[]) 或者 int main(int ...
- C++ main()函数及其参数
1.首先,想想C/C++在main函数之前和之后会做些什么? 我们看看底层的汇编代码: __start: : init stack; init heap; open stdin; open stdou ...
- main函数的参数argc和argv
版权声明:本文为博主原创文章,转载请注明CSDN博客源地址!共同学习,一起进步~ https://blog.csdn.net/Eastmount/article/details/20413773 该篇 ...
- 探寻main函数的“标准”写法,以及获取main函数的参数、返回值
main函数表示法 很多同学在初学C或者C++时,都见过各种各样的main函数表示法: main(){/*...*/} void main(){/*...*/} int main(){/ ...
随机推荐
- js性能优化
使用局部变量(尽量缩短作用域链)JavaScript引擎对变量的解析时间跟作用域链的深度有关.局部变量由于处于链尾,存取速度是最快的,因此,一个好的经验是:任何非局部变量使用超过一次时,请使用局部变量 ...
- 【洛谷P3076】Taxi
这道题值得好好想一会 我们通过对一些小数据的手算,以及对于每段路程的拆分,可以发现: 1.每个st对应的ed这段路程无论如何都要算上 2.额外还要计算的一段路程,就是"切换"费用 ...
- mac系统 下 npm 安装 bower报错
在mac终端运行 sudo npm install -g bower (安装之前你要确定你已经成功安装了node 和 git) 然后会报错 like this: npm ERR! Darwin 15. ...
- iframe自适应高度,根据src中页面来得到。
在页面布局时,div+iframe能根据具体的大小进行布局.但,对于iframe的适应大小,仍需js获取内部html文件来改变. function reinitIframe(){ var iframe ...
- iptables之LOG目标 被拦截包分析
iptables之LOG目标 问题 在iptables的INPUT链中发现有大量未知包被拦截,这种情况就有两种可能,一是自己的某个服务的iptables端口没有打开,二是服务器正在遭受攻击 分析 这就 ...
- centos下postgresql的安装与配置[转]
本文摘自:http://blog.chinaunix.net/uid-24846094-id-78490.html 一.安装(以root身份进行) 1.检出最新的postgresql的yum配置从ht ...
- spark单机环境下运行一些解决问题
ERROR1.hadoop依赖 [ERROR] - Failed to locate the winutils binary in the hadoop binary path java.io.I ...
- Extjs4.2或以上 使用自定义事件时报错问题
最近使用了extjs 自定义事件模型,代码如下: function Person(name) { this.name = name; this.addEvents('walk'); } Ext.ext ...
- python基础整理笔记(八)
一. python反射的方式来调用方法属性 反射主要指的就是hasattr.getattr.setattr.delattr这四个函数,作用分别是检查是否含有某成员.获取成员.设置成员.删除成员. 此外 ...
- Reset CSS
摘自<锋利的JQuery> 关于重置样式,可以参考Eric meyer的重置样式和YUI的重置样式 body,h1,h2,h3,h4,h5,h6,hr,p,blockquote,dl,dt ...