summaryrefslogtreecommitdiff
path: root/third_party/libscpi/src/scpi.g
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/libscpi/src/scpi.g')
-rw-r--r--third_party/libscpi/src/scpi.g141
1 files changed, 141 insertions, 0 deletions
diff --git a/third_party/libscpi/src/scpi.g b/third_party/libscpi/src/scpi.g
new file mode 100644
index 00000000..a3993ffd
--- /dev/null
+++ b/third_party/libscpi/src/scpi.g
@@ -0,0 +1,141 @@
+grammar scpi;
+
+terminatedProgramMessage
+ : programMessage NL? EOF
+ ;
+
+programMessage
+ : programMessageUnit (SEMICOLON programMessageUnit)*
+ ;
+
+
+programMessageUnit
+ : WS* programHeader (WS programData (COMMA programData)*)?
+ ;
+
+programHeader
+ : compoundProgramHeader
+ | commonProgramHeader
+ ;
+
+compoundProgramHeader
+ : COLON? PROGRAM_MNEMONIC (COLON PROGRAM_MNEMONIC)* QUESTION?
+ ;
+
+commonProgramHeader
+ : STAR PROGRAM_MNEMONIC QUESTION?
+ ;
+
+programDataSeparator
+ : WS*
+ ;
+
+programData
+ : WS* programDataType WS*
+ ;
+
+programDataType
+ : nondecimalNumericProgramData
+ | characterProgramData
+ | decimalNumericProgramData
+ | stringProgramData
+ | arbitraryBlockProgramData
+ | expressionProgramData
+// | suffixProgramData
+ ;
+
+nondecimalNumericProgramData
+ : HEXNUM
+ | OCTNUM
+ | BINNUM
+ ;
+
+characterProgramData
+ : PROGRAM_MNEMONIC
+ ;
+
+decimalNumericProgramData
+ : DECIMAL_NUMERIC_PROGRAM_DATA_WITH_SUFFIX
+ ;
+
+//suffixProgramData
+// : PROGRAM_MNEMONIC//SUFFIX_PROGRAM_DATA
+// ;
+
+stringProgramData
+ : SINGLE_QUOTE_PROGRAM_DATA
+ | DOUBLE_QUOTE_PROGRAM_DATA
+ ;
+
+expressionProgramData
+ : PROGRAM_EXPRESSION
+ ;
+
+// support only nonzero prefix
+arbitraryBlockProgramData
+ : SHARP NONZERO_DIGIT NUMBER .*
+ ;
+
+PROGRAM_MNEMONIC : ALPHA (ALPHA | DIGIT | UNDERSCORE)*;
+HEXNUM : SHARP H HEXDIGIT*;
+BINNUM : SHARP Q OCTDIGIT*;
+OCTNUM : SHARP B BINDIGIT*;
+UNDERSCORE : '_';
+SEMICOLON : ';';
+QUESTION : '?';
+COLON : ':';
+COMMA : ',';
+STAR : '*';
+NL : '\r'? '\n' ;
+WS : (SPACE | TAB);
+
+DECIMAL_NUMERIC_PROGRAM_DATA_WITH_SUFFIX : DECIMAL_NUMERIC_PROGRAM_DATA WS* (SUFFIX_PROGRAM_DATA)?;
+fragment DECIMAL_NUMERIC_PROGRAM_DATA : MANTISA WS* (EXPONENT)?;
+SINGLE_QUOTE_PROGRAM_DATA : SINGLE_QUOTE ( (NON_SINGLE_QUOTE) | (SINGLE_QUOTE SINGLE_QUOTE))* SINGLE_QUOTE;
+DOUBLE_QUOTE_PROGRAM_DATA : DOUBLE_QUOTE ( (NON_DOUBLE_QUOTE) | (DOUBLE_QUOTE DOUBLE_QUOTE))* DOUBLE_QUOTE;
+//SUFFIX_PROGRAM_DATA : SLASH? (ALPHA+ (MINUS? DIGIT)?) ((SLASH | DOT) (ALPHA+ (MINUS? DIGIT)?))*;
+fragment SUFFIX_PROGRAM_DATA : SLASH? ALPHA+ ((SLASH | DOT) ALPHA+)*;
+//fragment SUFFIX_PROGRAM_DATA : ALPHA+;
+
+fragment PROGRAM_EXPRESSION_CHARACTER : (SPACE | '!' | '$'..'&' | '*'..':' | '<' ..'~');
+PROGRAM_EXPRESSION : LBRACKET PROGRAM_EXPRESSION_CHARACTER RBRACKET;
+
+fragment PLUSMN : (PLUS | MINUS);
+fragment MANTISA : PLUSMN? ( (NUMBER) | (NUMBER DOT NUMBER?) | (DOT NUMBER));
+
+//fragment EXPONENT : WS* E WS* PLUSMN? NUMBER;
+fragment EXPONENT : E WS* PLUSMN? NUMBER;
+
+fragment NUMBER : DIGIT+;
+
+fragment LBRACKET : '(';
+fragment RBRACKET : ')';
+
+fragment ALPHA : ('a'..'z'|'A'..'Z');
+fragment DIGIT : ('0'..'9');
+fragment NONZERO_DIGIT : ('1'..'9');
+
+fragment HEXDIGIT : (DIGIT | 'a'..'f' | 'A'..'F');
+fragment OCTDIGIT : ('0'..'7');
+fragment BINDIGIT : ('0' | '1');
+
+fragment SHARP : '#';
+
+fragment E : ('E'|'e');
+fragment H : ('H'|'h');
+fragment Q : ('Q'|'q');
+fragment B : ('B'|'b');
+
+fragment SPACE : ' ';
+fragment TAB : '\t';
+
+fragment PLUS : '+';
+fragment MINUS : '-';
+fragment DOT : '.';
+fragment SLASH : '/';
+fragment SINGLE_QUOTE : '\'';
+fragment DOUBLE_QUOTE : '"';
+fragment NON_SINGLE_QUOTE : ~SINGLE_QUOTE;
+fragment NON_DOUBLE_QUOTE : ~DOUBLE_QUOTE;
+
+