📄 comp.g
字号:
#!/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 + -