分享一个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;
}
有疑问欢迎拍。
有问题欢迎问。 st标准参照哪家的 ?siemens 的 scl还是iec标准的 参照如下: realw 发表于 2016-3-17 20:11
参照如下:
下面没有了么? 本帖最后由 realw 于 2016-3-17 20:14 编辑
参照见附件。
另外标识符以可选的 @开头 是自定义的。留作未来保留标识符使用。 本帖最后由 realw 于 2016-3-17 21:40 编辑
zzsczz 发表于 2016-3-17 20:12
下面没有了么?
看了论坛上好多开源的东西,边看做了一点点东西,最后最深的感觉是flex与bison是工具,
先会用,编译原理的功底需要边做边体会。
启动时最难的部分其实是61131-3。
[*] 61131 软件模型
[*] 61131 类型系统
[*] 针对控制器开发人员二次开发的扩展接口设计
[*] 5种语言以及图形编程
realw 发表于 2016-3-17 20:58
看了论坛上好多开源的东西,边看做了一点点东西,最后最深的感觉是flex与bison是工具,
先会用,编译原理 ...
学习一下么 怎么都可以啦。
词法分析器后端是 C 语言 还是 特定机器?
zzsczz 发表于 2016-3-17 21:33
学习一下么 怎么都可以啦。
所有语言统一编译成为ST语言,
ST语言编译成自定义中间语言,
自定义中间语言解释执行。 #在这里快速回复#曾经做过一个简单的,实现st到c++转换 本帖最后由 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标准适合 运动控制用。 zzsczz 发表于 2016-3-17 22:14
工作量不小。
还有条路也可以看一下 ,西门子 的 step7, 西门子称之为 SCL ( IEC对应的为ST ,稍有不 ...
不太熟悉STEP7以及西门子的方案,抽空整理一些资料慢慢看。
bison的文件也写完了,IEC也看了有一段时间了,现在改方案代价有点大。
等bison我测试过以后,可以放上来。
本帖最后由 realw 于 2016-3-17 23:05 编辑
不知道 flex 与 西门子的词法有什么区别没有。 本帖最后由 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的文档
多谢提供资料。 牛人,拜读,学习!也再搞IEC61131-3 gpfrank 发表于 2016-3-20 15:21
牛人,拜读,学习!也再搞IEC61131-3
做什么呢? realw 发表于 2016-3-21 21:25
做什么呢?
机器自动化系统。 gpfrank 发表于 2016-3-21 22:01
机器自动化系统。
用的C还是Java C#? realw 发表于 2016-3-22 11:40
用的C还是Java C#?
那你接触过 KW 和 codesys么? realw 发表于 2016-3-22 12:39
那你接触过 KW 和 codesys么?
只参加过KW的宣讲。还有看过施耐德和贝福的CODESYS。但是具体的都没有接触过。
你都接触过吗? gpfrank 发表于 2016-3-24 08:13
只参加过KW的宣讲。还有看过施耐德和贝福的CODESYS。但是具体的都没有接触过。
你都接触过吗?...
KW 比较熟练了,但是CODESYS了解不多,不太清楚他的架构。 KW的资料我手头倒是不少。 研究PLC好资料,留名
页:
[1]