⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 comp.g

📁 CNC 的开放码,EMC2 V2.2.8版
💻 G
📖 第 1 页 / 共 3 页
字号:
#!/usr/bin/python#    This is 'comp', a tool to write HAL boilerplate#    Copyright 2006 Jeff Epler <jepler@unpythonic.net>##    This program is free software; you can redistribute it and/or modify#    it under the terms of the GNU General Public License as published by#    the Free Software Foundation; either version 2 of the License, or#    (at your option) any later version.##    This program is distributed in the hope that it will be useful,#    but WITHOUT ANY WARRANTY; without even the implied warranty of#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the#    GNU General Public License for more details.##    You should have received a copy of the GNU General Public License#    along with this program; if not, write to the Free Software#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USAimport os, sys, tempfile, shutil, getopt, timeBASE = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]), ".."))sys.path.insert(0, os.path.join(BASE, "lib", "python"))%%parser Hal:    ignore: "//.*"    ignore: "/[*](.|\n)*?[*]/"    ignore: "[ \t\r\n]+"    token END: ";;"    token PARAMDIRECTION: "rw|r"    token PINDIRECTION: "in|out|io"    token TYPE: "float|bit|signed|unsigned|u32|s32"    token NAME: "[a-zA-Z_][a-zA-Z0-9_]*"    token HALNAME: "[#a-zA-Z_][-#a-zA-Z0-9_.]*"    token FPNUMBER: "-?([0-9]*\.[0-9]+|[0-9]+\.?)([Ee][+-]?[0-9]+)?f?"    token NUMBER: "0x[0-9a-fA-F]+|[+-]?[0-9]+"    token STRING: "\"(\\.|[^\\\"])*\""    token POP: "[-()+*/]|&&|\\|\\||personality|==|&|!=|<|<=|>|>="    token TSTRING: "\"\"\"(\\.|\\\n|[^\\\"]|\"(?!\"\")|\n)*\"\"\""    rule File: ComponentDeclaration Declaration* "$" {{ return True }}    rule ComponentDeclaration:        "component" NAME OptString";" {{ comp(NAME, OptString); }}    rule Declaration:        "pin" PINDIRECTION TYPE HALNAME OptArray OptSAssign OptPersonality OptString ";"  {{ pin(HALNAME, TYPE, OptArray, PINDIRECTION, OptString, OptSAssign, OptPersonality) }}      | "param" PARAMDIRECTION TYPE HALNAME OptArray OptSAssign OptPersonality OptString ";" {{ param(HALNAME, TYPE, OptArray, PARAMDIRECTION, OptString, OptSAssign, OptPersonality) }}      | "function" NAME OptFP OptString ";"       {{ function(NAME, OptFP, OptString) }}      | "variable" NAME {{ NAME1=NAME; }} NAME OptSimpleArray OptAssign ";" {{ variable(NAME1, NAME, OptSimpleArray, OptAssign) }}      | "option" NAME OptValue ";"   {{ option(NAME, OptValue) }}      | "see_also" String ";"   {{ see_also(String) }}      | "description" String ";"   {{ description(String) }}      | "license" String ";"   {{ license(String) }}      | "modparam" NAME {{ NAME1=NAME; }} NAME OptSAssign OptString ";" {{ modparam(NAME1, NAME, OptSAssign, OptString) }}    rule String: TSTRING {{ return eval(TSTRING) }}             | STRING {{ return eval(STRING) }}     rule OptPersonality: "if" Personality {{ return Personality }}            | {{ return None }}    rule Personality: {{ pp = [] }} (PersonalityPart {{ pp.append(PersonalityPart) }} )* {{ return " ".join(pp) }}    rule PersonalityPart: NUMBER {{ return NUMBER }}            | POP {{ return POP }}    rule OptSimpleArray: "\[" NUMBER "\]" {{ return int(NUMBER) }}            | {{ return 0 }}    rule OptArray: "\[" NUMBER OptArrayPersonality "\]" {{ return OptArrayPersonality and (int(NUMBER), OptArrayPersonality) or int(NUMBER) }}            | {{ return 0 }}    rule OptArrayPersonality: ":" Personality {{ return Personality }}            | {{ return None }}     rule OptString: TSTRING {{ return eval(TSTRING) }}             | STRING {{ return eval(STRING) }}            | {{ return '' }}    rule OptAssign: "=" Value {{ return Value; }}                | {{ return None }}    rule OptSAssign: "=" SValue {{ return SValue; }}                | {{ return None }}    rule OptFP: "fp" {{ return 1 }} | "nofp" {{ return 0 }} | {{ return 1 }}    rule Value: "yes" {{ return 1 }} | "no" {{ return 0 }}                  | "true" {{ return 1 }} | "false" {{ return 0 }}                  | "TRUE" {{ return 1 }} | "FALSE" {{ return 0 }}                  | NAME {{ return NAME }}                | FPNUMBER {{ return float(FPNUMBER.rstrip("f")) }}                | NUMBER {{ return int(NUMBER,0) }}    rule SValue: "yes" {{ return "yes" }} | "no" {{ return "no" }}                  | "true" {{ return "true" }} | "false" {{ return "false" }}                  | "TRUE" {{ return "TRUE" }} | "FALSE" {{ return "FALSE" }}                  | NAME {{ return NAME }}                | FPNUMBER {{ return FPNUMBER }}                | NUMBER {{ return NUMBER }}    rule OptValue: Value {{ return Value }}                | {{ return 1 }}    rule OptSValue: SValue {{ return SValue }}                | {{ return 1 }}%%mp_decl_map = {'int': 'RTAPI_MP_INT', 'dummy': None}def parse(rule, text, filename=None):    global P, S    S = HalScanner(text, filename=filename)    P = Hal(S)    return runtime.wrap_error_reporter(P, rule)dirmap = {'r': 'HAL_RO', 'rw': 'HAL_RW', 'in': 'HAL_IN', 'out': 'HAL_OUT', 'io': 'HAL_IO' }typemap = {'signed': 's32', 'unsigned': 'u32'}deprmap = {'s32': 'signed', 'u32': 'unsigned'}deprecated = ['s32', 'u32']def initialize():    global functions, params, pins, options, comp_name, names, docs, variables    global modparams    functions = []; params = []; pins = []; options = {}; variables = []    modparams = []; docs = []    comp_name = None    names = {}def Warn(msg, *args):    if args:        msg = msg % args    print >>sys.stderr, "%s:%d: Warning: %s" % (S.filename, S.line, msg)def Error(msg, *args):    if args:        msg = msg % args    raise runtime.SyntaxError(S.get_pos(), msg, None)def comp(name, doc):    docs.append(('component', name, doc))    global comp_name    if comp_name:        Error("Duplicate specification of component name")    comp_name = name;def description(doc):    docs.append(('descr', doc));def license(doc):    docs.append(('license', doc));def see_also(doc):    docs.append(('see_also', doc));def type2type(type):    # When we start warning about s32/u32 this is where the warning goes    return typemap.get(type, type)    def checkarray(name, array):    hashes = len(re.findall("#+", name))    if array:        if hashes == 0: Error("Array name contains no #: %r" % name)        if hashes > 1: Error("Array name contains more than one block of #: %r" % name)    else:        if hashes > 0: Error("Non-array name contains #: %r" % name)def pin(name, type, array, dir, doc, value, personality):    checkarray(name, array)    type = type2type(type)    if name in names:        Error("Duplicate item name %s" % name)    docs.append(('pin', name, type, array, dir, doc, value, personality))    names[name] = None    pins.append((name, type, array, dir, value, personality))def param(name, type, array, dir, doc, value, personality):    checkarray(name, array)    type = type2type(type)    if name in names:        Error("Duplicate item name %s" % name)    docs.append(('param', name, type, array, dir, doc, value, personality))    names[name] = None    params.append((name, type, array, dir, value, personality))def function(name, fp, doc):    if name in names:        Error("Duplicate item name %s" % name)    docs.append(('funct', name, fp, doc))    names[name] = None    functions.append((name, fp))def option(name, value):    if name in options:        Error("Duplicate option name %s" % name)    options[name] = valuedef variable(type, name, array, default):    if name in names:        Error("Duplicate item name %s" % name)    names[name] = None    variables.append((type, name, array, default))def modparam(type, name, default, doc):    if name in names:        Error("Duplicate item name %s" % name)    names[name] = None    modparams.append((type, name, default, doc))def removeprefix(s,p):    if s.startswith(p): return s[len(p):]    return sdef to_hal(name):    name = re.sub("#+", lambda m: "%%0%dd" % len(m.group(0)), name)    return name.replace("_", "-").rstrip("-").rstrip(".")def to_c(name):    name = re.sub("[-._]*#+", "", name)    name = name.replace("#", "").replace(".", "_").replace("-", "_")    return re.sub("_+", "_", name)def prologue(f):    print >> f, "/* Autogenerated by %s on %s -- do not edit */" % (        sys.argv[0], time.asctime())    print >> f, """\#include "rtapi.h"#include "rtapi_app.h"#include "rtapi_string.h"#include "hal.h"static int comp_id;"""    names = {}    def q(s):        s = s.replace("\\", "\\\\")        s = s.replace("\"", "\\\"")        s = s.replace("\r", "\\r")        s = s.replace("\n", "\\n")        s = s.replace("\t", "\\t")        s = s.replace("\v", "\\v")        return '"%s"' % s    print >>f, "#ifdef MODULE_INFO"    for v in docs:        if not v: continue        v = ":".join(map(str, v))        print >>f, "MODULE_INFO(emc2, %s);" % q(v)    print >>f, "#endif // MODULE_INFO"    print >>f    license = finddoc('license')        if license and license[1]:        print >>f, "MODULE_LICENSE(\"%s\");" % license[1].split("\n")[0]    has_data = options.get("data")    has_array = False    has_personality = False    for name, type, array, dir, value, personality in pins:        if array: has_array = True        if isinstance(array, tuple): has_personality = True        if personality: has_personality = True    for name, type, array, dir, value, personality in params:        if array: has_array = True        if isinstance(array, tuple): has_personality = True        if personality: has_personality = True    for type, name, array, value in variables:        if array: has_array = True    for type, name, default, doc in modparams:        decl = mp_decl_map[type]        if decl:            print >>f, "%s %s" % (type, name),            if default: print >>f, "= %s;" % default            else: print >>f, ";"            print >>f, "%s(%s, %s);" % (decl, name, q(doc))                print >>f    print >>f, "struct state {"    print >>f, "    struct state *_next;"    if has_personality:        print >>f, "    int _personality;"    for name, type, array, dir, value, personality in pins:        if array:            if isinstance(array, tuple): array = array[0]            print >>f, "    hal_%s_t *%s[%s];" % (type, to_c(name), array)        else:            print >>f, "    hal_%s_t *%s;" % (type, to_c(name))        names[name] = 1    for name, type, array, dir, value, personality in params:        if array:            if isinstance(array, tuple): array = array[0]            print >>f, "    hal_%s_t %s[%s];" % (type, to_c(name), array)        else:            print >>f, "    hal_%s_t %s;" % (type, to_c(name))        names[name] = 1    for type, name, array, value in variables:        if array:            print >>f, "    %s %s[%d];\n" % (type, name, array)        else:            print >>f, "    %s %s;\n" % (type, name)    if has_data:        print >>f, "    void *_data;"    print >>f, "};"    if options.get("userspace"):        print >>f, "#include <stdlib.h>"    print >>f, "struct state *inst=0;"    print >>f, "struct state *first_inst=0;"        print >>f    for name, fp in functions:        if names.has_key(name):            Error("Duplicate item name: %s" % name)        print >>f, "static void %s(struct state *inst, long period);" % to_c(name)        names[name] = 1

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -