正在开发一门简单的脚本语言
Tofloor
poster avatar
ldmpscript
deepin
2012-12-06 17:52
Author
这个脚本很简单,不需要模拟CPU。
最终状态的是可以通过远程传输脚本TEST.LDMP. [主要是为了解决WEBKIT与GTK互通的麻烦.现在又需要一个轻量的,可定制的东西]
然后我写的客户端,
词法分析,语法分析脚本,语义分析,
最后进行渲染,
现在的元素比较少,
只有entry, button, line, vbox, hbox.
本地也可以编写脚本,然后F5可以刷新脚本渲染界面.
语法分析,语义分析, 远程的正在编写中.

大家感觉这种脚本对于 小型的渲染是不是很方便. 远程只要更新一下, 客户端刷新一下就显示出来.
比如: 只想简单的显示一些东西.

比如:
像这样的东西,你就想简单的搜索一下,然后显示出你想要的列表东西.
选区_009.png
选区_010.png
选区_011.png
最终的效果是这样.简单的编写脚本,就可以进行渲染,远程修改一下,就可以显示出来,是轻量的.快速的.
QQ截图20121206100736.png

会自动生成一棵 控件树. 用来表示 包含关系或父子关系.
  1. '版本号
  2. ' '事件集合
  3.    
  4.         
  5.          
  6.          
  7.         
  8.                
  9. ' 这是以后的设想!!现在未了满足需求,只能将事件暂时固定起来.
  10. ' import event
  11. ' btn1.connect("clicked", event.btn1_clicked)
Copy the Code

我定义的东西.
  1. '''
  2. ----------------------
  3. 运算符 |  ID  | 单词
  4.          10     =
  5. ----------------------     
  6. 界符号 |  ID  | 单词
  7.          05     <
  8.          06     >
  9.          07     /
  10. ----------------------
  11. 关键字 |  ID  |   单词
  12.          30    version
  13.          31    ldmp
  14.          32    name
  15.          33    value
  16.          34    event
  17.          35    callback
  18.          36    vbox
  19.          37    hbox         
  20.          38    entry
  21. ----------------------
  22.          
  23. '''
  24. 用于词法分析.
Copy the Code
语法就几条.
<....>

基于表格驱动的词法分析算法。
用PYTHON。
  1. # /* 用于搜索关键字. */
  2. keyword_dict = {'a':[],
  3.            'b':["button"],
  4.            'c':["callback"],
  5.            'd':[],
  6.            'e':["event"],
  7.            'f':[],
  8.            'g':[],
  9.            'h':["hbox"],
  10.            'i':[],
  11.            'j':[],
  12.            'k':[],
  13.            'l':["ldmp"],
  14.            'm':[],
  15.            'n':["name"],
  16.            'o':[],
  17.            'p':[],
  18.            'q':[],
  19.            'r':[],
  20.            's':[],
  21.            't':[],
  22.            'u':[],
  23.            'v':["vbox", "value", "version"],
  24.            'w':[],
  25.            'x':[],
  26.            'y':[],
  27.            'z':[]
  28.            }
  29. '''
  30. 标识符    ID 03
  31. 字符串常量 ID 02
  32. ----------------------
  33. 运算符 |  ID  | 单词
  34.          10     =
  35. ----------------------     
  36. 界符号 |  ID  | 单词
  37.          05     <
  38.          06     >
  39.          07     /
  40. ----------------------
  41. 关键字 |  ID  |   单词
  42.          30    version
  43.          31    ldmp
  44.          32    name
  45.          33    value
  46.          34    event
  47.          35    callback
  48.          36    vbox
  49.          37    hbox      
  50.          38    entry
  51.          39    button
  52. ----------------------
  53. '''
  54. '''(回车,空格)----------
  55.              |--------
  56.              |--------
  57.              |--------
  58.              |--------
  59.    标识符(字母)|---字母,数字循环---(05)---其它---((-03)) # 最后会查询关键字表,看是否为关键字.
  60.             <|--------(06)---全部---((-05))
  61.             >|--------(07)---全部---((-06))
  62.             /|--------(08)---全部---((-07))
  63.             "|--------(09)--- " ---((-02))
  64.                           |--回车---((-100))
  65.             '|--------(10)---回车---((-40))
  66. '''   
  67. lex_table = []
  68. def init_lex_table():        
  69.     # init lex_table.
  70.     for i in range(0, 11):
  71.         lex_table.append([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  72.                           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  73.                           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  74.                           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])        
  75.     # create lex table.   
  76.     for i in range(0, 129): # 0-127, 128(其它:比如[中文])
  77.         lex_table[0][i]   = -100   # 出错状态.
  78.         lex_table[0][ord("<")] = -5
  79.         lex_table[0][ord(">")] = -6
  80.         lex_table[0][ord('/')] = -7
  81.         lex_table[0][ord('=')] = -10
  82.         lex_table[0][ord("'")] = 10
  83.         lex_table[0][ord('"')] = 9
  84.         if (ord('a') <= i <= ord('z')) or (ord('A') <= i <= ord('Z')):
  85.             lex_table[0][i] = 5
  86.         # 标识符.
  87.         if (ord('a') <= i <= ord('z')) or (ord('A') <= i <= ord('Z')) or (ord('0') <= i <= ord('9')):
  88.             lex_table[5][i] = 5
  89.         else:   
  90.             lex_table[5][i] = -3
  91.         # 界符号.
  92.         lex_table[6][i] = -5
  93.         lex_table[7][i] = -6
  94.         lex_table[8][i] = -7  
  95.         # 字符串.
  96.         lex_table[9][i]         = 9      # 其它,中文,除了回车..->>跳转
  97.         lex_table[9][ord('"')]  = -2     # 字符串.
  98.         lex_table[9][ord('\n')] = -100   # 字符串没有"结尾--->出错状态.
  99.         # 注释.
  100.         lex_table[10][i]         = 10     # 注释跳转.
  101.         lex_table[10][ord('\n')] = -40    # 注释.
  102.         
  103. if __name__ == "__main__":
  104.     init_lex_table()
  105.     # import random
  106.     text = 'abcd123="我来看看看吧fjsdklfsdjkf"abc\n'.decode("utf-8")
  107.     row = 0
  108.     text_index = 0
  109.     index = ord(text[0])
  110.     token = ""
  111.     while text_index < len(text):
  112.        if text[text_index] != " " and text[text_index] != "\n":
  113.         if ord(text[text_index]) < 128:
  114.             index = ord(text[text_index])
  115.         else:   
  116.             index = 128
  117.         # print "index:", index
  118.         row = lex_table[row][index]        
  119.         # print "row:", row
  120.         token += text[text_index]
  121.         if row < 0:
  122.             if row == -40:
  123.                 print "[注释]", token, "(id:", -row
  124.             elif row == -2:   
  125.                 print "[字符串]", token, "(id:", -row
  126.             elif row == -100:
  127.                 print "[错误]-->>", token, "行号:", 0
  128.             elif row == -5:   
  129.                 print "[界符号]", token, "(id:", -row
  130.             elif row == -6:   
  131.                 print "[界符号]", token, "(id:", -row
  132.             elif row == -7:   
  133.                 print "[界符号]", token, "(id:", -row
  134.             elif row == -3:   # 超前搜索一个,所以必须回退一位.
  135.                 print "[标识符]", token[:-1], "(id:", -row  # 进行查询关键字就知道了,不是关键字就是标识符了.
  136.                 text_index -=1
  137.             elif row == -10:   
  138.                 print "[运算符]", token, "(id:", -row
  139.             row = 0
  140.             token = ""            
  141.        text_index += 1
Copy the Code
因为以前做过一个 智能小车模拟软件.
一个用于显示小车运作的动画.
一个用于编写智能小车代码的环境.
然后运行,小车运作动画的前端解释脚本,然后自己运行起来,有红灯,绿灯,转弯,遇到障碍自己转.
没办法,看见软件班的同学玩的很过瘾,只能听他们说,心里不爽啊` 所以自己就开发一个模拟软件,来模拟小车运动,来感受一下编写代码让小车运动起来的快感.
编写代码,编译过后生成脚本,然后动画前端读取脚本的指令,足条解释,如果没有遇到跳转指令的话,没事.
Reply Favorite View the author
All Replies
左心房的痛
deepin
2012-12-06 18:32
#1
脚本语言??网页的??那浏览器得支持才行啊,你要修改webkit?
Reply View the author
ldmpscript
deepin
2012-12-06 19:03
#2
脚本语言??网页的??那浏览器得支持才行啊,你要修改webkit?

没有,WEBKIT 那么庞大,我没有能力去修改。   ops:  :  

我现在只是写一个简单的脚本而已。

没什么技术含量。主要为了解决WEBKIT和GTK 交互问题。
比如 在WEBKIT在单击或者双击了,又或者移动了鼠标了,GTK该如何知道,这个一个非常麻烦的时候。
反正我现在需要的东西也不多,所以就这样吧,满足需求,简单的写一个,。 :  :  :
Reply View the author
cxbii
deepin
2012-12-06 19:36
#3
妈呀……牛人辈出
Reply View the author
ldmpscript
deepin
2012-12-06 22:59
#4
妈呀……牛人辈出
这个是简单的东西,没有你想的那么牛B,
Reply View the author
cxbii
deepin
2012-12-06 23:12
#5
[quote]妈呀……牛人辈出
这个是简单的东西,没有你想的那么牛B,[/quote]没事,总比我厉害啦
Reply View the author
pdlenovo
deepin
2012-12-06 23:33
#6
妈呀……牛人辈出
是啊 真的很牛
Reply View the author
ldmpscript
deepin
2012-12-06 23:40
#7
[quote]妈呀……牛人辈出
是啊 真的很牛[/quote]

没有你写操作系统 牛,
我就一个水B,
这个东西很简单的,哎,你们都唔会了。连你这样写操作系统牛人都这样说,让我无地自容了。
Reply View the author
vala2012
deepin
2012-12-07 00:29
#8
保存的单词流信息:
id: 5 token: < type: TOKEN_TYPE_SCOPE_SYMBOL row: 0
id: 1 token: version row: 0
id: 10 token: = type: TOKEN_TYPE_OPERATOR row: 0
id: 2 token: 0.1 type: TOKEN_TYPE_STRING row: 0
id: 6 token: > type: TOKEN_TYPE_SCOPE_SYMBOL row: 0
id: 5 token: < type: TOKEN_TYPE_SCOPE_SYMBOL row: 0
id: 7 token: / type: TOKEN_TYPE_SCOPE_SYMBOL row: 0
id: 1 token: version row: 0
id: 6 token: > type: TOKEN_TYPE_SCOPE_SYMBOL row: 0
id: 5 token: < type: TOKEN_TYPE_SCOPE_SYMBOL row: 2
id: 1 token: ldmp row: 2
id: 6 token: > type: TOKEN_TYPE_SCOPE_SYMBOL row: 2
id: 5 token: < type: TOKEN_TYPE_SCOPE_SYMBOL row: 3
id: 1 token: vbox row: 3
id: 6 token: > type: TOKEN_TYPE_SCOPE_SYMBOL row: 3
id: 5 token: < type: TOKEN_TYPE_SCOPE_SYMBOL row: 4
id: 1 token: vbox row: 4
id: 6 token: > type: TOKEN_TYPE_SCOPE_SYMBOL row: 4
id: 5 token: < type: TOKEN_TYPE_SCOPE_SYMBOL row: 5
id: 1 token: button row: 5
id: 1 token: name row: 5
id: 10 token: = type: TOKEN_TYPE_OPERATOR row: 5
id: 2 token: btn1 type: TOKEN_TYPE_STRING row: 5
id: 1 token: value row: 5
id: 10 token: = type: TOKEN_TYPE_OPERATOR row: 5
id: 2 token: 确定 type: TOKEN_TYPE_STRING row: 5
id: 1 token: event row: 5
id: 10 token: = type: TOKEN_TYPE_OPERATOR row: 5
id: 2 token: clicked type: TOKEN_TYPE_STRING row: 5
id: 1 token: callback row: 5
id: 10 token: = type: TOKEN_TYPE_OPERATOR row: 5
id: 2 token: btn1_clicked type: TOKEN_TYPE_STRING row: 5
id: 6 token: > type: TOKEN_TYPE_SCOPE_SYMBOL row: 5
id: 5 token: < type: TOKEN_TYPE_SCOPE_SYMBOL row: 5
id: 7 token: / type: TOKEN_TYPE_SCOPE_SYMBOL row: 5
id: 1 token: button row: 5
id: 6 token: > type: TOKEN_TYPE_SCOPE_SYMBOL row: 5
id: 5 token: < type: TOKEN_TYPE_SCOPE_SYMBOL row: 6
id: 1 token: name row: 6
id: 10 token: = type: TOKEN_TYPE_OPERATOR row: 6
id: 2 token: text1 type: TOKEN_TYPE_STRING row: 6
id: 6 token: > type: TOKEN_TYPE_SCOPE_SYMBOL row: 6
id: 5 token: < type: TOKEN_TYPE_SCOPE_SYMBOL row: 6
id: 7 token: / type: TOKEN_TYPE_SCOPE_SYMBOL row: 6
id: 6 token: > type: TOKEN_TYPE_SCOPE_SYMBOL row: 6
id: 5 token: < type: TOKEN_TYPE_SCOPE_SYMBOL row: 7
id: 7 token: / type: TOKEN_TYPE_SCOPE_SYMBOL row: 7
id: 1 token: vbox row: 7
id: 6 token: > type: TOKEN_TYPE_SCOPE_SYMBOL row: 7
id: 5 token: < type: TOKEN_TYPE_SCOPE_SYMBOL row: 8
id: 7 token: / type: TOKEN_TYPE_SCOPE_SYMBOL row: 8
id: 1 token: vbox row: 8
id: 6 token: > type: TOKEN_TYPE_SCOPE_SYMBOL row: 8
id: 5 token: < type: TOKEN_TYPE_SCOPE_SYMBOL row: 9
id: 7 token: / type: TOKEN_TYPE_SCOPE_SYMBOL row: 9
id: 1 token: ldmp row: 9
id: 6 token: > type: TOKEN_TYPE_SCOPE_SYMBOL row: 9
Reply View the author
pdlenovo
deepin
2012-12-07 00:49
#9
[quote][quote]妈呀……牛人辈出
是啊 真的很牛[/quote]

没有你写操作系统 牛,
我就一个水B,
这个东西很简单的,哎,你们都唔会了。连你这样写操作系统牛人都这样说,让我无地自容了。[/quote]
其实我们只是专注的方向不同而已,要我来干这个,我肯定干不了,我曾经想为我的操作系统写个C编译器,
后来我却胆怯了,呵呵
Reply View the author
ldmpscript
deepin
2012-12-07 02:00
#10
[quote]是啊 真的很牛

没有你写操作系统 牛,
我就一个水B,
这个东西很简单的,哎,你们都唔会了。连你这样写操作系统牛人都这样说,让我无地自容了。[/quote]
其实我们只是专注的方向不同而已,要我来干这个,我肯定干不了,我曾经想为我的操作系统写个C编译器,
后来我却胆怯了,呵呵[/quote]
我的能力也不足与开发一个编译器,做人是有量度的,知道自己有几斤几两。 :
Reply View the author
ldmpscript
deepin
2012-12-08 00:00
#11
其实我们只是专注的方向不同而已,要我来干这个,我肯定干不了,我曾经想为我的操作系统写个C编译器,
后来我却胆怯了,呵呵

好吧,牛人,
给你看个例子,就知道词法分析多么简答了,不需要什么高深的 确定性/非确定自动机理论。
我已经很详细的描述了。
  1. #! /usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # /* 用于搜索关键字. */
  4. keyword_dict = {'a':[],
  5.            'b':["button"],
  6.            'c':["callback"],
  7.            'd':[],
  8.            'e':["event"],
  9.            'f':[],
  10.            'g':[],
  11.            'h':["hbox"],
  12.            'i':[],
  13.            'j':[],
  14.            'k':[],
  15.            'l':["ldmp"],
  16.            'm':[],
  17.            'n':["name"],
  18.            'o':[],
  19.            'p':[],
  20.            'q':[],
  21.            'r':[],
  22.            's':[],
  23.            't':[],
  24.            'u':[],
  25.            'v':["vbox", "value", "version"],
  26.            'w':[],
  27.            'x':[],
  28.            'y':[],
  29.            'z':[]
  30.            }
  31. '''
  32. 标识符    ID 03
  33. 字符串常量 ID 02
  34. ----------------------
  35. 运算符 |  ID  | 单词
  36.          10     =
  37. ----------------------     
  38. 界符号 |  ID  | 单词
  39.          05     <
  40.          06     >
  41.          07     /
  42. ----------------------
  43. 关键字 |  ID  |   单词
  44.          30    version
  45.          31    ldmp
  46.          32    name
  47.          33    value
  48.          34    event
  49.          35    callback
  50.          36    vbox
  51.          37    hbox      
  52.          38    entry
  53.          39    button
  54. ----------------------
  55. '''
  56. '''(回车,空格)----------
  57.              |--------
  58.              |--------
  59.              |--------
  60.              |--------
  61.    标识符(字母)|---字母,数字循环---(05)---其它---((-03)) # 最后会查询关键字表,看是否为关键字.
  62.             <|--------(06)---全部---((-05))
  63.             >|--------(07)---全部---((-06))
  64.             /|--------(08)---全部---((-07))
  65.             "|--------(09)--- " ---(11) -- 全部 --((-02))
  66.                           |--回车---((-100))
  67.             '|--------(10)---回车---((-40))
  68. '''   
  69. lex_table = []
  70. def init_lex_table():        
  71.     # init lex_table.
  72.     for i in range(0, 12):
  73.         lex_table.append([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  74.                           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  75.                           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  76.                           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])        
  77.     # create lex table.   
  78.     for i in range(0, 129): # 0-127, 128(其它:比如[中文])
  79.         lex_table[0][i]   = 0   # 出错状态.
  80.         lex_table[0][ord("<")] = 6
  81.         lex_table[0][ord(">")] = 7
  82.         lex_table[0][ord('/')] = 8
  83.         lex_table[0][ord('=')] = 4
  84.         lex_table[0][ord("'")] = 10
  85.         lex_table[0][ord('"')] = 9
  86.         if (ord('a') <= i <= ord('z')) or (ord('A') <= i <= ord('Z')):
  87.             lex_table[0][i] = 5
  88.         # 标识符.
  89.         if (ord('a') <= i <= ord('z')) or (ord('A') <= i <= ord('Z')) or (ord('0') <= i <= ord('9')):
  90.             lex_table[5][i] = 5
  91.         else:   
  92.             lex_table[5][i] = -3
  93.         # 运算符.   
  94.         lex_table[4][i] = -10
  95.         # 界符号.
  96.         lex_table[6][i] = -5
  97.         lex_table[7][i] = -6
  98.         lex_table[8][i] = -7  
  99.         # 字符串.
  100.         lex_table[9][i]         = 9      # 其它,中文,除了回车..->>跳转
  101.         lex_table[11][i]        = -2
  102.         lex_table[9][ord('"')]  = 11    # 字符串.
  103.         lex_table[9][ord('\n')] = -100   # 字符串没有"结尾--->出错状态.
  104.         # 注释.
  105.         lex_table[10][i]         = 10     # 注释跳转.
  106.         lex_table[10][ord('\n')] = -40    # 注释.
  107.         
  108. if __name__ == "__main__":
  109.     init_lex_table()
  110.     # import random
  111.     text = '"我来   看看看吧fjsdklfsdjkf"\n'.decode("utf-8")
  112.     row = 0
  113.     text_index = 0
  114.     token = ""
  115.     while text_index < len(text):        
  116.         
  117.         if ord(text[text_index]) < 128:
  118.             index = ord(text[text_index]) # <
  119.         else:   
  120.             index = 128
  121.             
  122.         row = lex_table[row][index]
  123.         token += text[text_index]
  124.         
  125.         if row < 0:
  126.             text_index -= 1# 超前搜索一个,所以必须回退一位.
  127.             if row == -40:
  128.                 print "[注释]", token[:-1], "(id:", -row
  129.             elif row == -2:   
  130.                 print "[字符串]", token[:-1], "(id:", -row
  131.             elif row == -100:
  132.                 print "[错误]-->>", token[:-1], "行号:", 0
  133.                 break
  134.             elif row == -5:   
  135.                 print "[界符号]", token[:-1], "(id:", -row
  136.             elif row == -6:   
  137.                 print "[界符号]", token[:-1], "(id:", -row
  138.             elif row == -7:   
  139.                 print "[界符号]", token[:-1], "(id:", -row               
  140.             elif row == -3:   
  141.                 print "[标识符]", token[:-1], "(id:", -row                           
  142.             elif row == -10:   
  143.                 print "[运算符]", token[:-1], "(id:", -row
  144.             row = 0
  145.             token = ""            
  146.             
  147.       
  148.         text_index += 1
Copy the Code

将这些单词流保存到TOKENINFO中去.
/*
class TokenInfo(object):
    def __init__(self):
        self.id   = None
        self.type = None # token type.
        self.row  = None # token row.
        
class Stack(object):
    '''
    LL(1) 语法分析.
    '''
    def __init__(self):
        self.save_values = []
   
    def pop(self):
        value = self.save_values.pop()
        return value
   
    def push(self, value):
        self.save_values.append(value)   

*/
他们已经不再是单词了,是TOKEN,是终结符,他们已经是不可再分割的拉.
等我写玩语法分析,我再给你看。
手动构造FIRST FLLOW集也非常简单,只要在纸上画画。没有什么语法错误就OK了,不需要程序写出来。
LL(1),这种是基于栈的,也比较号理解。
LL(1) 就是通过终结符和非终结符来确定另一个产生式的.
        self.parsing_table = [] # 语法分析表.
        self.product_list = [] # 产生式表.
Reply View the author