Skip to content

Instantly share code, notes, and snippets.

@tacaswell
Last active March 22, 2017 01:53
Show Gist options
  • Save tacaswell/bd98b178e477093876c1ccb8cccadf73 to your computer and use it in GitHub Desktop.
Save tacaswell/bd98b178e477093876c1ccb8cccadf73 to your computer and use it in GitHub Desktop.
playing with dbd + parsimonious
from parsimonious.grammar import Grammar, NodeVisitor
grammar = Grammar(r"""
dbd = (comment / cimport / field / menu / record_type / variable / device / include / registrar / function / driver / "\n")+
field = _ "field(" f_name "," _ f_type ")" _ "{" (fp / "\n" )* _ "}"
f_name = ~"[A-Z0-9_]+"
f_type = "DBF_STRING" / "DBF_CHAR" / "DBF_UCHAR" / "DBF_SHORT" / "DBF_USHORT" / "DBF_LONG" / "DBF_ULONG" / "DBF_FLOAT" / "DBF_DOUBLE" / "DBF_ENUM" / "DBF_MENU" / "DBF_DEVICE" / "DBF_INLINK" / "DBF_OUTLINK" / "DBF_FWDLINK" / "DBF_NOACCESS"
fp = _ (prompt / special / size / promptgroup / g_field / comment / extra / "\n")
prompt = "prompt(" prompt_val ")\n"
special = "special(" special_val ")\n"
size = "size(" size_val ")\n"
extra = "extra(" extra_val ")\n"
g_field = ~"[a-z]*\(" ~"[^)]*" ")\n"
promptgroup = "promptgroup(" promptgroup_val ")\n"
prompt_val = ~'"[^"]*"'
extra_val = ~'"[^"]*"'
promptgroup_val = ~'"[^"]*"'
special_val = ~'[^)]*'
size_val = ~'[0-9]*'
menu = "menu(" menu_name ")" _ "{" (choice / comment / "\n")* "}" "\n"
choice = _ "choice(" ~"[^,]*" "," _ ~'"[^"]*"' ")\n"
menu_name = ~"[a-z0-9]*"i
record_type = "recordtype(" rec_name ")" _ "{" (field / include / cimport / comment / "\n")* "}"
include = _ "include" _ include_fname _
include_fname = ~'"[^"]*"'
rec_name = ~"[a-z]*"i
_ = ~r"\s*"
variable = "variable(" ~"[^)]*" ")"
device = "device" _ "(" ~"[^)]*" ")"
registrar = "registrar(" ~"[^)]*" ")"
function = "function" _ "(" ~"[^)]*" ")"
driver = "driver(" ~"[^)]*" ")"
cimport = ~"\s*%[^\r\n]*"
comment = ~"\s*#[^\r\n]*"
catchall = ~".*" / "\n"
""")
fn = '/tmp/SR05ID01FS01/./dbd/IocStat.dbd'
# fn = '/tmp/scr.dbd'
with open(fn) as fin:
tst_str = fin.read()
p = grammar.parse(tst_str)
21:48 $ diff -u epics/recordwhat/recordwhat/record_info/sscan.txt /tmp/sscan.txt --color
--- epics/recordwhat/recordwhat/record_info/sscan.txt 2017-03-21 19:35:56.921744361 -0400
+++ /tmp/sscan.txt 2017-03-21 21:47:09.776097790 -0400
@@ -4,27 +4,28 @@
A1PV DBF_STRING ASL0 GUI_CALC "Array-read trigger 1 PV Name" SPC_MOD 1 40
AAWAIT DBF_MENU GUI_INPUTS "AutoWait for data-storage client" sscanNOYES
ACKS DBF_MENU "Alarm Ack Severity" SPC_NOMOD 2 menuAlarmSevr
-ACKT DBF_MENU "YES" GUI_ALARMS "Alarm Ack Transient" SPC_NOMOD 2 menuYesNo
+ACKT DBF_MENU "YES" "70 - Alarm" "Alarm Ack Transient" SPC_NOMOD 2 menuYesNo
ACQM DBF_MENU ASL0 "NORMAL" GUI_COMMON "Acquisition mode" SPC_MOD 1 sscanACQM
ACQT DBF_MENU ASL0 "SCALAR" GUI_COMMON "Acquisition type" SPC_MOD 1 sscanACQT
ALRT DBF_UCHAR "Operator Alert" SPC_NOMOD
ASCD DBF_FLOAT ASL0 1.0 GUI_INPUTS "After Scan Cmnd" SPC_MOD 1
-ASG DBF_STRING GUI_COMMON "Access Security Group" SPC_AS 29
+ASG DBF_STRING "10 - Common" "Access Security Group" SPC_AS 29
ASNV DBF_MENU "After Scan PV Status" SPC_NOMOD 1 sscanP1NV
-ASP DBF_NOACCESS "Access Security Pvt" SPC_NOMOD 4 "struct asgMember *asp"
+ASP DBF_NOACCESS "Access Security Pvt" SPC_NOMOD 4 "struct asgMember *asp"
ASPV DBF_STRING ASL0 GUI_CALC "After Scan PV Name" SPC_MOD 1 40
ASWAIT DBF_MENU ASL0 "Wait" GUI_INPUTS "Wait for completion?" 1 sscanLINKWAIT
ATIME DBF_FLOAT ASL0 GUI_INPUTS "Array post time period" SPC_MOD 1
AWAIT DBF_SHORT "Waiting for data-storage client" SPC_MOD
AWCT DBF_SHORT "Auto WCNT" SPC_MOD
BCPT DBF_LONG "Bufferred Current Point" SPC_NOMOD 1
-BKPT DBF_NOACCESS "Break Point" SPC_NOMOD 1 "char bkpt"
+BKLNK DBF_NOACCESS "Backwards link tracking" SPC_NOMOD 4 "ELLLIST bklnk"
+BKPT DBF_NOACCESS "Break Point" SPC_NOMOD 1 "char bkpt"
BSCD DBF_FLOAT ASL0 1.0 GUI_INPUTS "Before Scan Cmnd" SPC_MOD 1
BSNV DBF_MENU "BeforeScan PV Status" SPC_NOMOD 1 sscanP1NV
BSPV DBF_STRING ASL0 GUI_CALC "Before Scan PV Name" SPC_MOD 1 40
BSWAIT DBF_MENU ASL0 "Wait" GUI_INPUTS "Wait for completion?" 1 sscanLINKWAIT
BUSY DBF_UCHAR "Scan in progress" SPC_NOMOD
-CMND DBF_MENU ASL0 "Command Field" SPC_MOD 1 sscanCMND
+CMND DBF_ENUM ASL0 "Command Field" SPC_MOD 1
COPYTO DBF_LONG GUI_COMMON "Copy Last Pt Thru" 1
CPT DBF_LONG "Current Point" SPC_NOMOD 1
D01CA DBF_NOACCESS ASL0 "Current Data Array" SPC_DBADDR 4 "float * d01ca"
@@ -799,28 +800,28 @@
D70PV DBF_STRING ASL0 GUI_CALC "Detector PV Name" SPC_MOD 1 40
DATA DBF_SHORT "Scan data ready" SPC_NOMOD
DDLY DBF_FLOAT ASL0 GUI_INPUTS "Detector-settling delay" SPC_MOD 1
-DESC DBF_STRING GUI_COMMON "Descriptor" 41
+DESC DBF_STRING "10 - Common" "Descriptor" 41
DISA DBF_SHORT "Disable"
DISP DBF_UCHAR "Disable putField"
-DISS DBF_MENU GUI_SCAN "Disable Alarm Sevrty" 1 menuAlarmSevr
-DISV DBF_SHORT "1" GUI_SCAN "Disable Value"
+DISS DBF_MENU "70 - Alarm" "Disable Alarm Sevrty" 1 menuAlarmSevr
+DISV DBF_SHORT "1" "20 - Scan" "Disable Value"
DPT DBF_LONG "Desired Point" 119 1
-DPVT DBF_NOACCESS "Device Private" SPC_NOMOD 4 "void *dpvt"
-DSET DBF_NOACCESS "DSET address" SPC_NOMOD 4 "struct dset *dset"
+DPVT DBF_NOACCESS "Device Private" SPC_NOMOD 4 "void *dpvt"
+DSET DBF_NOACCESS "DSET address" SPC_NOMOD 4 "struct dset *dset"
DSTATE DBF_MENU ASL0 GUI_COMMON "Data state" SPC_NOMOD 1 sscanDSTATE
-DTYP DBF_DEVICE GUI_LINKS "Device Type" 1
-EVNT DBF_SHORT GUI_SCAN "Event Number" SPC_SCAN 1
+DTYP DBF_DEVICE "10 - Common" "Device Type" 1
+EVNT DBF_STRING "20 - Scan" "Event Name" SPC_SCAN 1 40
EXSC DBF_SHORT ASL0 "Execute Scan" SPC_MOD TRUE 1
FAZE DBF_MENU ASL0 "Scan phase" SPC_NOMOD 1 sscanFAZE
FFO DBF_MENU ASL0 GUI_OUTPUT "Freeze Flag Override" 117 1 sscanFFO
-FLNK DBF_FWDLINK GUI_LINKS "Forward Process Link" 1
+FLNK DBF_FWDLINK "20 - Scan" "Forward Process Link" 1
FPTS DBF_MENU ASL0 "FREEZE" GUI_OUTPUT "Freeze Num of Points" 118 1 sscanFPTS
KILL DBF_UCHAR "Abort right now" SPC_NOMOD
LCNT DBF_UCHAR "Lock Count" SPC_NOMOD 2
LPAU DBF_MENU ASL0 "GO" "Last value of Go/Pause" SPC_NOMOD sscanPAUS
-LSET DBF_NOACCESS "Lock Set" SPC_NOMOD 4 "struct lockRecord *lset"
-MLIS DBF_NOACCESS "Monitor List" SPC_NOMOD 4 "ELLLIST mlis"
-MLOK DBF_NOACCESS "Monitor lock" SPC_NOMOD 4 "epicsMutexId mlok"
+LSET DBF_NOACCESS "Lock Set" SPC_NOMOD 4 "struct lockRecord *lset"
+MLIS DBF_NOACCESS "Monitor List" SPC_NOMOD 4 "ELLLIST mlis"
+MLOK DBF_NOACCESS "Monitor lock" SPC_NOMOD 4 "epicsMutexId mlok"
MPTS DBF_LONG "100" GUI_LINKS "Max # of Points" SPC_NOMOD 1
NAME DBF_STRING "Record Name" SPC_NOMOD 61
NPTS DBF_LONG ASL0 "100" GUI_LINKS "Number of Points" 116 1
@@ -931,11 +932,11 @@
PAUS DBF_MENU ASL0 "GO" "Go/Pause control" SPC_MOD 1 sscanPAUS
PCPT DBF_LONG "Point ofLast Posting" SPC_NOMOD 1
PDLY DBF_FLOAT ASL0 GUI_INPUTS "Positioner-settling delay" SPC_MOD 1
-PHAS DBF_SHORT GUI_SCAN "Scan Phase" SPC_SCAN 1
-PINI DBF_MENU GUI_SCAN "Process at iocInit" 1 menuPini
-PPN DBF_NOACCESS "addr of PUTNOTIFY" SPC_NOMOD 4 "struct putNotify *ppn"
-PPNR DBF_NOACCESS "pputNotifyRecord" SPC_NOMOD 4 "struct putNotifyRecord *ppnr"
-PRIO DBF_MENU GUI_SCAN "Scheduling Priority" SPC_SCAN 1 menuPriority
+PHAS DBF_SHORT "20 - Scan" "Scan Phase" SPC_SCAN 1
+PINI DBF_MENU "20 - Scan" "Process at iocInit" 1 menuPini
+PPN DBF_NOACCESS "pprocessNotify" SPC_NOMOD 4 "struct processNotify *ppn"
+PPNR DBF_NOACCESS "pprocessNotifyRecord" SPC_NOMOD 4 "struct processNotifyRecord *ppnr"
+PRIO DBF_MENU "20 - Scan" "Scheduling Priority" SPC_SCAN 1 menuPriority
PROC DBF_UCHAR "Force Processing" TRUE 3
PUTF DBF_UCHAR "dbPutField process" SPC_NOMOD 1
PXSC DBF_UCHAR "Previous XScan" SPC_NOMOD
@@ -964,10 +965,10 @@
REFD DBF_SHORT "1" "Reference detector" SPC_MOD
RPRO DBF_UCHAR "Reprocess " SPC_NOMOD 1
RPVT DBF_NOACCESS "Ptr to Pvt Struct" SPC_NOMOD 4 4 "void * rpvt"
-RSET DBF_NOACCESS "Address of RSET" SPC_NOMOD 4 "struct rset *rset"
-SCAN DBF_MENU GUI_SCAN "Scan Mechanism" SPC_SCAN 1 menuScan
-SDIS DBF_INLINK GUI_SCAN "Scanning Disable" 1
-SEVR DBF_MENU "INVALID" "Alarm Severity" SPC_NOMOD menuAlarmSevr
+RSET DBF_NOACCESS "Address of RSET" SPC_NOMOD 4 "struct rset *rset"
+SCAN DBF_MENU "20 - Scan" "Scan Mechanism" SPC_SCAN 1 menuScan
+SDIS DBF_INLINK "20 - Scan" "Scanning Disable" 1
+SEVR DBF_MENU "Alarm Severity" SPC_NOMOD menuAlarmSevr
SMSG DBF_STRING "Record State Msg" 1 40
SPVT DBF_NOACCESS "Scan Private" SPC_NOMOD 4 "struct scan_element *spvt"
STAT DBF_MENU "UDF" "Alarm Status" SPC_NOMOD menuAlarmStat
@@ -983,13 +984,14 @@
T4CD DBF_FLOAT ASL0 1.0 GUI_INPUTS "T4 Cmnd" SPC_MOD 1
T4NV DBF_MENU "T4 PV Status" SPC_NOMOD 1 sscanP1NV
T4PV DBF_STRING ASL0 GUI_CALC "Trigger 4 PV Name" SPC_MOD 1 40
-TIME DBF_NOACCESS "Time" SPC_NOMOD 2 "epicsTimeStamp time"
-TLAP DBF_NOACCESS "Time of Last Array Posting" SPC_NOMOD 2 "epicsTimeStamp tlap"
-TOLP DBF_NOACCESS "Time of Last Posting" SPC_NOMOD 2 "epicsTimeStamp tolp"
+TIME DBF_NOACCESS "Time" SPC_NOMOD 2 "epicsTimeStamp time"
+TLAP DBF_NOACCESS "Time of Last Array Posting" SPC_NOMOD 2 "epicsTimeStamp tlap"
+TOLP DBF_NOACCESS "Time of Last Posting" SPC_NOMOD 2 "epicsTimeStamp tolp"
TPRO DBF_UCHAR "Trace Processing"
-TSE DBF_SHORT GUI_SCAN "Time Stamp Event" 1
-TSEL DBF_INLINK GUI_SCAN "Time Stamp Link" 1
-UDF DBF_UCHAR "1" GUI_COMMON "Undefined" TRUE 1
+TSE DBF_SHORT "20 - Scan" "Time Stamp Event" 1
+TSEL DBF_INLINK "20 - Scan" "Time Stamp Link" 1
+UDF DBF_UCHAR "1" "10 - Common" "Undefined" TRUE 1
+UDFS DBF_MENU "INVALID" "70 - Alarm" "Undefined Alarm Sevrty" 1 menuAlarmSevr
VAL DBF_DOUBLE "Value Field"
VERS DBF_DOUBLE "3" "Code Version" SPC_NOMOD
WAIT DBF_SHORT "Wait for client(s)" SPC_MOD
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment