搜索
bottom↓
回复: 21

分享一个ST语言的flex文件

[复制链接]

出0入0汤圆

发表于 2016-3-17 19:38:12 | 显示全部楼层 |阅读模式
本帖最后由 realw 于 2016-3-17 19:39 编辑

实现ST语言总要学编译原理,但是学编译原理总也绕不开flex与bison,最近正好正在做类似的事情。

先从flex开始吧,分享一个ST语言的flex文件。


  1. %option nodefault yylineno noyywrap case-insensitive reentrant
  2. %option bison-bridge bison-locations nounput
  3. %option outfile="st.yy.c" header-file="st.yy.h"
  4.     /* make isatty() useless,avoiding including <unistd.h> */
  5. %option never-interactive nounistd

  6. %{

  7. #include <string.h>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <ctype.h>

  11. #define STLEXERROR do{ return STLEX_ERROR; }while(0)

  12. #define YY_USER_ACTION { yylloc->first_line=yylloc->last_line;\
  13.                           yylloc->first_column=yylloc->last_column;\
  14.                           yylloc->last_column+=strlen(yytext);  }

  15. static int comment(struct PlcCContext *context,struct PlcSrcLocation *loc,yyscan_t scanner);
  16. %}

  17. DIGIT   ([0-9])
  18. NODIGIT ([_a-z])
  19. INTEGER ({DIGIT}+)
  20. BINARY  ("2#"[01]+)
  21. OCTAL   ("8#"[0-7]+)
  22. HEX     ("16#"[0-9a-f]+)
  23. EXP     ([Ee][-+]?[0-9]+)

  24. %array


  25. %%
  26.     /* comment */
  27. "(*"        {
  28.                 if( comment(context,yylloc,yyscanner)!=0 ){
  29.                     STLEXERROR;
  30.                 }
  31.              }

  32.             /* keyword */

  33.     /* data type */
  34. BOOL#            {}
  35. REAL#            {}
  36. SINT#            {}
  37. INT#             {}
  38. DINT#            {}
  39. USINT#           {}
  40. UINT#            {}
  41. UDINT#           {}

  42. BOOL |
  43. REAL |
  44. SINT |
  45. INT  |
  46. DINT |
  47. USINT |
  48. UINT |
  49. UDINT |
  50. LINT |           
  51. ULINT |         
  52. LREAL |         
  53. CHAR  |         
  54. WCHAR |         
  55. BYTE  |         
  56. WORD  |         
  57. DWORD |         
  58. LWORD |         
  59. TIME  |         
  60. LTIME |         
  61. DATE  |         
  62. LDATE |         
  63. TIME_OF_DAY |   
  64. TOD         |   
  65. LTIME_OF_DAY |   
  66. LTOD         |   
  67. DATE_AND_TIME |  
  68. DT            |  
  69. LDATE_AND_TIME  |
  70. LDT             |
  71. STRING          |
  72. WSTRING {
  73.         }

  74.         /* literal constants */
  75. {INTEGER}   {
  76.             }

  77. {BINARY}    {
  78.     }

  79. {HEX}       {
  80.     }

  81. {OCTAL}     {
  82.     }

  83.         /* float literal constants */
  84. {DIGIT}*\.{DIGIT}+{EXP}? |
  85. {DIGIT}+\.{DIGIT}*{EXP}? |
  86. {DIGIT}+{EXP}  {
  87.             }

  88.     /* unsupported type */
  89. ANY         |
  90. ANY_DERIVED |
  91. ANY_ELEMENTARY |
  92. ANY_MAGNITUDE  |
  93. ANY_NUM     |
  94. ANY_REAL    |
  95. ANY_INT     |
  96. ANY_UNSIGNED |
  97. ANY_SIGNED  |
  98. ANY_DURATION |
  99. ANY_BIT     |
  100. ANY_CHARS   |
  101. ANY_STRING  |
  102. ANY_CHAR    |
  103. ANY_DATE    {
  104.             }

  105.     /* supported keyword */
  106. TRUE            { return LITERAL_VALUE; }
  107. FALSE           { return LITERAL_VALUE; }
  108. IF              { return IF; }
  109. THEN            { return THEN; }
  110. ELSIF           { return ELSIF; }
  111. ELSE            { return ELSE; }
  112. END_IF          { return END_IF; }
  113. NOT             { return NOT; }
  114. MOD             { return MOD; }
  115. AND             { return AND; }
  116. XOR             { return XOR; }
  117. OR              { return OR; }
  118. RETURN          { return RETURN; }
  119. GOTO            { return GOTO; }

  120.     /* unsupported keyword */
  121. VAR     |
  122. END_VAR |
  123. REPEAT  |
  124. UNTIL           |
  125. END_REPEAT     |
  126. WHILE          |
  127. END_WHILE      |
  128. FOR |
  129. TO  |
  130. BY  |
  131. DO  |
  132. END_FOR |
  133. CASE    |
  134. OF      |
  135. END_CASE    |
  136. EXIT   |
  137. ACTION |
  138. END_ACTION |
  139. ARRAY |
  140. AT |
  141. CONFIGURATION |
  142. END_CONFIGURATION |
  143. CONSTANT  |
  144. EN |
  145. ENO |
  146. F_EDGE |
  147. FUNCTION |
  148. END_FUNCTION |
  149. FUNCTION_BLOCK |
  150. END_FUNCTION_BLOCK |
  151. INITIAL_STEP |
  152. END_STEP |
  153. PROGRAM |
  154. WITH |
  155. END_PROGRAM |
  156. R_EDGE |
  157. READ_ONLY |
  158. READ_WRITE |
  159. RESOURCE |
  160. ON |
  161. END_RESOURCE |
  162. RETAIN |
  163. NON_RETAIN |
  164. STEP |
  165. STRUCT |
  166. END_STRUCT |
  167. TASK |
  168. TRANSITION |
  169. FROM |
  170. END_TRANSITION |
  171. VAR_INPUT |
  172. VAR_OUTPUT |
  173. VAR_IN_OUT |
  174. VAR_TEMP |
  175. VAR_EXTERNAL |
  176. VAR_ACCESS |
  177. VAR_CONFIG  {
  178.             }


  179.         /* delimiter & operator */
  180. "+" |
  181. "-" |
  182. "." |
  183. "'" |
  184. ":" |
  185. "("  |
  186. ")"  |
  187. "["  |
  188. "]"  |
  189. ","  |
  190. ";"   |
  191. "*"   |
  192. "/"   |
  193. "&"   |
  194. "!"   |
  195. "="   |
  196. "<"   |
  197. ">"   |
  198. "%"   { return yytext[0]; }

  199. ":="  { return ASSIGN; }
  200. "**"  { return EXP_OP; }
  201. "<="  { return LE_OP; }
  202. ">="  { return GE_OP; }
  203. "<>"  { return NE_OP; }

  204.         /* unsupported delimiter & operator */
  205. "=>" |
  206. ".."    {
  207.         }

  208. [ \t\r]  {  /*do nothing*/  }

  209. <*>\n      {
  210.         }

  211.         /* identifiers */
  212. @?({DIGIT}|{NODIGIT})+       {
  213.         }


  214.         /* end of file*/
  215. <<EOF>> {
  216.         return 0;
  217.         }

  218.         /* lex error */
  219. <*>.    {
  220.         }

  221. %%

  222. static int comment(struct PlcCContext *context,struct PlcSrcLocation *loc,yyscan_t scanner){
  223.     int c;
  224.     while(1){
  225.         c = input(scanner);
  226.         loc->last_column++;
  227.         if( c == '*' ){
  228.             c = input(scanner);
  229.             loc->last_column++;
  230.             if( c==')' ){
  231.                 return 0;
  232.             }
  233.         }
  234.         else if( c=='\n' ){
  235.             loc->last_line++;
  236.             loc->last_column=1;
  237.         }

  238.         if( c==EOF ){
  239.             return -1;
  240.         }
  241.     }

  242.     return -1;
  243. }
复制代码


有疑问欢迎拍。
有问题欢迎问。

出95入8汤圆

发表于 2016-3-17 19:58:19 | 显示全部楼层
st标准参照哪家的 ?  siemens 的 scl  还是  iec标准的

出0入0汤圆

 楼主| 发表于 2016-3-17 20:11:22 | 显示全部楼层
参照如下:

出95入8汤圆

发表于 2016-3-17 20:12:55 | 显示全部楼层

下面没有了么?

出0入0汤圆

 楼主| 发表于 2016-3-17 20:13:03 | 显示全部楼层
本帖最后由 realw 于 2016-3-17 20:14 编辑

参照见附件。

另外标识符以可选的 @开头 是自定义的。留作未来保留标识符使用。

本帖子中包含更多资源

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

x

出0入0汤圆

 楼主| 发表于 2016-3-17 20:58:53 | 显示全部楼层
本帖最后由 realw 于 2016-3-17 21:40 编辑
zzsczz 发表于 2016-3-17 20:12
下面没有了么?


看了论坛上好多开源的东西,边看做了一点点东西,最后最深的感觉是flex与bison是工具,
先会用,编译原理的功底需要边做边体会。

启动时最难的部分其实是61131-3。
  • 61131 软件模型
  • 61131 类型系统
  • 针对控制器开发人员二次开发的扩展接口设计
  • 5种语言以及图形编程

出95入8汤圆

发表于 2016-3-17 21:33:13 | 显示全部楼层
realw 发表于 2016-3-17 20:58
看了论坛上好多开源的东西,边看做了一点点东西,最后最深的感觉是flex与bison是工具,
先会用,编译原理 ...

学习一下么 怎么都可以啦。
  

词法分析器后端是 C 语言 还是 特定机器?

出0入0汤圆

 楼主| 发表于 2016-3-17 21:38:11 | 显示全部楼层
zzsczz 发表于 2016-3-17 21:33
学习一下么 怎么都可以啦。
  


所有语言统一编译成为ST语言,
ST语言编译成自定义中间语言,
自定义中间语言解释执行。

出0入0汤圆

发表于 2016-3-17 21:58:25 | 显示全部楼层
#在这里快速回复#曾经做过一个简单的,实现st到c++转换

出95入8汤圆

发表于 2016-3-17 22:14:10 | 显示全部楼层
本帖最后由 zzsczz 于 2016-3-17 22:23 编辑
realw 发表于 2016-3-17 21:38
所有语言统一编译成为ST语言,
ST语言编译成自定义中间语言,
自定义中间语言解释执行。 ...


工作量不小。

还有条路也可以看一下 ,西门子 的 step7,   西门子称之为 SCL ( IEC对应的为ST ,稍有不同)  编译成MC7,  对应 汇编SOURCE为  STL(IEC对应为IL ,不大相同)

官方 和第三方实现都有,开源的虚拟机实现也有。     按照 MC7格式 设计虚拟机即可,前面的有现成的, 现成产品 比 规范 要  现实  ; IEC标准适合 运动控制用。

出0入0汤圆

 楼主| 发表于 2016-3-17 22:53:57 | 显示全部楼层
zzsczz 发表于 2016-3-17 22:14
工作量不小。

还有条路也可以看一下 ,西门子 的 step7,   西门子称之为 SCL ( IEC对应的为ST ,稍有不 ...

不太熟悉STEP7以及西门子的方案,抽空整理一些资料慢慢看。

bison的文件也写完了,IEC也看了有一段时间了,现在改方案代价有点大。

等bison我测试过以后,可以放上来。

出0入0汤圆

 楼主| 发表于 2016-3-17 22:54:54 | 显示全部楼层
本帖最后由 realw 于 2016-3-17 23:05 编辑

不知道 flex 与 西门子的词法有什么区别没有。

出95入8汤圆

发表于 2016-3-17 23:38:31 | 显示全部楼层
本帖最后由 zzsczz 于 2016-3-17 23:45 编辑
realw 发表于 2016-3-17 22:54
不知道 flex 与 西门子的词法有什么区别没有。


细节区别有的  。

可参考:
http://www.plctalk.net/qanda/archive/index.php/t-68958.html        ;


不过 比较规范 和 产品的 区别 很扯。  STEP7 的 SCL 是控制系统中 部署数量最大的 ST实现 ,至于符不符合规范  ...西门子 就是规范。


西门子scl 帮助文件  s7sclapb.chm  有描述  SCL 文法。


http://pan.baidu.com/s/1skzvyjV    中有 s7sclapb.chm   ;

官方文档在
https://support.industry.siemens ... s7-300-400?lc=en-WW


鬼子们讨论部分结果有一条 是    s7sclapb.chm 中 关于 SCL 文法 用 图形 描述,可等价转化为EBNF   (类似传统PASCAL),用  ANTLR  处理方便些。

相对于整IEC   的ST ,  玩SCL 的 资料、资源和市场要多些  , 只用关系 执行MC7的虚拟机设计即可,ST到 IL的编译器 可以直接用STEP7,MC7代码格式可参考VIPA的文档








出0入0汤圆

 楼主| 发表于 2016-3-18 20:33:07 来自手机 | 显示全部楼层
多谢提供资料。

出0入0汤圆

发表于 2016-3-20 15:21:49 | 显示全部楼层
牛人,拜读,学习!也再搞IEC61131-3

出0入0汤圆

 楼主| 发表于 2016-3-21 21:25:03 | 显示全部楼层
gpfrank 发表于 2016-3-20 15:21
牛人,拜读,学习!也再搞IEC61131-3

做什么呢?

出0入0汤圆

发表于 2016-3-21 22:01:47 | 显示全部楼层

机器自动化系统。

出0入0汤圆

 楼主| 发表于 2016-3-22 11:40:10 | 显示全部楼层
gpfrank 发表于 2016-3-21 22:01
机器自动化系统。

用的C还是Java C#?

出0入0汤圆

 楼主| 发表于 2016-3-22 12:39:27 | 显示全部楼层
realw 发表于 2016-3-22 11:40
用的C还是Java C#?

那你接触过 KW 和 codesys么?

出0入0汤圆

发表于 2016-3-24 08:13:12 | 显示全部楼层
realw 发表于 2016-3-22 12:39
那你接触过 KW 和 codesys么?

只参加过KW的宣讲。还有看过施耐德和贝福的CODESYS。但是具体的都没有接触过。
你都接触过吗?

出0入0汤圆

 楼主| 发表于 2016-3-24 08:37:59 | 显示全部楼层
gpfrank 发表于 2016-3-24 08:13
只参加过KW的宣讲。还有看过施耐德和贝福的CODESYS。但是具体的都没有接触过。
你都接触过吗?  ...

KW 比较熟练了,但是CODESYS了解不多,不太清楚他的架构。 KW的资料我手头倒是不少。

出10入95汤圆

发表于 2016-5-2 18:20:45 | 显示全部楼层
研究PLC好资料,留名
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 15:40

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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