Lace - Syntax of rulesets ========================= Lace rule files are parsed line-by-line. There is no provision at this time for rules to be split across multiple lines. If you require such, please [submit a patch][developing]. Lace splits each line into a series of tokens. Tokens are always strings and they can be optionally quoted to allow for spaces in them. Certain tokens then have constraints placed on them so that further parsing will be unambiguous. The lexing into tokens is done similarly to how shell does it. This means that each whitespace-separated "word" is then subjected to quoting rules. Lace does not have many special characters. The backslash introduces escaped values in all cases and lace does not differentiate between single and double quotes. Backslash escaped characters sometimes have special meaning if inside quotes. For example, the following strings lex in the following ways: 1. Two tokens, one of each word. hello world 2. The same as 1. hello world 3. One token with both words separated by one space "hello world" 4. Same as 3. 'hello world' 5. Same as 3 and 4. hello\ world 6. One token, consisting of the letters: `uptown` up\town 6. One token, consisting of the letters: `up TAB own` "up\town" 7. One token, a double-quote character \" 8. The same as 7 '"' 9. The same as 7 and 8. "\"" As you can see, the lexing rules are not trivial, but should not come as a surprise to anyone used to standard command-line lexing techniques. Comments in Lace are prefixed by a hash '#', a double-slash '//' or a double-dash '--'. The first word of the line must start with one of these markers (but may contain other text also), for example: # This is a comment // As is this -- And this #But also this //And this --And also this Blank lines are permitted and ignored (except for counting), any prefixed or postfixed whitespace is deleted before lexing begins. As such: # This is a comment # So is this This allows for sub-rulesets to be indented as the author pleases, without altering the meaning of the rules. The first word of a rule defines its type. You can think of it as the command being run. Lace, by default, provides a small number of rule types: 1. [Definitions](../syntax-define) * This define access control stanzas. The definitions produced are used in further rules to control access. Lace does not allow any name to be reused. 2. [Includes](../syntax-include) * Lace can include further rules at any point during a ruleset. If the rules are to be optionally run then Lace cannot perform static analysis of the definitions within the ruleset. Instead it will rely on runtime catching of multiple-definitions etc. 3. [Access control statements](../syntax-allow-deny) * These are the core functions of Lace. Namely the allow and deny statements. These use control definitions from earlier in a ruleset to determine whether to allow or deny access. The first allow or deny statement which passes will stop execution of the ruleset. 4. [Default statement](../syntax-default) * The 'default' statement can only be run once and provides Lace with information on what to do in the case of no allow or deny rule passing. In those files, if you encounter the words WILL, MAY, SHOULD, MUST, or their negatives, specifically in all-caps, then the meaning of the words is taken in the spirit of the RFC usage of them.