Last active
March 22, 2017 01:53
-
-
Save tacaswell/bd98b178e477093876c1ccb8cccadf73 to your computer and use it in GitHub Desktop.
playing with dbd + parsimonious
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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