realw 发表于 2016-3-17 19:38:12

分享一个ST语言的flex文件

本帖最后由 realw 于 2016-3-17 19:39 编辑

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

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


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

%{

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

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

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

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

DIGIT   ()
NODIGIT ()
INTEGER ({DIGIT}+)
BINARY("2#"+)
OCTAL   ("8#"+)
HEX   ("16#"+)
EXP   ([-+]?+)

%array


%%
    /* comment */
"(*"      {
                if( comment(context,yylloc,yyscanner)!=0 ){
                  STLEXERROR;
                }
             }

            /* keyword */

    /* data type */
BOOL#            {}
REAL#            {}
SINT#            {}
INT#             {}
DINT#            {}
USINT#         {}
UINT#            {}
UDINT#         {}

BOOL |
REAL |
SINT |
INT|
DINT |
USINT |
UINT |
UDINT |
LINT |         
ULINT |         
LREAL |         
CHAR|         
WCHAR |         
BYTE|         
WORD|         
DWORD |         
LWORD |         
TIME|         
LTIME |         
DATE|         
LDATE |         
TIME_OF_DAY |   
TOD         |   
LTIME_OF_DAY |   
LTOD         |   
DATE_AND_TIME |
DT            |
LDATE_AND_TIME|
LDT             |
STRING          |
WSTRING {
      }

      /* literal constants */
{INTEGER}   {
            }

{BINARY}    {
    }

{HEX}       {
    }

{OCTAL}   {
    }

      /* float literal constants */
{DIGIT}*\.{DIGIT}+{EXP}? |
{DIGIT}+\.{DIGIT}*{EXP}? |
{DIGIT}+{EXP}{
            }

    /* unsupported type */
ANY         |
ANY_DERIVED |
ANY_ELEMENTARY |
ANY_MAGNITUDE|
ANY_NUM   |
ANY_REAL    |
ANY_INT   |
ANY_UNSIGNED |
ANY_SIGNED|
ANY_DURATION |
ANY_BIT   |
ANY_CHARS   |
ANY_STRING|
ANY_CHAR    |
ANY_DATE    {
            }

    /* supported keyword */
TRUE            { return LITERAL_VALUE; }
FALSE         { return LITERAL_VALUE; }
IF            { return IF; }
THEN            { return THEN; }
ELSIF         { return ELSIF; }
ELSE            { return ELSE; }
END_IF          { return END_IF; }
NOT             { return NOT; }
MOD             { return MOD; }
AND             { return AND; }
XOR             { return XOR; }
OR            { return OR; }
RETURN          { return RETURN; }
GOTO            { return GOTO; }

    /* unsupported keyword */
VAR   |
END_VAR |
REPEAT|
UNTIL         |
END_REPEAT   |
WHILE          |
END_WHILE      |
FOR |
TO|
BY|
DO|
END_FOR |
CASE    |
OF      |
END_CASE    |
EXIT   |
ACTION |
END_ACTION |
ARRAY |
AT |
CONFIGURATION |
END_CONFIGURATION |
CONSTANT|
EN |
ENO |
F_EDGE |
FUNCTION |
END_FUNCTION |
FUNCTION_BLOCK |
END_FUNCTION_BLOCK |
INITIAL_STEP |
END_STEP |
PROGRAM |
WITH |
END_PROGRAM |
R_EDGE |
READ_ONLY |
READ_WRITE |
RESOURCE |
ON |
END_RESOURCE |
RETAIN |
NON_RETAIN |
STEP |
STRUCT |
END_STRUCT |
TASK |
TRANSITION |
FROM |
END_TRANSITION |
VAR_INPUT |
VAR_OUTPUT |
VAR_IN_OUT |
VAR_TEMP |
VAR_EXTERNAL |
VAR_ACCESS |
VAR_CONFIG{
            }


      /* delimiter & operator */
"+" |
"-" |
"." |
"'" |
":" |
"("|
")"|
"["|
"]"|
","|
";"   |
"*"   |
"/"   |
"&"   |
"!"   |
"="   |
"<"   |
">"   |
"%"   { return yytext; }

":="{ return ASSIGN; }
"**"{ return EXP_OP; }
"<="{ return LE_OP; }
">="{ return GE_OP; }
"<>"{ return NE_OP; }

      /* unsupported delimiter & operator */
"=>" |
".."    {
      }

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

<*>\n      {
      }

      /* identifiers */
@?({DIGIT}|{NODIGIT})+       {
      }


      /* end of file*/
<<EOF>> {
      return 0;
      }

      /* lex error */
<*>.    {
      }

%%

static int comment(struct PlcCContext *context,struct PlcSrcLocation *loc,yyscan_t scanner){
    int c;
    while(1){
      c = input(scanner);
      loc->last_column++;
      if( c == '*' ){
            c = input(scanner);
            loc->last_column++;
            if( c==')' ){
                return 0;
            }
      }
      else if( c=='\n' ){
            loc->last_line++;
            loc->last_column=1;
      }

      if( c==EOF ){
            return -1;
      }
    }

    return -1;
}


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

zzsczz 发表于 2016-3-17 19:58:19

st标准参照哪家的 ?siemens 的 scl还是iec标准的

realw 发表于 2016-3-17 20:11:22

参照如下:

zzsczz 发表于 2016-3-17 20:12:55

realw 发表于 2016-3-17 20:11
参照如下:

下面没有了么?

realw 发表于 2016-3-17 20:13:03

本帖最后由 realw 于 2016-3-17 20:14 编辑

参照见附件。

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

realw 发表于 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种语言以及图形编程

zzsczz 发表于 2016-3-17 21:33:13

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

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


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

realw 发表于 2016-3-17 21:38:11

zzsczz 发表于 2016-3-17 21:33
学习一下么 怎么都可以啦。




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

liurangzhou 发表于 2016-3-17 21:58:25

#在这里快速回复#曾经做过一个简单的,实现st到c++转换

zzsczz 发表于 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标准适合 运动控制用。

realw 发表于 2016-3-17 22:53:57

zzsczz 发表于 2016-3-17 22:14
工作量不小。

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

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

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

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

realw 发表于 2016-3-17 22:54:54

本帖最后由 realw 于 2016-3-17 23:05 编辑

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

zzsczz 发表于 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.com/cs/document/5581793/s7-scl-v5-3-for-s7-300-400?lc=en-WW


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

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








realw 发表于 2016-3-18 20:33:07

多谢提供资料。

gpfrank 发表于 2016-3-20 15:21:49

牛人,拜读,学习!也再搞IEC61131-3

realw 发表于 2016-3-21 21:25:03

gpfrank 发表于 2016-3-20 15:21
牛人,拜读,学习!也再搞IEC61131-3

做什么呢?

gpfrank 发表于 2016-3-21 22:01:47

realw 发表于 2016-3-21 21:25
做什么呢?

机器自动化系统。

realw 发表于 2016-3-22 11:40:10

gpfrank 发表于 2016-3-21 22:01
机器自动化系统。

用的C还是Java C#?

realw 发表于 2016-3-22 12:39:27

realw 发表于 2016-3-22 11:40
用的C还是Java C#?

那你接触过 KW 和 codesys么?

gpfrank 发表于 2016-3-24 08:13:12

realw 发表于 2016-3-22 12:39
那你接触过 KW 和 codesys么?

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

realw 发表于 2016-3-24 08:37:59

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

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

ddcour 发表于 2016-5-2 18:20:45

研究PLC好资料,留名
页: [1]
查看完整版本: 分享一个ST语言的flex文件