所谓“S-表达式/运算式”(S-expression)或“sexp”(其中“S”代表“符号的”),是指一种以人类可读的文本形式表达半结构化数据的约定。S-表达式可能以其在Lisp家族的编程语言中的使用而为人所知。其他应用则见于由Lisp衍生的语言,如DSSSL(英语:Document Style Semantics and Specification Language),以及如IMAP之类通信协议中作为标记出现和约翰·麦卡锡的CBCL(英语:Common Business Communication Language)。语法细节和所支持的数据类型虽因语言而异,但这些语言间最通用的特性则是使用S-表达式作为括号化的前缀表示法(有时亦作剑桥波兰表示法)。
S-表达式格式有许多变体,支持不同数据类型的各种不同语法。最广泛支持的是:
S-表达式在Lisp中既用作代码,也用作数据(见McCarthy Recursive Functions of Symbolic Expressions )。S-表达式原本被用于将被M-表达式(英语:M-expression)处理的数据,但Lisp的首个实现是一个 S-表达式的解释器,以 S-表达式编码 M-表达式,而Lisp程序员很快习惯于对代码和数据都使用 S-表达式。
S-表达式可以是如数字这样的单个对象,包括特殊原子nil
和t
在内的LISP 原子(英语:LIST atom),或写作 (x . y)
的cons pair。更长的列表则由嵌套的cons pair组成,例如(1 . (2 . (3 . nil)))
(,亦可写作更易理解的(1 2 3)
)。
使用前缀表示法,程序代码可写作 S-表达式。书写Lisp程序中额外的语法糖则是,一般的表达式(quote x)
可以省略为'x
。
嵌套列表可以写为 S-表达式:((milk juice) (honey marmalade))是一个双元素S-表达式,其元素也是双元素 S-表达式。Lisp(和本文)中使用的以空格分隔的符号是典型的。换行符(换行符)通常有资格作为分隔符。这是一个简单的上下文无关语法的一小部分英语写成 S-表达式(Gazdar / Melish,Lisp 中的自然语言处理):
(((S) (NP VP)) ((VP) (V)) ((VP) (V NP)) ((V) died) ((V) employed) ((NP) nurses) ((NP) patients) ((NP) Medicenter) ((NP) "Dr Chan"))