OSDN Git Service

post WM_NULL to attached threads on yamy exit to unmap mayu{32,64}.dll
[yamy/yamy.git] / doc / syntax.txt
1 ###############################################################################
2 #
3 # mayu file syntax
4 #
5 ###############################################################################
6
7
8 #
9 # NOTE:
10 #       * case insensitive
11 #       * <...> is a non-terminal symbol
12 #       * "..." is a terminal symbol
13 #       * /.../ is a terminal symbol (regular expression)
14 #       * namespace is
15 #               1. KEY_NAME
16 #               2. KEYSEQ_NAME
17 #               3. KEYMAP_NAME
18 #               4. ALIAS_NAME
19 #               5. FUNCTION_NAME
20 #               6. SYMBOL
21 #       * the default of <...MODIFIED_KEY_NAME>'s modifier-settings is:
22 #               1. "IL-", "NL-", "CL-", "SL-", "KL-",
23 #                  "MAX-", "MIN-", "MMAX-", "MMIN-",
24 #                  "T-", "TS-",
25 #                  /L[0-9]/, "U-" and "D-"
26 #                  are specified with "*"
27 #               2. all other modifiers are specified with "~"
28 #               3. they can be changed by
29 #                  "key" <ASSIGN_MODIFIER> "=" <ASSIGN_MODIFIER>
30 #
31
32 #
33 # FILE STRUCTURE
34 #
35
36         <MAYU_FILE> : ( <LINE> <COMMENT>? <CRLF> )*
37         <LINE> :
38                   <COND_SYMBOL>
39                 | <INCLUDE>
40                 | <KEYBOARD_DEFINITION>
41                 | <KEYMAP_DEFINITION>
42                 | <KEY_ASSIGN>
43                 | <EVENT_ASSIGN>
44                 | <KEYSEQ_DEFINITION>
45                 | <MODIFIER_ASSIGNMENT>
46         # each <LINE> can be divided into some lines by \
47         <COMMENT> : /#.*/
48         <CRLF> : "\r\n"
49
50 #
51 # BASIC TYPE
52 #
53
54         <number> :
55                   /[-+]?[0-9]+/         # decimal
56                 | /[-+]?0[0-9]+/        # octal
57                 | /[-+]?0x[0-9a-f]+/    # hexadecimal
58
59         <bool> :
60                   "false"               # false
61                 | <string>              # true
62
63         <string> :
64                   /([/?_a-z]|\MBCS|\EC)([-+/?_a-z0-9]|\MBCS|\EC)*/
65                 | /"([^"]|\MBCS|\EC)*"/
66                 | /'([^']|\MBCS|\EC)*'/
67         # \MBCS : Multi Byte Character (such as Shift_JIS)
68         # \EC : Escaped Characters
69         #       | "\a"  # bell
70         #       | "\e"  # escape
71         #       | "\f"  # form feed
72         #       | "\n"  # newline
73         #       | "\r"  # carriage return
74         #       | "\t"  # horizontal tab
75         #       | "\\"  # \
76         #       | /\\[0-7]+/            # character as octal
77         #       | /\\x[0-9a-f]+/        # character as hexadecimal
78
79         <regexp> :
80                   /\REGEXP/
81                 | \m@\REGEXP@           # @ can be any character
82         # \REGEXP :
83         #       | "|"           # Alternation
84         #       | "*"           # Match 0 or more times
85         #       | "+"           # Match 1 or more times
86         #       | "?"           # Match 1 or 0 times
87         #       | "."           # Match any character
88         #       | "^"           # Match the beginning of the string
89         #       | "$"           # Match the end of the string
90         #       | "\b"          # Match a word boundary
91         #       | "\B"          # Match a non word boundary
92         #       | "\w"          # Match a word character (alphanumeric, "_")
93         #       | "\W"          # Match a non word character
94         #       | "\s"          # Match a whitespace character
95         #       | "\S"          # Match a non-whitespace character
96         #       | "\d"          # Match a digit character
97         #       | "\D"          # Match a non-digit character
98         #       | "(" ")"       # Grouping
99         #       | "[" "]"       # Character class
100
101 #
102 # COND SYMBOL
103 #
104
105         <COND_SYMBOL> : <DEFINE> | <IF> | <ELSE> | <ELSEIF> | <ENDIF>
106         <DEFINE> : "define" <SYMBOL>
107         <IF> : ( "if" | "and" ) <IF_BODY>
108         <IF_BODY> : "(" "!"? <SYMBOL> ")" ( <LINE> )?
109         <ELSE> : "else" ( <LINE> )?
110         <ELSEIF> : ( "elseif" | "elsif" | "elif" ) <IF_BODY>
111         <ENDIF> : "endif"
112         <SYMBOL> : <string>
113
114 #
115 # INCLUDE
116 #
117
118         <INCLUDE> : "include" <MAYU_FILE_NAME>
119         <MAYU_FILE_NAME> : <string>
120
121 #
122 # KEYBOARD DEFINITION
123 #
124
125         <KEYBOARD_DEFINITION>
126                 : "def" <DEFINE_KEY>
127                 | "def" <DEFINE_MODIFIER>
128                 | "def" <DEFINE_LOCK>
129                 | "def" <DEFINE_SYNC_KEY>
130                 | "def" <DEFINE_ALIAS>
131                 | "def" <DEFINE_SUBSTITUTE>
132                 | "def" <DEFINE_OPTION>
133
134         <DEFINE_KEY> : "key" <KEY_NAMES> "=" <SCAN_CODES>
135
136         <KEY_NAMES>
137                 : "(" <KEY_NAME>+ ")"
138                 | <KEY_NAME>+
139         <KEY_NAME> : <string>
140         <SCAN_CODES> : <SCAN_CODE> <SCAN_CODE>? <SCAN_CODE>? <SCAN_CODE>?
141         <SCAN_CODE> : <SCAN_CODE_EXTENTION>* <number>
142         <SCAN_CODE_EXTENTION> : "E0-" | "E1-"
143
144         <DEFINE_MODIFIER> : "mod" <BASIC_MODIFIER_NAME> "=" <KEY_NAME>*
145         <BASIC_MODIFIER_NAME>
146                 : "shift"
147                 | "alt" | "meta" | "menu"
148                 | "control" | "ctrl"
149                 | "windows" | "win"
150
151         <BASIC_LOCK_NAME> : "num" | "caps" | "scroll"
152         <BASIC_MODIFIER> : "S-" | "A-" | "M-" | "C-" | "W-"
153                 | "*"           # we don't care the next modifier
154                 | "~"           # the next modifier must be released
155
156         <DEFINE_SYNC_KEY> : "sync" "=" <SCAN_CODES>
157
158         <DEFINE_ALIAS> : "alias" <ALIAS_NAME> "=" <KEY_NAME>
159         <ALIAS_NAME> : <string>
160         <ALIASED_KEY_NAME>
161                 : <ALIAS_NAME>
162                 | <KEY_NAME>
163
164         <DEFINE_SUBSTITUTE>
165                 : "subst" <ASSIGN_MODIFIED_KEY_NAME>+ "=" <SUBST_KEY_SEQUENCE>
166
167         <DEFINE_OPTION>
168                 : "option" "KL-" "=" <bool>
169                 | "option" "delay-of" "!!!" "=" <number>
170
171 #
172 # KEYMAP DEFINITION
173 #
174
175         <KEYMAP_DEFINITION>
176                 : "keymap" <KEYMAP_NAME> <KEYMAP_PARENT>? <KEYSEQ_DEFAULT>?
177                 | "keymap2" <KEYMAP_NAME> <KEYMAP_PARENT>? <KEYSEQ_DEFAULT>?
178                 | "window" <KEYMAP_NAME> <WINDOW>? <KEYMAP_PARENT>? \
179                                                         <KEYSEQ_DEFAULT>?
180         <KEYMAP_NAME> : <string>
181         <KEYMAP_PARENT> : ":" <KEYMAP_NAME>
182         <KEYSEQ_DEFAULT> : "=" <KEY_SEQUENCE>
183         <WINDOW>
184                 : <WINDOW_CLASS_NAME>
185                 | "(" <WINDOW_CLASS_NAME> "&&" <WINDOW_TITLE_NAME> ")"
186                 | "(" <WINDOW_CLASS_NAME> "||" <WINDOW_TITLE_NAME> ")"
187         <WINDOW_CLASS_NAME> : <regexp>
188         <WINDOW_TITLE_NAME> : <regexp>
189
190 #
191 # KEY TO KEY SEQUENCE ASSIGNMENT
192 #
193
194         <KEY_ASSIGN>
195                 : "key" <ASSIGN_MODIFIED_KEY_NAME>+ "=" <KEY_SEQUENCE>
196                 | "key" <ASSIGN_MODIFIER>* "=" <KEYSEQ_MODIFIER>*
197         <ASSIGN_MODIFIED_KEY_NAME> : <ASSIGN_MODIFIER>* <ALIASED_KEY_NAME>
198         <ASSIGN_MODIFIER>
199                 : <KEYSEQ_MODIFIER>
200                 | "R-"          # auto repeated key
201                 | "IL-"         # if IME on
202                 | "IC-" | "I-"  # if IME on and compositioning
203                 | "NL-"         # if Num Lock on
204                 | "CL-"         # if Caps Lock on
205                 | "SL-"         # if Scroll Lock on
206                 | "KL-"         # if Kana Lock on
207                 | "MAX-"        # if Window maximized
208                 | "MIN-"        # if Window minimized
209                 | "MMAX-"       # if MDI child Window maximized
210                 | "MMIN-"       # if MDI child Window minimized
211                 | "T-"          # if finger on touchpad
212                 | "TS-" # same as "T-" except for sticky up to release all keys
213                 | /M[0-9]/      # user defined modifier
214                 | /L[0-9]/      # user defined lock
215
216 #
217 # EVENT TO KEY SEQUENCE ASSIGNMENT
218 #
219
220         <EVENT_ASSIGN>
221                 : "event" <EVENT_NAME> "=" <KEY_SEQUENCE>
222         <EVENT_NAME>
223                 : "prefixed"
224                 | "before-key-down"
225                 | "after-key-up"
226
227 #
228 # MODIFIER ASSIGNMENT
229 #
230
231         <MODIFIER_ASSIGNMENT>
232                 : "mod" ( <ASSIGN_MODE> <MODIFIER_NAME> )* \
233                         <MODIFIER_NAME> <ASSIGN_OP> \
234                                         ( <ASSIGN_MODE>? <ALIASED_KEY_NAME> )+
235         <MODIFIER_NAME> : <BASIC_MODIFIER_NAME> | /mod[0-9]/
236
237         <ASSIGN_OP> : "=" | "-=" | "+="
238         <ASSIGN_MODE>
239                 : "!"           # true modifier (doesn't generate scan code)
240                 | "!!"          # one shot modifier
241                 | "!!!"         # one shot repeatable modifier
242
243 #
244 # KEY SEQUENCE DEFINITION
245 #
246
247         <KEYSEQ_DEFINITION>
248                 : "keyseq" "$" <KEYSEQ_NAME> "=" <KEY_SEQUENCE>
249                 | "keyseq" "$" <SUBST_KEYSEQ_NAME> "=" <SUBST_KEY_SEQUENCE>
250
251         <SUBST_KEY_SEQUENCE> : <SUBST_ACTION>+
252         <SUBST_ACTION>
253                 : <ASSIGN_MODIFIED_KEY_NAME>
254                 | "$" ( <SUBST_KEYSEQ_NAME> | <KEYSEQ_NAME> )
255                 | <ASSIGN_MODIFIER>* "&" <FUNCTION_NAME> <ARGUMENTS>?
256                 | "(" <SUBST_KEY_SEQUENCE> ")"
257
258         <KEY_SEQUENCE> : <ACTION>+
259         <ACTION>
260                 : <KEYSEQ_MODIFIED_KEY_NAME>
261                 | "$" <KEYSEQ_NAME>
262                 | <KEYSEQ_MODIFIER>* "&" <FUNCTION_NAME> <ARGUMENTS>?
263                 | "(" <KEY_SEQUENCE> ")"
264         <ARGUMENTS> : "(" ( <ARGUMENT> ( "," <ARGUMENT> )* )? ")"
265         <KEYSEQ_MODIFIED_KEY_NAME> : <KEYSEQ_MODIFIER>* <ALIASED_KEY_NAME>
266         <KEYSEQ_MODIFIED_KEY_NAME> : <KEYSEQ_MODIFIER>* <ALIASED_KEY_NAME>
267         <KEYSEQ_MODIFIER>
268                 : <BASIC_MODIFIER>
269                 | "U-"          # up
270                 | "D-"          # down
271         <KEYSEQ_NAME> : <string>
272         <SUBST_KEYSEQ_NAME> : <string>
273         <FUNCTION_NAME> : <string>
274         <ARGUMENT>
275                 : <KEYMAP_NAME>
276                 | "$" <KEYSEQ_NAME> | "(" <KEY_SEQUENCE> ")"
277                 | <ARGUMENT_LOCK>
278                 | <string>
279                 | <number>
280                 | <ARGUMENT_VK>
281                 | <ARGUMENT_SHOW_WINDOW>
282                 | <ARGUMENT_WINDOW>
283                 | <ARGUMENT_TARGET_WINDOW_TYPE>
284                 | <ASSIGN_MODIFIER>*
285                 | <bool>
286
287         <ARGUMENT_LOCK> : /lock\d/      # &Toggle()
288
289         <ARGUMENT_VK>                   # &VK()
290                 : <VK_MODIFIER>* <VK_NAME>
291         <VK_MODIFIER> : "E-" | "U-" | "D-"
292         <VK_NAME> : <string>
293
294         <ARGUMENT_SHOW_WINDOW>          # &ShellExecute()
295                 : "HIDE" | "MAXIMIZE" | "MINIMIZE" | "RESTORE" | "SHOW"
296                 | "SHOWDEFAULT" | "SHOWMAXIMIZED" | "SHOWMINIMIZED"
297                 | "SHOWMINNOACTIVE" | "SHOWNA" | "SHOWNOACTIVATE"
298                 | "SHOWNORMAL"
299
300         <ARGUMENT_WINDOW>               # &PostMessage()
301                 : <number>
302                 | "toOverlappedWindow"
303                 | "toMainWindow"
304                 | "toItself"
305                 | "toParentWindow"
306
307         <ARGUMENT_TARGET_WINDOW_TYPE> : "overlapped" | "mdi"
308
309 # Local Variables:
310 # mode: text
311 # eval: (progn  (font-lock-mode) (font-lock-add-keywords  nil '(("#.*$" . font-lock-comment-face) ("\\\\$" (0 font-lock-warning-face)) ("/\\(\\[[^]\n]*\\]\\|[^/\n]\\)*/" (0 font-lock-string-face)) ("'[^'\n]*'" (0 font-lock-string-face)) ("\"[^\"\n]*\"" (0 font-lock-string-face)) ("<\\([A-Za-z_][A-Za-z_0-9]*\\)>"  (1 font-lock-constant-face)) ("[*?+]" (0 font-lock-keyword-face)) )) (font-lock-fontify-buffer))
312 # End: