精华内容
下载资源
问答
  • 多功能算法转换器是一款可以帮助用户快速查询不同计算机语言实现不同功能的语言语法,对于程序员来说,这款软件是非常好用的一款软件,离线集成了主流语言的N多常用的编程算法,让用户可以快速调用和查找,节省了...
  • 正如我在上一篇文章中所写的那样,我最近开始研究一种名为Turin的新编程语言。 可以在GitHub上找到适用于languag初始版本的编译器。 我目前正在改进语言,并正在开发Maven和IntelliJ插件。 在这里和下一篇文章中,我...

    正如我在一篇文章中所写的那样,我最近开始研究一种名为Turin的新编程语言。 可以在GitHub上找到适用于languag初始版本的编译器。 我目前正在改进语言,并正在开发MavenIntelliJ插件。 在这里和下一篇文章中,我将介绍编译器和相关工具的不同组件。

    编译器的结构

    编译器需要做几件事:

    1. 获取源代码并生成抽象语法树(AST)
    2. 通过不同阶段转换AST以简化处理。 我们基本上希望从非常接近语法的表示形式过渡到更易于处理的表示形式。 例如,我们可以对语言进行“去糖化”,将几种(显然)不同的结构表示为同一结构的变体。 一个例子? Java编译器将字符串连接转换为对StringBuffer.append的调用
    3. 执行语义检查。 例如,我们要检查所有表达式是否都使用可接受的类型(我们不想对字符求和,对吗?)
    4. 产生字节码

    第一步需要构建两个组件:词法分析器和解析器。 词法分析器对文本进行操作并生成标记序列,而解析器将标记组合到用于创建AST的构造(类型声明,语句,表达式等)中。 为了编写词法分析器和解析器,我使用了ANTLR。

    在本文的其余部分,我们将研究词法分析器。 解析器和编译器的其他组件将在以后的文章中讨论。

    为什么要使用ANTLR?

    ANTLR是用于编写词法分析器和解析器的非常成熟的工具。 它可以生成多种语言的代码,并具有良好的性能。 它维护良好,我确信它具有处理可能遇到的所有极端情况所需的所有功能。 除此之外,ANTLR 4可以编写简单的语法,因为它可以为您解决左递归定义。 因此,您不必编写许多中间节点类型即可为表达式指定优先级规则。 我们将在分析器中对此进行更多介绍。

    Xtext使用了ANTLR(我已经使用了很多),并且在为.NET平台 (一种用于.NET的EMF)构建模型驱动的开发框架时 ,我使用了ANTLR。 因此,我知道并信任ANTLR,因此没有理由寻找其他选择。

    当前的词法分析器语法

    这是词法分析器语法的当前版本。

    lexer grammar TurinLexer;
    
    @header {
    
    }
    
    @lexer::members {
        public static final int WHITESPACE = 1;
        public static final int COMMENTS = 2;
    }
    
    // It is suggested to define the token types reused in different mode.
    // See mode in-interpolation below
    tokens { VALUE_ID, TYPE_ID, INT, LPAREN, RPAREN, COMMA, RELOP, AND_KW, OR_KW, NOT_KW }
    
    // Of course keywords has to be defined before the rules for identifiers
    NAMESPACE_KW        : 'namespace';
    PROGRAM_KW          : 'program';
    PROPERTY_KW         : 'property';
    TYPE_KW             : 'type';
    VAL_KW              : 'val';
    HAS_KW              : 'has';
    ABSTRACT_KW         : 'abstract';
    SHARED_KW           : 'shared';
    IMPORT_KW           : 'import';
    AS_KW               : 'as';
    VOID_KW             : 'Void';
    RETURN_KW           : 'return';
    FALSE_KW            : 'false';
    TRUE_KW             : 'true';
    IF_KW               : 'if';
    ELIF_KW             : 'elif';
    ELSE_KW             : 'else';
    
    // For definitions reused in mode in-interpolation we define and refer to fragments
    AND_KW              : F_AND;
    OR_KW               : F_OR;
    NOT_KW              : F_NOT;
    
    LPAREN              : '(';
    RPAREN              : ')';
    LBRACKET            : '{';
    RBRACKET            : '}';
    LSQUARE             : '[';
    RSQUARE             : ']';
    COMMA               : ',';
    POINT               : '.';
    COLON               : ':';
    // We use just one token type to reduce the number of states (and not crash Antlr...)
    // https://github.com/antlr/antlr4/issues/840
    EQUAL               : '==' -> type(RELOP);
    DIFFERENT           : '!=' -> type(RELOP);
    LESSEQ              : '<=' -> type(RELOP);
    LESS                : '<'  -> type(RELOP);
    MOREEQ              : '>=' -> type(RELOP);
    MORE                : '>'  -> type(RELOP);
    // ASSIGNMENT has to comes after EQUAL
    ASSIGNMENT          : '=';
    // Mathematical operators cannot be merged in one token type because
    // they have different precedences
    ASTERISK            : '*';
    SLASH               : '/';
    PLUS                : '+';
    MINUS               : '-';
    
    PRIMITIVE_TYPE      : F_PRIMITIVE_TYPE;
    BASIC_TYPE          : F_BASIC_TYPE;
    
    VALUE_ID            : F_VALUE_ID;
    // Only for types
    TYPE_ID             : F_TYPE_ID;
    INT                 : F_INT;
    
    // Let's switch to another mode here
    STRING_START        : '"' -> pushMode(IN_STRING);
    
    WS                  : (' ' | '\t')+ -> channel(WHITESPACE);
    NL                  : '\r'? '\n';
    
    COMMENT             : '/*' .*? '*/' -> channel(COMMENTS);
    
    LINE_COMMENT        : '//' ~[\r\n]* -> channel(COMMENTS);
    
    mode IN_STRING;
    
    STRING_STOP         : '"' -> popMode;
    STRING_CONTENT      : (~["\\#]|ESCAPE_SEQUENCE|SHARP)+;
    INTERPOLATION_START : '#{' -> pushMode(IN_INTERPOLATION);
    
    mode IN_INTERPOLATION;
    
    INTERPOLATION_END   : '}' -> popMode;
    I_PRIMITIVE_TYPE    : F_PRIMITIVE_TYPE -> type(PRIMITIVE_TYPE);
    I_BASIC_TYPE        : F_BASIC_TYPE -> type(BASIC_TYPE);
    I_FALSE_KW          : 'false' -> type(FALSE_KW);
    I_TRUE_KW           : 'true' -> type(TRUE_KW);
    I_AND_KW            : F_AND -> type(AND_KW);
    I_OR_KW             : F_OR -> type(OR_KW);
    I_NOT_KW            : F_NOT -> type(NOT_KW);
    I_IF_KW             : 'if' -> type(IF_KW);
    I_ELSE_KW           : 'else' -> type(ELSE_KW);
    I_VALUE_ID          : F_VALUE_ID   -> type(VALUE_ID);
    I_TYPE_ID           : F_TYPE_ID -> type(TYPE_ID);
    I_INT               : F_INT -> type(INT);
    I_COMMA             : ',' -> type(COMMA);
    I_LPAREN            : '(' -> type(LPAREN);
    I_RPAREN            : ')' -> type(RPAREN);
    I_LSQUARE           : '[' -> type(LSQUARE);
    I_RSQUARE           : ']' -> type(RSQUARE);
    
    I_ASTERISK          : '*' -> type(ASTERISK);
    I_SLASH             : '/' -> type(SLASH);
    I_PLUS              : '+' -> type(PLUS);
    I_MINUS             : '-' -> type(MINUS);
    
    I_POINT             : '.' -> type(POINT);
    I_EQUAL             : '==' -> type(RELOP);
    I_DIFFERENT         : '!=' -> type(RELOP);
    I_LESSEQ            : '<=' -> type(RELOP);
    I_LESS              : '<'  -> type(RELOP);
    I_MOREEQ            : '>=' -> type(RELOP);
    I_MORE              : '>'  -> type(RELOP);
    I_STRING_START      : '"' -> type(STRING_START), pushMode(IN_STRING);
    I_WS                : (' ' | '\t')+ -> type(WS), channel(WHITESPACE);
    
    fragment F_AND            : 'and';
    fragment F_OR             : 'or';
    fragment F_NOT            : 'not';
    fragment F_VALUE_ID       : ('_')*'a'..'z' ('A'..'Z' | 'a'..'z' | '0'..'9' | '_')*;
    // Only for types
    fragment F_TYPE_ID        : ('_')*'A'..'Z' ('A'..'Z' | 'a'..'z' | '0'..'9' | '_')*;
    fragment F_INT            : '0'|(('1'..'9')('0'..'9')*);
    fragment F_PRIMITIVE_TYPE : 'Byte'|'Int'|'Long'|'Boolean'|'Char'|'Float'|'Double'|'Short';
    fragment F_BASIC_TYPE     : 'UInt';
    
    fragment ESCAPE_SEQUENCE  : '\\r'|'\\n'|'\\t'|'\\"'|'\\\\';
    fragment SHARP            : '#'{ _input.LA(1)!='{' }?;

    我已经做了一些选择:

    • 有两种不同类型的ID: VALUE_IDTYPE_ID。 由于可以轻松地区分值和类型,因此语法上的歧义性较小。 在Java中,当遇到(foo)时,我们不知道它是表达式(对括号之间foo表示的值的引用)还是类型foo的强制转换。 我们需要看下面的内容才能理解它。 我认为这很愚蠢,因为实际上每个人都只对类型使用大写的标识符,但是由于这不是由语言强制执行的,因此编译器无法从中受益
    • 换行符与都灵相关,因此我们有针对它们的标记,我们基本上希望语句以换行符终止,但我们在逗号后接受可选的换行符
    • 空格(但换行符)和注释是在它们自己的通道中捕获的,因此我们可以在解析器语法中忽略它们,但可以在需要时检索它们。 例如,我们需要它们来突出显示语法,并且通常需要IntelliJ插件,因为它需要为源文件中的每个单个字符定义标记,而没有空格
    • 最棘手的部分是在Ruby中解析字符串插值,例如“我的名字是#{user.name}”。 我们使用模式:遇到字符串开始(“)时,我们切换到词法分析器模式IN_STRING。 在IN_STRING模式下,如果遇到插值(#{)的开始,我们将移至词法分析器模式IN_INTERPOLATION。 在IN_INTERPOLATION模式下,我们需要接受表达式中使用的大多数标记(可悲的是,这意味着我们的词法分析器语法有很多重复)。
    • 我不得不将关系运算符折叠为一种令牌类型,以使生成的词法分析器的状态数不会太大。 这意味着我将不得不查看RELOP令牌的文本,以确定需要执行哪个操作。 没什么可怕的,但是您必须知道如何解决此类问题。

    测试词法分析器

    我写了很多针对词法分析器的测试。 特别是,我测试了最复杂的部分:有关字符串插值的部分。

    一些测试的示例:

    @Test
        public void parseStringWithEmptyInterpolation() throws IOException {
            String code = "\"Hel#{}lo!\"";
            verify(code, TurinLexer.STRING_START, TurinLexer.STRING_CONTENT, TurinLexer.INTERPOLATION_START, TurinLexer.INTERPOLATION_END, TurinLexer.STRING_CONTENT, TurinLexer.STRING_STOP);
        }
     
        @Test
        public void parseStringWithInterpolationContainingID() throws IOException {
            String code = "\"Hel#{foo}lo!\"";
            verify(code, TurinLexer.STRING_START, TurinLexer.STRING_CONTENT, TurinLexer.INTERPOLATION_START,
                    TurinLexer.VALUE_ID,
                    TurinLexer.INTERPOLATION_END, TurinLexer.STRING_CONTENT, TurinLexer.STRING_STOP);
        }
     
        @Test
        public void parseStringWithSharpSymbol() throws IOException {
            String code = "\"Hel#lo!\"";
            verify(code, TurinLexer.STRING_START, TurinLexer.STRING_CONTENT, TurinLexer.STRING_STOP);
        }
     
        @Test
        public void parseMethodDefinitionWithExpressionBody() throws IOException {
            String code = "Void toString() = \"foo\"";
            verify(code, TurinLexer.VOID_KW, TurinLexer.VALUE_ID, TurinLexer.LPAREN, TurinLexer.RPAREN, TurinLexer.ASSIGNMENT, TurinLexer.STRING_START, TurinLexer.STRING_CONTENT, TurinLexer.STRING_STOP);
        }

    如您所见,我只是在字符串上测试令牌,并验证它是否生成了正确的令牌列表。 简单而直接。

    结论

    我在ANTLR上使用该语言的经验并不完美:存在问题和局限性。 必须在单个令牌类型中折叠多个运算符并不好。 必须为不同的词法分析器模式重复几个标记定义是不好的。 但是,ANTLR被证明是在实践中可用的工具:它可以完成它需要做的所有事情,并且对于每个问题都有一个可接受的解决方案。 解决方案可能不是理想的,也许不是理想的解决方案,但是有一个解决方案。 因此,我可以使用它并继续进行编译器中更有趣的部分。

    翻译自: https://www.javacodegeeks.com/2015/09/turin-programming-language-for-the-jvm-building-advanced-lexers-with-antlr.html

    展开全文
  • 使用TextMate的简单方法添加多个插入点,一次即可...TextMate使用捆绑软件进行自定义,并支持无数种不同语言,标记系统,工作流等。 可以使用宏消除重复的工作。保存它们以便重复使用,或者记录便笺宏以立即重播。
  • 根据不同语言,要实现一个解析,是一个中等复杂的工作。本质上,解析就是把你的代码转换成一个“抽象语法树”(简称AST)。AST是代码的抽象语法结构的树状表现形式,抽象语法树的结构不依赖于源语言的文法。...

    根据不同的语言,要实现一个解析器,是一个中等复杂的工作。本质上,解析器就是把你的代码转换成一个“抽象语法树”(简称AST)。AST是代码的抽象语法结构的树状表现形式,抽象语法树的结构不依赖于源语言的文法。后面我会用专门的章节来描述我们的AST

    举个例子,看下面的一段代码:

    sum = lambda(a, b) {
      a + b;
    };
    print(sum(1, 2));复制代码

    我们的解析器会生成下面的AST,和JavaScript对象类似:

    {
      type: "prog",
      prog: [
        // 对应上面第一到第三行代码:
        {
          type: "assign",
          operator: "=",
          left: { type: "var", value: "sum" },
          right: {
            type: "lambda",
            vars: [ "a", "b" ],
            body: {
              type: "binary",
              operator: "+",
              left: { type: "var", value: "a" },
              right: { type: "var", value: "b" }
            }
          }
        },
        // 第四行代码:
        {
          type: "call",
          func: { type: "var", value: "print" },
          args: [{
            type: "call",
            func: { type: "var", value: "sum" },
            args: [ { type: "num", value: 1 },
                    { type: "num", value: 2 } ]
          }]
        }
      ]
    }复制代码

    编写解析器的主要困难在于未能正确合理的组织代码,解析器应该在更高的级别上运行从字符串中读取字符。几个如何保持复杂性管理的建议:

    • 所有的功能要尽可能简洁,而且每个功能只干好一件事就可以了。

    • 不要尝试用正则表达式去解析。他们不会工作。正则表达式在词法分析器会很有用,但是我建议能不用就不用,别让简单的事情复杂化。

    • 不要尝试猜测,当你不确定如何去解析的时候,就抛出异常,并且确保错误信息包含发生错误准确的位置(比如说在哪一行)。

    为了简单起见,我将我的代码分为三个部分,之后还会细分成许多小的功能:

    原文:lisperator.net/pltut/

    展开全文
  • Python的语言类型Python是强类型动态语言-静态编译语言一旦声明变量类型,变...弱类型语言不同类型之间可以操作,自动隐式转换Python解释官方的Cpython C语言写的解释Ipyhton升级的、有交互的CpythonPypy pyht...

    Python的语言类型

    Python是强类型动态语言

    -静态编译语言

    一旦声明变量类型,变类型不可改变,编译时需要检查

    -动态编译语言

    不用生变量类型,随时可以改变变量类型,很难推断变量类型

    -强类型语言

    不同类型之间操作,必须提前强制转化为同一类型

    -弱类型语言

    不同类型之间可以操作,自动隐式转换

    Python解释器

    官方的Cpython C语言写的解释器

    Ipyhton升级的、有交互的Cpython

    Pypy pyhton编写的解释器,拥有JIT(just in

    time)技术,动态编写python代码

    jython将python代码转换成Java字节码,运行在java虚拟机上

    Ironpython运行在.net平台的解释器,将pyhton代码转换为.net字节码

    Python基础语法

    注释– #标注的文本

    数字

    整数:不区分long和int,只有long;

    进制数0xz(十六进制) 0b10(二进制) 0o10(八进制)

    布尔值(Bool),共两个值true和false

    浮点数:由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,例如:1.34 0.12 -3.1 1.46e9=1.36*10^9

    复数:在python’中表示为a+bj,就是特定的表示,a和b是数字。

    字符串

    引用的字符序列

    单双三引号应用的字符序列可以跨行可以在其中使用任意引号

    在字符串前面家上r或R则表示字符串不做特殊处理

    转义序列

    换行

    tab键

    转义斜杠

    ‘(“)转义引号

    转义R,原先使用R则表示使用真实字符

    缩进Python采用缩进来表示层次关系,默认为缩进四个空格

    续行在行末是用符号如果使用括号则认为括号内的才是一个整体

    标识符

    1.只能表示一个值

    2.只能使用字母、下划线和数字

    3.只能用字母和下划线开头

    4.不能是python关键字

    5.区分大小写

    6.不能随便使用下划线开头的表示符,不能使用有歧义的单词,不允许使用中文

    –常量赋值后不能改变值的标识符,python无法定义常量

    –字面常量一个单独的量,如:12 “abc”

    –变量赋值后只可以改变的表示符

    Python编程语言作为人工智能的主要开发语言之一,越来越多的人开始喜欢并且使用开发。人工智能的造福我们的生活,正式编程语言起到了不可替代的作用。程序员对于Python语言的热度近些年也是始终不减。芜湖python培训由简入难,结合开发的实际需求进行授课。学习python人工智能编程培训就到达内人工智能python培训班,不仅可以免费试听,还可以真实感受人工智能带给我们的魅力。

    【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!

    填写下列表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费!怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

    展开全文
  • SCL作为一种编程语言,可以实现LAD/FBD所有的功能,大多数的指令与LAD/FBD都是相同的,只是在编辑中的外形不同。只有一些指令使用是不太一样的甚至LAD/FBD没有的,这里只介绍这些不同的。SCL特殊的指令有以下几种...

    SCL作为一种编程语言,可以实现LAD/FBD所有的功能,大多数的指令与LAD/FBD都是相同的,只是在编辑器中的外形不同。只有一些指令使用是不太一样的甚至LAD/FBD没有的,这里只介绍这些不同的。

    SCL特殊的指令有以下几种,如图1-3红框中的指令:

    b2f7ba8320bb8841cb26984de9865e4a.png

    图1 读写存储器

    98b76ba4f93f2b2a2577cd8855856cb4.png

    图2 转换操作

    205f633a0b85ea3e87f283325da56120.png

    图3 程序控制指令

    在这三部分中,读写存储器的PEEK POKE指令可以参考链接,转换操作可以参考链接,这里只介绍图3的程序控制指令。

    程序控制指令

    程序控制指令见以下表格。

    程序控制语句说明选择IF-THEN语句用将程序执行转移到两个备选分支之一(取决于条件为 True 还是 False)CASE语句用于选择执行 n 个备选分支之一(取决于变量值)循环FOR语句只要控制变量在指定值范围内,就重复执行某一语句序列WHILE-DO语句只要仍满足执行条件,就重复执行某一语句序列REPEAT-UNTIL语句重复执行某一语句序列,直到满足终止条件为止程序跳转CONTINUE语句停止执行当前循环迭代EXIT语句无论是否满足终止条件,都会随时退出循环GOTO语句使程序立即跳转到指定标签RETURN语句使程序立刻退出正在执行的块,返回到调用块

    程序控制指令是SCL编程的基础,接近高级语言的指令,虽然这些功能通过LAD/FBD也可以实现,但使用SCL编写会更加方便,逻辑条理也更加清晰。

    IF:条件执行

    说明:使用"条件执行"指令,可以根据条件控制程序流的分支。该条件是结果为布尔值(True 或 False)的表达式。可以将Bool变量、逻辑表达式或比较表达式作为条件。

    执行该条件执行指令时,将对指定的表达式进行运算。如果表达式的值为 True,则表示满足该条件;如果其值为 False,则表示不满足该条件。

    参数

    根据分支的类型,可以对以下形式的指令进行编程:

    • IF...THEN... 分支:IF <条件>THEN <语句1>END_IF;

    4d44b9771d6b9a05d3fea28d3883be2a.png

    图4 IF...THEN... 分支

    如果满足该条件,则将执行 THEN 后编写的指令。如果不满足该条件,则程序将从 END_IF 后的下一条指令开始继续执行。

    • IF...THEN... ELSE...分支:IF <条件>THEN <语句1>ELSE <语句2>END_IF;

    0fe9db51c1ed053a6109fb4aed09f2f3.png

    图5 IF...THEN... ELSE...分支

    如果满足该条件,则将执行 THEN 后编写的语句。如果不满足该条件,则将执行 ELSE 后编写的语句。不论执行哪一个语句,之后都将从 END_IF 后的下一条指令开始继续执行。

    • IF...THEN... ELSIF...分支:IF <条件1>THEN <语句1>ELSIF <条件2>THEN <语句2>END_IF;

    6ce2f97d4da3b5da43ba19122ea5b806.png

    图6 IF...THEN... ELSIF...分支

    如果满足条件1,则将执行 THEN 后的语句1,执行这些语句后,程序将从 END_IF 后继续执行。

    如果不满足条件1,则将检查条件2。如果满足条件2,则将执行 THEN 后的语句2。执行这些语句后,程序将从 END_IF 后继续执行。

    如果不满足任何条件,则直接执行 END_IF 后的程序部分。

    在 IF 指令内可以嵌套任意多个 ELSIF 和 THEN 组合。可以选择对 ELSE 分支进行编程。

    参数

    下表列出了该指令的参数:

    参数

    数据类型

    存储区

    说明

    <条件>

    BOOL

    I、Q、M、D、L

    待求值的表达式。

    <语句>

    -

    在满足条件时,要执行THEN后的语句。如果不满足条件,则执行 ELSE 后编写的语句。

    示例

    98d1c2d6af18a1deb394404d18791194.png

    图7 IF示例

    下表展示了不同的操作数数值对目标变量的影响:

    操作数值"Tag_1"TrueFalseFalseFalse"Tag_2"FalseTrueFalseFalse"Tag_3"FalseFalseTrueFalse"Tag_Value"1020300

    CASE:创建多路分支

    说明:使用"创建多路分支"指令,可以根据数字表达式的值执行多个指令序列中的一个。

    按如下方式声明此指令:

    CASE <变量> OF

    <常数1>: <语句1>;

    <常数2>: <语句2>;

    ......

    <常数n>: <语句n>;

    ELSE <语句>;

    END_CASE;

    v2-cf78e12735d21d429fb02d167f358b6c_b.jpg

    图8 CASE语句

    参数

    下表列出了该指令的参数:

    参数

    数据类型

    存储区

    说明

    <变量>

    整数、位序列*

    I、Q、M、D、L

    与设定的常数值进行比较的值。

    <常数>

    位序列

    -

    若为位序列,则常数可以为以下值:

    • 二进制数(例如,2#10)
    • 八进制数(例如,8#77)
    • 十六进制数(例如,16#AD)
    • 未定型的常数(例如,1000)

    整数

    作为指令序列执行条件的常数值。常数可以为以下值:

    • 整数(例如,5)
    • 整数范围(例如,15 到 20)
    • 由整数和范围组成的枚举(例如,10、11、15 到 20)

    <语句>

    -

    -

    当表达式的值等于某个常数值时,将执行该常数后的各种指令。如果不满足条件,则执行 ELSE 后编写的指令。如果两个值不相等,则执行这些指令。

    * TIA PORTAL V16开始支持位序列数据类型的变量

    示例

    60062c9548a43ad8fb2c006cd111737e.png

    图9 CASE示例

    下表展示了不同的操作数数值对目标变量的影响:

    操作数值"Tag_Value"01,3,56,7,8,9,1016,17,20,21,22,23,24,25其他"Tag_1"1----"Tag_2"-1---"Tag_3"--1--"Tag_4"---1-"Tag_5"----1

    FOR:在计数循环中执行

    说明:使用"在计数循环中执行"指令,重复执行程序循环,直至运行变量不在指定的取值范围内。

    也可以嵌套程序循环。在程序循环内,可以编写包含其它运行变量的其它程序循环。

    通过指令"复查循环条件"(Continue),可以终止当前正在运行的程序循环。通过指令"立即退出循环"(Exit)终止整个循环的执行。

    注意:

    有关运行次数和运行变量的信息:

    程序运行时无法更改运行次数。出于性能原因,应在块接口的"Temp"部分中声明运行变量。在循环中,该运行变量无法更改。

    按如下方式声明此指令:

    FOR <运行变量> := <起始值> TO <结束值> BY <增量> DO

    <语句>;

    END_FOR;

    如果增量为1,可以简写为:

    FOR <运行变量> := <起始值> TO <结束值> DO

    <语句>;

    END_FOR;

    c62492b56b9602f2bea7ec032f221130.png

    图10 FOR语句

    下表列出了该指令的参数:

    参数

    数据类型

    存储区

    说明

    <运行变量>

    有符号整数、无符号整数*

    I、Q、M、D、L

    执行循环时会计算其值的操作数。执行变量的数据类型将确定其它参数的数据类型。

    <起始值>

    I、Q、M、D、L

    表达式,在运行变量首次执行循环时,将为运行变量分配该表达式的值。

    <结束值>

    I、Q、M、D、L

    表达式,在运行程序最后一次循环时会为运行变量分配该表达式的值。在每个循环后都会检查运行变量的值:

    • 未达到结束值:
      执行符合 DO 的语句
    • 达到结束值:
      最后执行一次 FOR 语句
    • 超出结束值:
      完成 FOR 循环

    执行该指令期间,不允许更改结束值。

    <增量>

    I、Q、M、D、L

    表达式,根据增量表达式的值,执行变量在每次循环后都会递增(正增量)或递减(负增量)自身变量值。

    如果未指定增量,则在每次循环后执行变量的值加 1。

    执行该指令期间,不允许更改增量。

    <语句>

    -

    只要运行变量的值在取值范围内,每次循环都就会执行的语句。取值范围由起始值和结束值定义。

    *TIA PORTAL V16开始支持无符号整数类型的变量

    示例

    6c981371317345ef7aaac954ec027efe.png

    图11 FOR示例

    Tag_Value 操作数乘以b_array 数组变量的元素 (2, 4, 6, 8)。并将计算结果读入到a_array 数组变量的元素 (2, 4, 6, 8) 中。

    下表展示了给定 Tag_Value 与 b_array[i] 的值得到 a_array[i] 的结果:

    设定Tag_Value值5设定b_array[2]b_array[4]b_array[6]b_array[8]值3579结果a_array[2]a_array[4]a_array[6]a_array[8]值15253545

    WHILE:满足条件时执行

    说明:使用"满足条件时执行"指令可以重复执行程序循环,直至不满足执行条件为止。该条件是结果为布尔值(True 或 False)的表达式。可以将逻辑表达式或比较表达式作为条件。

    执行该指令时,将对指定的表达式进行运算。如果表达式的值为 True,则表示满足该条件;如果其值为 False,则表示不满足该条件。

    也可以嵌套程序循环。在程序循环内,可以编写包含其它运行变量的其它程序循环。

    通过指令"复查循环条件"(Continue),可以终止当前连续运行的程序循环。通过指令"立即退出循环"(Exit)终止整个循环的执行。

    可按如下方式声明此指令:

    WHILE <条件>

    DO <语句>;

    END_WHILE;

    2ea20cdab0f92090d73ba93e13bbdc2a.png

    图12 WHILE语句

    参数

    下表列出了该指令的参数:

    参数

    数据类型

    存储区

    说明

    <条件>

    BOOL

    I、Q、M、D、L

    表达式,每次执行循环之前都需要进行求值。

    <语句>

    -

    在满足条件时,要执行的语句。如果不满足条件,则程序将从 END_WHILE 后继续执行。

    示例

    d79e8f55052ae8a1bf627c19df45d831.png

    图13 WHILE示例

    下表展示了循环初始和循环结束时变量值的变化

    初始循环结束Tag_25Tag_105

    REPEAT:不满足条件时执行

    说明:使用"不满足条件时执行"指令可以重复执行程序循环,直至不满足执行条件为止。该条件是结果为布尔值(True 或 False)的表达式。可以将逻辑表达式或比较表达式作为条件。

    执行该指令时,将对指定的表达式进行运算。如果表达式的值为 True,则表示满足该条件;如果其值为 False,则表示不满足该条件。

    即使满足终止条件,至少也会执行一次循环内的语句。

    也可以嵌套程序循环。在程序循环内,可以编写包含其它运行变量的其它程序循环。

    通过指令"复查循环条件"(Continue),可以终止当前连续运行的程序循环。通过指令"立即退出循环"(Exit)终止整个循环的执行。

    可按如下方式声明此指令:

    REPEAT <语句>;

    UNTIL <条件>

    END_REPEAT;

    a530fadd0c763ba198de34773d733ff9.png

    图14 REPEAT语句

    参数

    下表列出了该指令的参数:

    参数

    数据类型

    存储区

    说明

    <语句>

    -

    在设定条件的值为 False 时执行的指令。即使满足终止条件,此指令也执行一次。

    <条件>

    BOOL

    I、Q、M、D、L

    表达式,每次执行循环之后都需要进行求值。如果表达式的值为 False,则将再次执行程序循环。如果表达式的值为 True,则程序循环将从 END_REPEAT 后继续执行。

    示例

    83833327f96c93d3e39069a98466cd59.png

    图15 REPEAT示例

    下表展示了循环初始和循环结束时变量值的变化

    初始循环结束Tag_25Tag_106

    CONTINUE:复查循环条件

    说明:使用"复查循环条件"指令,可以结束 FOR、WHILE 或 REPEAT 循环的当前程序运行。

    执行该指令后,将再次计算继续执行程序循环的条件。该指令将影响其所在的程序循环。

    89321a832ca105f803f8f9b6203ce4d3.png

    图16 CONTINUE用在FOR循环

    67ece9243457872b520dc8e2f90e853f.png

    图17 CONTINUE用在WHILE循环

    05cf7811b1570143ab790e3b8237932d.png

    图18 CONTINUE用在REPEAT循环

    示例

    dc6da8a008ca80e5260824fe7877ea6e.png

    图19 CONTINUE示例

    下表展示了计算结果:

    变量计算结果"DB10".Test[0]-"DB10".Test[1]-"DB10".Test[2]-"DB10".Test[3]-"DB10".Test[4]-"DB10".Test[5]1"DB10".Test[6]1"DB10".Test[7]1

    如果满足条件 i < 5,则不执行后续值分配 ("DB10".Test[i] := 1)。运行变量 (i) 以增量"1"递增,然后检查其当前值是否在设定的循环取值范围内。如果执行变量在循环取值范围内,则将再次计算 IF 的条件。

    如果不满足条件 i < 5,则将执行后续值分配 ("DB10".Test[i] := 1) 并开始一个新循环。在这种情况下,执行变量也会以增量"1"进行递增并接受检查。

    EXIT:立即退出循环

    说明:使用"立即退出循环"指令,可以随时取消 FOR、WHILE 或 REPEAT 循环的执行,而无需考虑是否满足条件,并在循环结束(END_FOR、END_WHILE 或 END_REPEAT)后继续执行程序。

    该指令将影响其所在的程序循环。

    3fd2db3a3584c180c9b21107ff4aecd1.png

    图20 EXIT语句

    示例

    2a429ca1457c3c7d2404a319a39bd03a.png

    图21 EXIT示例

    下表展示了计算结果:

    变量计算结果"DB10".Test[0]1"DB10".Test[1]1"DB10".Test[2]1"DB10".Test[3]1"DB10".Test[4]1"DB10".Test[5]1"DB10".Test[6]-"DB10".Test[7]-

    如果满足条件 i > 5,则将取消循环执行。程序将从 END_FOR 后继续执行。

    如果不满足条件 i <= 5,则将执行后续值分配 ("DB10".Test[i] :=1) 并开始一个新循环。将运行变量 (i) 以 1 进行递增,并进行检查该变量的当前值是否在程序中设定的循环取值范围之内。如果执行变量 (i) 在循环取值范围内,则将再次计算 IF 的条件。

    GOTO:跳转

    说明:使用"跳转"指令,可以从标注为跳转标签的指定点开始继续执行程序。

    跳转标签和"跳转"指令必须在同一个块中。在一个块中,跳转标签的名称只能指定一次。每个跳转标签可以是多个跳转指令的目标。不允许从"外部"跳转到程序循环内,但允许从循环内跳转到"外部"。

    注意:

    LAD/FBD语言内的SCL段,不能使用GOTO指令。

    跳转标签遵循以下语法规则:

    • 字母(a 至 z,A 至 Z)
    • 字母和数字组合;请必须字母为开始

    可按如下方式声明此指令:

    GOTO <跳转标签>;

    ...

    <跳转标签>: <语句>

    示例

    cb7e986e071e5e53a9b96ebc5a7b6234.png

    图22 GOTO示例

    下表展示了每个操作数数值对目标变量的变化影响:

    操作数值Tag_Value123其他

    初始值结束值初始值结束值初始值结束值初始值结束值Tag_101000000Tag_201010000Tag_301010100Tag_401010101

    根据"Tag_Value"操作数的值,程序将从对应的跳转标签标识点开始继续执行。例如,如果"Tag_Value"操作数的值为 2,则程序将从跳转标签"MyLABEL2"开始继续执行。在这种情况下,将跳过"MyLABEL1"跳转标签所标识的程序行。

    RETURN:退出块

    说明:使用"退出块"指令,可以终止当前处理块中的程序执行,并在调用块中继续执行。

    如果该指令出现在块结尾处,则可以跳过。

    faa2772a5062dcd015778a2be8220c63.png

    图23 RETURN语句

    示例

    ea3a675dfa2a43ebd0d20808756f54e2.png

    图24 RETURN示例

    如果"Tag_Error"操作数的信号状态不为 0,则将终止当前处理块中的程序执行。

    展开全文
  • PERL语言编程

    2007-06-24 11:55:48
    从 Perl 最早的文本处理语言开始,它已经发展成为一种非常复杂的,通用的编程语言,以及完整的开发环境,包括调试,调节,交叉引用,编译器,库,语法提示编辑,以及所有其它“真正”的编程语言所具有的所有...
  • 在计算机内部,Python解释把源代码转换成称为字节码的中间形式,然后再把它翻译成计算机使用的机器语言并运行。事实上,由于你不再需要担心 如何编译程序,如何确保连接转载正确的库等等,所有这一切使得使用...
  • 指令SCL作为一种编程语言,可以实现LAD/FBD所有的功能,大多数的指令与LAD/FBD都是相同的,只是在编辑中的外形不同。只有一些指令使用是不太一样的甚至LAD/FBD没有的,这里只介绍这些不同的。SCL特殊的指令有以下...
  • 指令SCL作为一种编程语言,可以实现LAD/FBD所有的功能,大多数的指令与LAD/FBD都是相同的,只是在编辑中的外形不同。只有一些指令使用是不太一样的甚至LAD/FBD没有的,这里只介绍这些不同的。SCL特殊的指令有以下...
  • 1.Java的简单类型及其封装类 ⑴Java简单类型与封装类 我们知道,Java语言是典型的支持面向对象的程序语言,但考虑到有些基本数据类型的结构简单,占内存小且存取速度快等优点,Java依然提供了对这些非面向对象的...
  • 词法分析我了解的有两种,一类是状态机,根据遇到不同的字符转换不同的状态来决定下一个字符应该是什么,另一种就是直接写词法分析,简单的if判断。前者实现的代码很少(可参见本人博客编译原理栏目下),,但是需要...
  • 计算机是一个由不同组件构成的复杂系统。但其心脏,或称为大脑,是进行实际计算的组件,我们称其为中央...(如果用其他种类的编程语言编写程序,并将其转换成相应的机器语言,你的程序同样可以执行。)  当CPU执行
  • 农历太阳能日历转换器 公历(阳历)农历(阴历)转换,支持时间段从1900-2100如果需要更长的时间段,利用generate.htm生成的数据即可。支持各种编程语言C#,java,Objective-C,php,Python,javascript(nodejs)...
  • 一、机器语言和汇编语言 ...我们也提到过了,这些指令集其实都是一些0101的二进制组合,计算机会将它们转换为一系列高低电平的电信号,配合我们前面了解的继电、门电路等完成对硬件的控制。而不同的CPU结构,即使...
  • 纳米级忆阻可以代替混沌系统的非线性部分,这可以大大减小混沌系统的物理尺寸。 更重要的是,它可以增强混沌系统的复杂... 此外,本文采用改进的牛顿迭代法,利用verilog硬件描述语言(verilog HDL)设计忆阻的平方
  • 什么是汇编语言

    万次阅读 多人点赞 2018-11-19 21:21:37
    汇编语言(assembly language)是一种用于电子计算机、微处理、微控制或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号...
  • 汇编语言是最古老的编程语言,在所有的语言中,它与原生机器语言最为接近。它能直接访问计算机硬件,要求用户了解计算机架构和操作系统。用于电子计算机、微处理、微控制或其他可编程器件的低级语言,亦称为符号...
  • 什么是汇编语言 百度一下汇编语言(assembly language)是一种用于电子计算机、微处理、微控制或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号...
  • 汇编语言基础

    2020-07-20 00:22:36
    汇编语言是直接在硬件上工作的编程语言,而汇编语言的产生则要提及机器语言,在现代编程中,机器语言已经不再为开发者使用,汇编语言是开发者接触到的最底层的编程语言了。 机器语言,它是机器指令的集合,每一个...
  • 汇编语言 1

    2018-10-02 21:48:00
    编程语言 : 汇编语言 百度词条:  汇编语言(assembly language)是一种用于电子计算机、微处理、微控制或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符(Mnemonics)代替机器指令...
  • 汇编语言

    2017-01-23 11:35:00
    汇编语言(assembly language)是一种用于电子计算机、微处理、微控制或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号...
  • 汇编语言程序设计

    2018-02-09 16:39:53
    汇编语言(assembly language)是一种用于电子计算机、微处理、微控制或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)...
  • 1、什么是动态语言?...答:不同类型之间可以进行操作,解释会自动隐式转换 常见语言类型示例图 注:由图可见:Python属于动态、强类型语言 Python的具体演示: 1、动态语言演示 a = 123 a = 'pyth
  • 汇编语言程序设计.zip

    2020-05-31 10:53:57
    汇编语言(assembly language)是一种用于电子计算机、微处理、微控制或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。在...
  • 汇编语言(Assembly Language)是任何一种用于电子计算机、微处理、微控制或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址...
  • 汇编语言3-3.ppt

    2020-07-06 13:58:43
    汇编语言(assembly language)是一种用于电子计算机、微处理、微控制或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。在...
  • 汇编语言 第一章总结

    2018-10-21 19:02:00
    不同的设备中,汇编语言对应着不同的机器语言指令集,通过编程过程转换成机器指令。普通的说,特定的汇编语言和特定的机器语言指令集是一一对应的、不同平台之间不可直接移植。 汇编语言的主体是汇编指令。汇编...
  • 汇编语言学习笔记

    2020-12-06 23:29:55
    汇编语言(Assembly Language)是任何一种用于电子计算机、微处理、微控制或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 494
精华内容 197
关键字:

不同编程语言转换器