> For the complete documentation index, see [llms.txt](https://cxz.gitbook.io/spring-cloud-date-flow/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://cxz.gitbook.io/spring-cloud-date-flow/shell/untitled-5/untitled-2.md).

# DSL Parsing规则

在 Parser 级别（即，在 stream 或 task 定义的主体内），规则如下：

* 选项的值通常解析到第一个空格字符。
* 不过，它们可以由字符串组成，用单引号或双引号包围。
* 请使用连续的两个相同引号使用。

因此，`--expression`在以下示例中，filter application 的配置效果是完全相同的：

```
filter --expression=payload>5
filter --expression="payload>5"
filter --expression='payload>5'
filter --expression='payload > 5'
```

可以说，最后一个更容易阅读。因为在实际的表达式周围使用了引号。实际表达式是`payload > 5`（没有引号）。

现在，假设我们想对字符串的值进行测试。如果我们想要比较 `payload`和 SpEL表达式，我们可以使用以下方法:

```bash
filter --expression=payload=='something'       
filter --expression='payload == ''something''' 
filter --expression='payload == "something"'  
```

| key | content                                                 |
| --- | ------------------------------------------------------- |
| 第一行 | 这是有效的，不过因为没有空格，可读性并不好                                   |
| 第二行 | <p>只使用单引号来包括整个参数。因此，参数中的单引号需要</p><p>加倍</p>              |
| 第三行 | <p>SpEL可以识别带有单引号或双引号的字符串文本，因此最后</p><p>一种方法可以说是最易读的。</p> |

请注意，前面的示例是不考虑在shell之中使用(例如，当直接调用REST API时)。因为在shell中输入时，很可能整个stream 的定义本身都在双引号中，需要转义。整个例子变成如下:

```bash
dataflow:>stream create something --definition "http | filter --expression=payload='something' | log"

dataflow:>stream create something --definition "http | filter --expression='payload == ''something''' | log"

dataflow:>stream create something --definition "http | filter --expression='payload == \"something\"' | log"
```
