Monday, August 14, 2017
排查了一天,最后终于确认了流程,知道了问题所在,不得不说,dde-session-ui这个项目太需要一个文档了,要把工作流程写的非常详细才可以。
排查了一天,最后终于确认了流程,知道了问题所在,不得不说,dde-session-ui这个项目太需要一个文档了,要把工作流程写的非常详细才可以。
其实这个问题影响并不是很大,只是稍微的增加一点点访问速度,缓存这东西有利有弊。
自己搭了一个仓库,提供deepin-topbar及相关依赖的包。
I created a repository,provide deepin-topbar and dependencies.
定义区域 %% 规则区域 %% C/C++代码区
%{
#include
%}
number [0-9]+
%option noyywrap
%% // 第一部分结束
{number} {
printf("number: %s\n", yytext);
}
%% // 第二部分结束
int main()
{
yylex();
return 0;
}
wiki:https://zh.wikipedia.org/wiki/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F
定义区域 %% 规则区域 %% C/C++代码区
%{
#include
#define YYSTYPE int
void yyerror(char const *);
int yylex(void);
%}
%token NUMBER
%debug
%%
start: { printf("yylval = %d\n", yylval);}
| NUMBER {
printf("NUMBER %d\n", yylval);
}
start NUMBER {
printf("start NUMBER %d\n", yylval);
}
;
%%
void yyerror(char const *msg)
{
printf("error: %s\n", msg);
}
int yylex()
{
printf(">>>");
char str[10] = {};
if(scanf("%s\n", str) == EOF)
return 0;
int number = atoi(str);
printf("%d\n", number);
yylval = number;
return NUMBER;
}
int main()
{
return yyparse();
}
例如上面的文法规则中“start”就是非终结符,NUMBER就是一个终结符。
wiki:https://zh.wikipedia.org/wiki/%E7%B5%82%E7%B5%90%E7%AC%A6%E8%88%87%E9%9D%9E%E7%BB%88%E7%B5%90%E7%AC%A6#
变量使用关键字“var”进行定义。
zScript提供了两种形式的变量定义语句。
1.直接定义的形式,该语句的一般形式为:
var 标识符;
该语句的含义是:定义变量名为“标识符”的变量。例如:
var a;
该语句的作用是:定义一个名为“a”的变量。 2.定义同时给变量初始化赋值,该语句的一般形式为:
var 标识符 = 表达式;
该语句的含义是:定义变量名为“标识符”的变量,且给变量赋值为表达式的结果。例如:
var a = 1 + 2;
该语句的作用是:定义一个名为“a”的变量,且赋值为3。 “var”关键字可同时定义多个变量,每个变量之间使用符号“,”分割。
匿名函数定义的一般形式为:
(形参列表) {
语句组
}
该语句的含义是:生成一个函数对象,例如:
(a) {
console.log(a);
}
该语句的作用是:定义一个函数,它有一个名为“a”的形参,执行此函数会将a的值打印到屏幕上。 形参列表,可为空、一个、多个,多个形参之间使用“,”分割。
数组定义的一般形式为:
var a = [表达式1, 表达式2, ...];
该语句的含义是:生成一个数组,数组元素为中括号中表达式的结果。例如:
var a = [1, 2, 3];
该语句的作用是:定义一个包含三个元素的数组,元素的值分别为1、2、3,然后赋值给变量a; 数组使用“[”“]”定义,中间内容可以为空、一个表达式、多个表达式,多个表达式之间使用“,”隔开。
a = a[0];
取数组元素语法和C语言一样,都是中括号中写入数组下标。
一个选择结构,包括一组或若干组操作,每组操作称为一个分支。通过选择控制语句可以实现选择结构。选择控制语句包括if语句、switch语句及起辅助控制作用的break语句。
If语句用于计算给定的表达式,根据表达式的值是否为假,决定是否执行某一组操作。
Switch语句首先求解一个表达式,然后根据计算结果的值,从哈希表中查询该从哪一组操作开始执行。
Break语句用于switch结构中,用于终止当前switch结构的执行。
zScript提供了两种形式的if语句。
1.单if子句的if语句。该if语句的一般形式为:
if(表达式)
{
语句组
}
该语句的含义是:只有表达式的值为非零值时,才执行其内部的语句组。例如:
if ( a > b )
{
console.log(“hello”);
}
该语句的作用是:当a的值大于b的值时(此时,“a>b”的值为真,为非假值),在屏幕上显示“hello”;否则,不显示“hello”。 2.带else子句的if语句。该if语句的一般形式为:
if ( 表达式 )
{
语句组1
} else {
语句组2
}
该语句的含义是:当表达式的值为非假时,执行语句组1,而不执行语句组2;否则,即表达式的值为假时,执行语句组2,而不执行语句组1。例如:
if ( a > b )
{
console.log(“hello1”);
} else {
console.log(“hello2”);
}
该语句的作用是:若a的值大于b的值(此时“a>b”为真,为非假值),则在屏幕上显示“hello1”,而不显示“hello2”;否则,即表达式的值为假时,显示“hello2”,而不显示“hello1”。
Switch语句与if语句一样,也可以实现分支选择。但if语句是判断一个表达式的值是否为假,决定是否执行某个分支;而switch语句是计算一个表达式的值,根据计算结果,从哈希表查询从哪个分支开始执行代码。Switch语句的一般形式为:
switch( 表达式 )
{
case 常量1:
语句组1
case 常量2:
语句组2
...
case 常量n:
语句组n
default:
语句组 n + 1
}
switch语句的执行过程:
1.求解“表达式”的值;
2.如果“表达式”的值与某个case后面的“常量”的值相同,则从这里开始顺序执行语句。结果switch执行有两种形式:一是遇到break语句为止;二是未遇到break语句,则程序依次执行完所有语句组。
3.如果“表达式”的值与任何一个case后面的“常量”的值都不相同,当有default子句时,则执行default后面的语句,如果没有default子句,则结束switch。
其中break的一般形式为
break;
while语句的一般形式为
while( 表达式 )
{
循环体
}
while语句的执行过程:
1.求解小括号中表达式的值。如果表达式的值为真,转第2步;否则转第3步。
2.执行循环体,然后转第1步。
3.执行while语句后面的语句。
小括号中表达式的值是否为假,决定着循环体是终止还是继续循环。因此,该表达式的值为循环条件。while循环语句的执行特点是,先判断循环条件是否成立,然后决定是否执行循环体。
当while语句的循环体只包含一条语句时,包含该循环体的“{}”可以省略。
在两种循环语句中,for语句最为灵活。for语句的一般形式为:
for (表达式1; 表达式2; 表达式3)
{
循环体
}
for语句的执行过程:
1.求解表达式1的值。
2.求解表达式2的值,若其值为假,则结束循环,转第4步;若其值为真,则执行循环体。
3.求解表达式3。
4.结束循环。
对象定义的一般形式为:
{
属性名1: 属性的值,
属性名2: 属性的值,
...
属性名n: 属性的值,
属性名n+1: 属性的值
}
例如:
var object = {
name: "张三",
age: 18
};
变量object即是一个对象,它包含两个属性。 注:当对一个对象不存在的属性赋值时会将此属性加入到对象中,例如:
object.sex = '男';
对象object中就会多出一个“sex”属性。