realw 发表于 2016-3-23 16:55:48

分享一个ST语言的bison文件

接上一份的 flex文件,
下面是realw写的st语言的bison文件。

%code top{

#include <stdio.h>
#include <stdlib.h>
}

%code requires{

#define YYLTYPE YYLTYPE
typedef struct PlcSrcLocation YYLTYPE;
typedef void* yyscan_t;
#define YYLTYPE_IS_TRIVIAL 1
}

%code provides{
#define YY_DECL int yylex   \
    (YYSTYPE *yylval_param,YYLTYPE *yylloc_param,struct PlcCContext *context,yyscan_t yyscanner)
   
YY_DECL;
}

%code {
void yyerror(YYLTYPE *loc,yyscan_t yyscanner,const char *msg);
}

/* Page 97,4.1,there is an example. */
%param { yyscan_t yyscanner }


/* Page 84 for yylex(YYSTYPE*,YYLTYPE*) */
%locations
%define api.pure full
/* enable run-time debug */
%define parse.trace
/* generate the parse description file. */
%verbose
/* verbose error reporting, 4.7 The Error Reporting Function*/
%define parse.error verbose
/* LAC enable, 5.8.3 LAC*/
%define parse.lac full

%start pou

%%

pou:
    %empty
    {
    }
    | stmt_list
    {
    }
    ;

stmt_list:
    statement
    {
    }
    | stmt_list statement
    {
    }
    ;

statement:
    ';'
    {
    }
    |   assignment_statement
    {
    }
    |   selection_statement
    {
    }
    |   function_call_statement
    {
    }
    |   jump_statement
    {
    }
    |   goto_label_statement
    {
    }
    |error_statement
    {
    }
    ;   

function_call_statement:
    function_call ';'
    {
    };


error_statement:
    error    ';'
    {
    }
    | error   ':'
    {
    }
    ;   

jump_statement:
    return_statement
    {
    }
    | goto_statement
    {
    }
    ;

return_statement:
    RETURN ';'
    {
    }
    | RETURN expression ';'
    {
    }
    ;

goto_statement:
    GOTO IDENTIFIER ';'
    {
    }
    ;

goto_label_statement:
    IDENTIFIER ':' statement
    {
    }
    ;

assignment_statement:
    sym_variable ASSIGN expression ';'
    {
    }
    ;

selection_statement:
    if_statement
    {
    }
    ;

if_statement:
    IF expression THEN stmt_list END_IF
    {
    }
    | IF expression THEN stmt_list elseif_stmt_list END_IF
    {
    }
    | IF expression THEN stmt_list ELSE stmt_list END_IF
    {
    }
    | IF error END_IF
    {
    }
    | IF expression THEN error END_IF
    {
    }
    ;

elseif_stmt_list:
    elseif_statement
    {
    }
    | elseif_stmt_list elseif_statement
    {
    }
    ;

elseif_statement:
    ELSIF expression THEN stmt_list
    {
    }
    ;

expression:
    bitwise_or_expression
    {
    }
    ;

bitwise_or_expression:
    bitwise_xor_expression
    {
    }
    | bitwise_or_expression OR bitwise_xor_expression
    {
    }
    ;

bitwise_xor_expression:
    bitwise_and_expression
    {
    }
    | bitwise_xor_expression XOR bitwise_and_expression
    {
    }
    ;

bitwise_and_expression:
    equality_expression
    {
    }
    | bitwise_and_expression '&' equality_expression
    {
    }
    | bitwise_and_expression AND equality_expression
    {
    }
    ;

equality_expression:
    relation_expression
    {
    }
    | equality_expression '=' relation_expression
    {
    }
    | equality_expression NE_OP relation_expression
    {
    }
    ;

relation_expression:
    additive_expression
    {
    }
    | relation_expression '<' additive_expression
    {
    }
    | relation_expression '>' additive_expression
    {
    }
    | relation_expression LE_OP additive_expression
    {
    }
    | relation_expression GE_OP additive_expression
    {
    }
    ;

additive_expression:
    multiplication_expression
    {
    }
    | additive_expression '+' multiplication_expression
    {
    }
    | additive_expression '-' multiplication_expression
    {
    }
    ;

multiplication_expression:
    exp_expression
    {
    }
    | multiplication_expression '*' exp_expression
    {
    }
    | multiplication_expression '/' exp_expression
    {
    }
    | multiplication_expression MOD exp_expression
    {
    }
    ;

exp_expression:
    unary_expression
    {
    }
    | exp_expression EXP_OP unary_expression
    {
    }
    ;

unary_expression:
    primary_expression
    {
    }
    | unary_operator primary_expression
    {
    }
    ;

unary_operator:
    '-'         
    {
    }
    | NOT      
    {
    }
    | '+'      
    {
    }
    ;

primary_expression:
    literal         
    {
    }
    | paren_expr
    {
    }
    | sym_variable         
    {
    }
    | function_call         
    {
    }
    ;      

paren_expr:
         '(' expression ')'
    {
    };

literal:
    TYPE_PREFIX LITERAL_VALUE
    {
    }
    | LITERAL_VALUE
    {
    };

sym_variable:
    IDENTIFIER
    {
    }
    | sym_variable '.' IDENTIFIER
    {
    }
    | sym_variable '[' expression']'
    {
    }
    | sym_variable '[' error ']'
    {
    }
    | sym_variable '.' error
    {
    }
    ;
      
function_call:
    IDENTIFIER '(' parameter_list ')'
    {
    }
    ;

parameter_list:
    %empty
    {}
    | parameter_init
    {
    }
    | parameter_list ',' parameter_init
    {
    }
    ;

parameter_init:
    IDENTIFIER ASSIGN expression
    {
    }
    | error
    {
    }
    ;

%%

void yyerror(YYLTYPE *loc,yyscan_t yyscanner,const char *msg){
}


已经经过了基本测试。

以上。                                realw

mangocity 发表于 2016-3-23 17:13:44

我敢打赌95%以上的电工不懂 lex 和 yacc。

realw 发表于 2016-3-23 19:30:05

mangocity 发表于 2016-3-23 17:13
我敢打赌95%以上的电工不懂 lex 和 yacc。

。 。 。 。 。 。 。 。 。

realw 发表于 2016-3-23 19:56:35

mangocity 发表于 2016-3-23 17:13
我敢打赌95%以上的电工不懂 lex 和 yacc。

不懂就一起学习被。

gpfrank 发表于 2016-3-29 12:01:10

正是我需要的。我参考beremiz也在搞!

fshunj 发表于 2016-3-29 12:42:29

mangocity 发表于 2016-3-23 17:13
我敢打赌95%以上的电工不懂 lex 和 yacc。

做编译器的工作很少,一般只有做IC的公司才有吧?

realw 发表于 2016-3-29 21:11:29

gpfrank 发表于 2016-3-29 12:01
正是我需要的。我参考beremiz也在搞!

直到 这种转成C,然后再调用GCC的做法有没有成熟的案例?

直接来说,这种方案系统复杂度太高了。

gpfrank 发表于 2016-3-29 22:37:24

realw 发表于 2016-3-29 21:11
直到 这种转成C,然后再调用GCC的做法有没有成熟的案例?

直接来说,这种方案系统复杂度太高了。 ...

beremiz不就是这个架构吗?

zzsczz 发表于 2016-3-30 09:14:05

realw 发表于 2016-3-29 21:11
直到 这种转成C,然后再调用GCC的做法有没有成熟的案例?

直接来说,这种方案系统复杂度太高了。 ...

CoDeSys就是如此啊

realw 发表于 2016-3-30 11:55:16

本帖最后由 realw 于 2016-3-30 14:02 编辑

zzsczz 发表于 2016-3-30 09:14
CoDeSys就是如此啊

我不是说这种方案行不通,而是认为这种方案的系统复杂度有点高。

因为随着开发的进行,设计可能会过于依赖第三方编译器的内部机制,而第三方通用编译器的复杂度
通常都会比较高,这会令整个系统的复杂度上升的比较快。而复杂度是软件最大的敌人。

zzsczz 发表于 2016-3-30 13:14:42

realw 发表于 2016-3-30 11:55
我不是说这种方案不好,而是认为这种方案的系统复杂度有点高。

因为随着开发的进行,设计可能会过于依赖 ...

把规范、ABI、API和虚拟机做好 。(一千个读者眼中有一千个哈姆雷特,一千个电工解读 iec标准,结果没一千个,百八十个是有的)

系统级的软件 摆脱不了编译器的,甚至是编译器 将就软件。

realw 发表于 2016-3-30 13:34:39

本帖最后由 realw 于 2016-3-30 13:44 编辑

zzsczz 发表于 2016-3-30 13:14
把规范、ABI、API和虚拟机做好 。(一千个读者眼中有一千个哈姆雷特,一千个电工解读 iec标准,结果没一 ...

把规范、ABI、API和虚拟机做好 ,和选择设计方案没有关系。这些是问题,无论何种方案都要解决。

他们两家编译C语言一定是调用第三方的编译器,自己再做一个C编译器这种方案就没有意义了。

我认为调用第三方的C编译器就是风险最高的部分,可能会比较快的出产品,但是第三方的C编译器
的复杂度会大大增加整个系统的复杂度。而方案的选择是整个设计中最重要的部分,因为它的影响会
从产品第一版发布到产品重写为止。某种意义上说,架构就是程序的文化。

realw 发表于 2016-3-30 13:36:41

gpfrank 发表于 2016-3-29 22:37
beremiz不就是这个架构吗?

我还没看过beremiz,我想问一下beremiz的C编译器用的是什么呢?

gpfrank 发表于 2016-3-31 12:09:19

realw 发表于 2016-3-30 13:36
我还没看过beremiz,我想问一下beremiz的C编译器用的是什么呢?

这个要看你平台了。

如果你用WINDOWS,那就用MINGWIN,
如果你用LINUX,就用GCC.
我是用的YAGATO

gpfrank 发表于 2016-3-31 12:11:39

realw 发表于 2016-3-30 13:34
把规范、ABI、API和虚拟机做好 ,和选择设计方案没有关系。这些是问题,无论何种方案都要解决。

他们两 ...

跟人觉得,重复造轮子,你能造得过GCC或者C LANG吗?
可能BUG比他们还多。
再说都是开源的

gpfrank 发表于 2016-3-31 12:13:52

当然这东西个人玩玩可以,
真的做产品,算了!大公司做做还可以,投入量,不是个人或者小公司玩得起锝。呵呵!

zzsczz 发表于 2016-3-31 15:18:47

gpfrank 发表于 2016-3-31 12:13
当然这东西个人玩玩可以,
真的做产品,算了!大公司做做还可以,投入量,不是个人或者小公司玩得起锝。呵 ...

自己不玩,不要妨碍别人玩。

玩也是一种学习啊。

看别人玩也是学习。

realw 发表于 2016-3-31 19:06:19

本帖最后由 realw 于 2016-3-31 19:07 编辑

gpfrank 发表于 2016-3-31 12:11
跟人觉得,重复造轮子,你能造得过GCC或者C LANG吗?
可能BUG比他们还多。
再说都是开源的 ...

我觉得,如果方案选择使用GCC或者LLVM作为编译器后端,你就不仅仅是使用这个工具了[当然,仅仅是使用也有很多坑],很多时候需要理解工具。

我认为学习GCC或者LLVM的难度高于自己做解释器,而且把一个庞然大物整合进自己的系统,想想脑袋就很大。最终没采用codesys的方案。

realw 发表于 2016-3-31 19:22:09

附件是我的ST语言的规格说明,也是我对于IEC61131-3ST语言的理解。

继续前行。

有一张图片转成PDF时丢失了.

gpfrank 发表于 2016-3-31 21:00:45

zzsczz 发表于 2016-3-31 15:18
自己不玩,不要妨碍别人玩。

玩也是一种学习啊。


不知道哪里妨碍别人玩了?

gpfrank 发表于 2016-3-31 21:03:06

realw 发表于 2016-3-31 19:06
我觉得,如果方案选择使用GCC或者LLVM作为编译器后端,你就不仅仅是使用这个工具了[当然,仅仅是使用也有 ...

如果转换成的目标不是c,而是虚拟机,再用解释器,个人觉得肯定比用gcc好控制!
用gcc我也只是玩玩而已!毕竟beremiz也还只是个框架!让人学习用的!

realw 发表于 2016-3-31 21:46:50

本帖最后由 realw 于 2016-4-1 09:54 编辑

gpfrank 发表于 2016-3-31 21:03
如果转换成的目标不是c,而是虚拟机,再用解释器,个人觉得肯定比用gcc好控制!
用gcc我也只是玩玩而已! ...

是的,这就是我选择不编译成C的原因。
毕竟主要精力需要放在IEC61131-3上,这个是做出来给自动化应用工程师用的。

我看过KW的方案,他们的方案是

KW --> CIL --> machine code

后端使用的是 MONO的AOT。

gpfrank 发表于 2016-4-1 08:23:53

本帖最后由 gpfrank 于 2016-4-1 08:29 编辑

realw 发表于 2016-3-31 21:46
是的,这就是我选择不编译成C的原因。
毕竟主要精力需要放在IEC61131-3上,这个是自动化应用工程师最常用 ...

参加过KW的研讨会,也了解他们的运行模式。
只知道他们用的是AOT技术,至于是不是MONO就不清楚了。而且似乎他还关闭了GC的功能。
通过AOT加无GC来克服CLR的实时性问题。

除BISON和FLEX。 我很想试试ANTLR。
不过我编译原理学的不是很好,所以还在学习中。

.NETMF现在也有一个分支,也再考虑提高速度。

realw 发表于 2016-4-1 09:53:24

gpfrank 发表于 2016-4-1 08:23
参加过KW的研讨会,也了解他们的运行模式。
只知道他们用的是AOT技术,至于是不是MONO就不清楚了。而且似 ...

如果打算学习编译原理,可以考虑coursera上的斯坦福大学的Compilers课程,以及Automata课程。其中自动机课程我已经拿到证书了。
不过我觉得这是一个交叉领域,61131-3也十分重要。

zzsczz 发表于 2016-4-1 19:31:24

本帖最后由 zzsczz 于 2016-4-1 19:39 编辑

realw 发表于 2016-3-31 19:06
我觉得,如果方案选择使用GCC或者LLVM作为编译器后端,你就不仅仅是使用这个工具了[当然,仅仅是使用也有 ...

同意。

ST 规范 要比C“呆板” ,用错的机率小 ;不过 规范 是一码事 ,实现 就是另外一回事了。

BTW 编译原理学习笔记能否共享?

realw 发表于 2016-4-2 13:29:58

zzsczz 发表于 2016-4-1 19:31
同意。

ST 规范 要比C“呆板” ,用错的机率小 ;不过 规范 是一码事 ,实现 就是另外一回事了。


我没做笔记,只是做完了 compiler && automata 的课后习题,参加了最终考试。

gpfrank 发表于 2016-4-3 19:07:51

realw 发表于 2016-3-31 21:46
是的,这就是我选择不编译成C的原因。
毕竟主要精力需要放在IEC61131-3上,这个是做出来给自动化应用工程 ...

设计一个比较好的虚拟机你有什么方案呢?

realw 发表于 2016-4-3 21:11:13

gpfrank 发表于 2016-4-3 19:07
设计一个比较好的虚拟机你有什么方案呢?

两种类型的虚拟机:
1. 堆栈型虚拟机;
2. 寄存器型虚拟机;

堆栈型虚拟机优点是代码密度大,实现起来容易,但是性能比较差,典型的Java,C#虚拟机就是这个样子,只是后面加上了JIT。

寄存器型虚拟机,实现复杂度高,目前大规模应用的只有LUA虚拟机,性能相对较高。


虚拟机最复杂的是内存回收部分,但是在我们的系统中动态分配的需求很少,可以使用一些简单的机制解决内存动态分配的问题,
没有了动态分配,也就不存在内存回收了。

gpfrank 发表于 2016-4-4 14:51:08

realw 发表于 2016-4-3 21:11
两种类型的虚拟机:
1. 堆栈型虚拟机;
2. 寄存器型虚拟机;


看来还是要参考LUA了。LUA的语法有点不习惯。
GC肯定是不能使用的,不然会破坏实时性。

虚拟机还有个好处,就是加载器不用担心没有MMU的问题。
可能唯一就是效率比C转换成目标代码的稍微慢点。

realw 发表于 2016-4-5 08:36:16

gpfrank 发表于 2016-4-4 14:51
看来还是要参考LUA了。LUA的语法有点不习惯。
GC肯定是不能使用的,不然会破坏实时性。



61131-3 同等重要, 如果你打算做出来给人用的话。

zzsczz 发表于 2016-4-5 14:46:08

realw 发表于 2016-4-5 08:36
61131-3 同等重要, 如果你打算做出来给人用的话。

61131-3 中 对 虚拟机 没有 强制性要求,具体实现交给供应商解决;相比之下 JVM CLR之类的很完备了 。(若不对请指出)

西门子 STEP7中梯形图 每个元素都能翻译成对应的 指令表 (STL 对应于61131-3 的IL ),西门子的 SCL(结构化文本)也可编译成STL; 西门子 STEP7的 虚拟机可执行代码规范是 MC7 ,对应汇编语言是 STL,STL的子集可用梯形图展现。


61131-3 的 IL 能否作为虚拟机的汇编语言?(可能性不大,找过几个开源方案,有采用自定义中间代码的 ,也有转C的 ,直接执行 IL 的还没有 )

61131-3 规范有很多部分(软件模型,类型系统)很抽象,有好多工作要做。


realw 发表于 2016-4-6 06:51:20

本帖最后由 realw 于 2016-4-6 06:53 编辑

zzsczz 发表于 2016-4-5 14:46
61131-3 中 对 虚拟机 没有 强制性要求,具体实现交给供应商解决;相比之下 JVM CLR之类的很完备了 。( ...

61131-3代表的是自动化应用工程师如何使用以下几种语言:
1. SFC
2. 功能块
3. 梯形图
4. ST
5. IL
以及编程模型中各种概念:
1. 任务
2. 程序
3. 功能块
4. 功能
5. 变量
6. 配置等等
还有一些基本数据数据类型:
1. 范型,各种ANY
2. 基础数据类型,INT等等
3. 自定义数据类型,结构体,数组等等

这个与虚拟机确实没啥关系,这个是产品定义。

使用JVM或者CLR的指令当然很好,因为没有必要再定义出来一套图灵完备的指令。

IL直接执行应该是可以的,但是执行性能可能会比较差,因为很多编译期的工作都推到了执行期。IL作为[缓冲]中间语言的一个大好处是编译性能可能会比较好,
很少有直接把5种语言都翻译成bytecode的,大部分是先翻译成一门缓冲型中间语言。然后统一翻译成为bytecode。我的方案是统一翻译成为ST,因为不打算
支持IL。


gpfrank 发表于 2016-4-6 08:34:08

realw 发表于 2016-4-6 06:51
61131-3代表的是自动化应用工程师如何使用以下几种语言:
1. SFC
2. 功能块


IL是没必要支持了。
连61131-3的第三版讨论中,都有取消IL的想法的。


realw 发表于 2016-4-6 22:58:46

本帖最后由 realw 于 2016-4-6 23:00 编辑

gpfrank 发表于 2016-4-6 08:34
IL是没必要支持了。
连61131-3的第三版讨论中,都有取消IL的想法的。

是的,IL好像没有什么支持的必要。

realw 发表于 2016-4-6 23:00:03

zzsczz 发表于 2016-4-5 14:46
61131-3 中 对 虚拟机 没有 强制性要求,具体实现交给供应商解决;相比之下 JVM CLR之类的很完备了 。( ...

整体工作量确实很大,
不算用例文件,我的单元测试代码量都快上万了。

zzsczz 发表于 2016-4-7 09:09:33

realw 发表于 2016-4-6 23:00
整体工作量确实很大,
不算用例文件,我的单元测试代码量都快上万了。

单元测试那么多 , 那你还不是信心满满

realw 发表于 2016-4-14 14:44:18

zzsczz 发表于 2016-4-7 09:09
单元测试那么多 , 那你还不是信心满满

另外,十分想探讨一下写AOT编译器的可行性。

各位有什么想法么?

realw 发表于 2016-4-14 14:44:38

gpfrank 发表于 2016-4-6 08:34
IL是没必要支持了。
连61131-3的第三版讨论中,都有取消IL的想法的。

另外,十分想探讨一下写AOT编译器的可行性。

各位有什么想法么?

zzsczz 发表于 2016-4-14 15:49:28

realw 发表于 2016-4-14 14:44
另外,十分想探讨一下写AOT编译器的可行性。

各位有什么想法么?

你讨论的问题已经超越电工的范围了。

上llvm

zzsczz 发表于 2016-4-14 19:13:26

realw 发表于 2016-4-14 14:44
另外,十分想探讨一下写AOT编译器的可行性。

各位有什么想法么?

看应用场合,运动控制 对 循环时间有要求,效率优先。

至于 PLC 开关量控制么,IO速度跟不上,稳定性优先,AOT需不需要掂量一下。

至于 参考设计么 西家 step7 5.x版本 是 st 编译成 MC7,   控制器 解释执行; 目前 博途 是 ST 编译成机器码 执行;

step5 -> step7 有 15年积累,step7 ->博途 有10多年积累。


建议C后端 ,可用资源多。

gpfrank 发表于 2016-4-19 08:24:43

realw 发表于 2016-4-14 14:44
另外,十分想探讨一下写AOT编译器的可行性。

各位有什么想法么?

比较赞同ZZSCZZ关于AOT的看法。

用来做逻辑,解释执行已经足够了。
用来做运动控制等,还是追求速度的。

不过话说回来。如果以61131-3的ST为核心,那么就是以运算,复杂逻辑为主的。所以速度还是很重要的。
如果只是逻辑控制的话,可能61131-3的思想还复杂化了,传统的PLC就够用了。
可能国内仿PLC很厉害,很火,和大部分是逻辑控制有关吧!
我看很少人自己研究MC的,很多都是购买了3S等MC的库。我们也没什么大学做这些基础研究感觉!

realw 发表于 2016-4-19 11:41:42

gpfrank 发表于 2016-4-19 08:24
比较赞同ZZSCZZ关于AOT的看法。

用来做逻辑,解释执行已经足够了。


很少人研究是因为很难么?
还是没法赚到快钱?

realw 发表于 2016-4-19 11:43:41

zzsczz 发表于 2016-4-14 19:13
看应用场合,运动控制 对 循环时间有要求,效率优先。

至于 PLC 开关量控制么,IO速度跟不上,稳定性优 ...

运动控制的精确程度是1毫秒级别还是1微秒级别的控制?

zzsczz 发表于 2016-4-20 09:19:34

realw 发表于 2016-4-19 11:43
运动控制的精确程度是1毫秒级别还是1微秒级别的控制?

http://pan.baidu.com/s/1o7UesP0

电流环8位微秒级别

速度环        16位100微秒

位置环32位4毫秒



控制指标 依 需求而定

realw 发表于 2016-5-3 09:11:14

gpfrank 发表于 2016-4-19 08:24
比较赞同ZZSCZZ关于AOT的看法。

用来做逻辑,解释执行已经足够了。


我没有回复短消息的权限。

我倒是有一些KW的开发包PDF可以发给你。

gpfrank 发表于 2016-5-4 16:51:28

realw 发表于 2016-5-3 09:11
我没有回复短消息的权限。

我倒是有一些KW的开发包PDF可以发给你。

如果可以的话,可以发送到我的信箱
xtrend_frank @126.com
谢谢!

gpfrank 发表于 2016-5-6 08:34:26

本帖最后由 gpfrank 于 2016-5-6 08:37 编辑

是KW的一些宣传资料吗?宣传资料我也有。
页: [1]
查看完整版本: 分享一个ST语言的bison文件