Skip to content

Commit cd11cc4

Browse files
authored
feat(editor): add Structured Text (IEC 61131-3) language support (#914)
* feat(editor): add Structured Text language support * test(editor): remove Structured Text grammar tests
1 parent a707d61 commit cd11cc4

3 files changed

Lines changed: 110 additions & 1 deletion

File tree

‎src/renderer/components/editor/grammars/languages.ts‎

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -856,6 +856,12 @@ export const languages: LanguageOption[] = [
856856
grammar: () => import('./textmate/sql.tmLanguage.json'),
857857
scopeName: 'source.sqlserver',
858858
},
859+
{
860+
name: 'Structured Text (IEC 61131-3)',
861+
value: 'st',
862+
grammar: () => import('./textmate/structuredText.tmLanguage.json'),
863+
scopeName: 'source.st',
864+
},
859865
{
860866
name: 'Stylus',
861867
value: 'stylus',
@@ -1016,6 +1022,6 @@ export const oldLanguageMap: Record<any, Language> = {
10161022
'shell': 'sh',
10171023
'sol': 'plain_text',
10181024
'aes': 'plain_text',
1019-
'st': 'plain_text',
1025+
'st': 'st',
10201026
'vb': 'vbscript',
10211027
}
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
{
2+
"name": "Structured Text (IEC 61131-3)",
3+
"scopeName": "source.st",
4+
"fileTypes": ["st"],
5+
"patterns": [
6+
{ "include": "#comments" },
7+
{ "include": "#strings" },
8+
{ "include": "#literals" },
9+
{
10+
"name": "keyword.control.st",
11+
"match": "(?i)\\b(?:IF|THEN|ELSIF|ELSE|END_IF|CASE|OF|END_CASE|FOR|TO|BY|DO|END_FOR|WHILE|END_WHILE|REPEAT|UNTIL|END_REPEAT|EXIT|CONTINUE|RETURN)\\b"
12+
},
13+
{
14+
"name": "keyword.declaration.st",
15+
"match": "(?i)\\b(?:PROGRAM|END_PROGRAM|FUNCTION|END_FUNCTION|FUNCTION_BLOCK|END_FUNCTION_BLOCK|VAR|VAR_INPUT|VAR_OUTPUT|VAR_IN_OUT|VAR_TEMP|VAR_GLOBAL|VAR_EXTERNAL|VAR_ACCESS|VAR_CONFIG|VAR_STAT|END_VAR|CONSTANT|RETAIN|NON_RETAIN|PERSISTENT|AT|TYPE|END_TYPE|STRUCT|END_STRUCT|ARRAY|POINTER|REFERENCE|REF_TO|CONFIGURATION|END_CONFIGURATION|RESOURCE|END_RESOURCE|TASK|WITH|ON|READ_ONLY|READ_WRITE|R_EDGE|F_EDGE|CLASS|END_CLASS|METHOD|END_METHOD|INTERFACE|END_INTERFACE|PROPERTY|END_PROPERTY|EXTENDS|IMPLEMENTS|PUBLIC|PRIVATE|PROTECTED|INTERNAL|ABSTRACT|FINAL|OVERRIDE|THIS|SUPER)\\b"
16+
},
17+
{
18+
"name": "storage.type.st",
19+
"match": "(?i)\\b(?:BOOL|SINT|INT|DINT|LINT|USINT|UINT|UDINT|ULINT|BYTE|WORD|DWORD|LWORD|REAL|LREAL|TIME|LTIME|DATE|LDATE|TIME_OF_DAY|LTIME_OF_DAY|TOD|LTOD|DATE_AND_TIME|LDATE_AND_TIME|DT|LDT|STRING|WSTRING|CHAR|WCHAR|ANY|ANY_DERIVED|ANY_ELEMENTARY|ANY_MAGNITUDE|ANY_NUM|ANY_REAL|ANY_INT|ANY_BIT|ANY_STRING|ANY_DATE)\\b"
20+
},
21+
{
22+
"name": "keyword.operator.st",
23+
"match": "(?i)\\b(?:AND|OR|XOR|NOT|MOD|AND_THEN|OR_ELSE)\\b|:=|=>|<>|<=|>=|\\*\\*|[-+*/=<>&^]"
24+
},
25+
{
26+
"name": "variable.other.address.st",
27+
"match": "(?i)%[IQM](?:[XBWDL])?(?:[0-9]+(?:\\.[0-9]+)*|\\*)"
28+
},
29+
{
30+
"name": "entity.name.function.st",
31+
"match": "\\b[A-Za-z_][A-Za-z_0-9]*\\b(?=\\s*\\()"
32+
},
33+
{
34+
"name": "punctuation.separator.st",
35+
"match": "\\.\\.|[;:,.]"
36+
}
37+
],
38+
"repository": {
39+
"comments": {
40+
"patterns": [
41+
{
42+
"name": "comment.line.double-slash.st",
43+
"begin": "//",
44+
"end": "$"
45+
},
46+
{ "include": "#blockComment" }
47+
]
48+
},
49+
"blockComment": {
50+
"name": "comment.block.st",
51+
"begin": "\\(\\*",
52+
"end": "\\*\\)",
53+
"patterns": [{ "include": "#blockComment" }]
54+
},
55+
"strings": {
56+
"patterns": [
57+
{
58+
"name": "string.quoted.single.st",
59+
"begin": "(?i)(?:\\b(?:STRING|CHAR)#)?'",
60+
"end": "'",
61+
"patterns": [
62+
{
63+
"name": "constant.character.escape.st",
64+
"match": "(?i)\\$(?:[0-9a-f]{2}|[$'LNPRT])"
65+
}
66+
]
67+
},
68+
{
69+
"name": "string.quoted.double.st",
70+
"begin": "(?i)(?:\\b(?:WSTRING|WCHAR)#)?\"",
71+
"end": "\"",
72+
"patterns": [
73+
{
74+
"name": "constant.character.escape.st",
75+
"match": "(?i)\\$(?:[0-9a-f]{4}|[$\"LNPRT])"
76+
}
77+
]
78+
}
79+
]
80+
},
81+
"literals": {
82+
"patterns": [
83+
{
84+
"name": "constant.language.boolean.st",
85+
"match": "(?i)\\b(?:BOOL#(?:TRUE|FALSE|[01])|TRUE|FALSE)\\b"
86+
},
87+
{
88+
"name": "constant.numeric.time.st",
89+
"match": "(?i)\\b(?:LTIME|TIME|LT|T)#[+-]?(?:[0-9]+(?:\\.[0-9]+)?(?:ms|us|ns|d|h|m|s)_?)+\\b"
90+
},
91+
{
92+
"name": "constant.numeric.date.st",
93+
"match": "(?i)\\b(?:LDATE_AND_TIME|DATE_AND_TIME|LDT|DT)#[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}-[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}(?:\\.[0-9]+)?\\b|\\b(?:LTIME_OF_DAY|TIME_OF_DAY|LTOD|TOD)#[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}(?:\\.[0-9]+)?\\b|\\b(?:LDATE|DATE|LD|D)#[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}\\b"
94+
},
95+
{
96+
"name": "constant.numeric.st",
97+
"match": "(?i)\\b(?:(?:SINT|INT|DINT|LINT|USINT|UINT|UDINT|ULINT|BYTE|WORD|DWORD|LWORD|REAL|LREAL)#[-+]?)?(?:16#[0-9a-f]+(?:_[0-9a-f]+)*|8#[0-7]+(?:_[0-7]+)*|2#[01]+(?:_[01]+)*|[0-9]+(?:_[0-9]+)*(?:\\.(?!\\.)(?:[0-9]+(?:_[0-9]+)*)?)?(?:e[-+]?[0-9]+(?:_[0-9]+)*)?)(?![\\w])"
98+
}
99+
]
100+
}
101+
}
102+
}

‎src/renderer/components/editor/types/index.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ export type Language =
163163
| 'sparql'
164164
| 'sql'
165165
| 'sqlserver'
166+
| 'st'
166167
| 'stylus'
167168
| 'svg'
168169
| 'swift'

0 commit comments

Comments
 (0)