作为一名程序员,在尝试使用Google Spreadsheets时,我感到有些沮丧,因为似乎没有明确的描述可用于公式化的语法。例如,我读过我可以F3:F
用来引用F
第3行以下的列,但是我在Google参考文档中找不到它提到的地方,并且它似乎并不总是有效。我可能做错了,但这就是这个问题的重点。
我不想浏览五种不同的教程来尝试猜测规则!是否有语法和语义的简洁描述?如果没有,也许有人可以在这里总结一下。
作为一名程序员,在尝试使用Google Spreadsheets时,我感到有些沮丧,因为似乎没有明确的描述可用于公式化的语法。例如,我读过我可以F3:F
用来引用F
第3行以下的列,但是我在Google参考文档中找不到它提到的地方,并且它似乎并不总是有效。我可能做错了,但这就是这个问题的重点。
我不想浏览五种不同的教程来尝试猜测规则!是否有语法和语义的简洁描述?如果没有,也许有人可以在这里总结一下。
Answers:
这是从这里摘录的一些文字。我已经把它贴在这里了。如果知道这一点与Google Spreadsheets中的公式有何不同的任何人都可以发表评论,那么也许我们可以得到一个很好的答案。
公式
通过公式,您可以在表格单元格中执行计算。每个公式可以以命名空间前缀开头,该前缀指定公式中使用的语法和语义。如果没有前缀,则使用下面描述的默认公式语法和语义。其后是一个等号,然后是公式本身。实现可以接受多种公式语法,并且可以接受对默认公式语法的各种扩展。但是,所有接受公式的实现都必须接受此处所述的默认公式语法和语义。他们也可以接受扩展。
实现严格模式的文档不得使用公式名称空间前缀(因为不能保证其他接收系统将能够对其进行处理),并且不得使用以下语义和语法的任何扩展。:在默认公式中语法,在初始等号后,公式必须是表达式。表达式可以是数字,常量字符串,命名范围,由二进制运算符连接的一对表达式,以一元运算符为前缀的表达式,逻辑运算符,函数调用,单元格地址或由括号。函数调用和逻辑运算符可能具有零个或多个以分号分隔的参数,并且每个参数必须为表达式。这些语法的语法如下:
号码。使用“ C”语言环境(使用“。”十进制分隔符且不使用千位分隔符),setlocale(LC_NUMERIC,“ C”)或等效方法以这种格式写入和读取数字。数字可以以%结尾,将其除以100。“%”不会更改其他运算符的含义,因此2 + 10%为2.1(不是2.2)。请注意,前导-和+号允许作为一元运算符,如下所述。作家必须写与模式匹配的数字(注意,它必须以数字开头):[0-9] +(。[0-9] +)?([eE] [+-]?[0-9] + )?%?读者必须能够阅读这些数字,并接受以“。”开头的数字,因此他们必须能够阅读以下形式的数字:((。[0-9] +)|([0- 9] +(。[0-9] +)?([eE] [+-]?[0-9] +)?))%%常量字符串。常量字符串被双引号引起;嵌入双引号,双引号字符使用两次。字符串以UTF-8格式存储。请注意,由于所有内容都存储为XML,因此公式中的所有双引号实际上都存储为XML中的“。常量字符串与模式匹配:\“([^^] | \” \“ \”)* \“
命名范围/字段。 命名范围/字段是指单独的定义值或值集(在电子表格中,通常是指单元格地址或地址集)。名称不区分大小写,因此“ a”和“ A”指的是同一范围。实现必须至少接受与以下模式匹配的命名范围:[A-Za-z] [A-Za-z0-9 _] *
运营商。 接受普通的infix和prefix运算符。它们具有以下关联性和优先级(从最低优先级到最高优先级):
关联运算符注释 左<,=,>,<=,> =,<>小于,等于,大于, 小于或等于,大于或等于, 不等于。 左+,-,&加,减,字符串串联。注意 一元(前缀)+和–具有不同的优先级。 左*,/乘,除。除法不会截断,所以 1/2等于0.5。 右^幂(2 ^ 3是8)。读者也应接受“ **”。 none +,-前缀一元运算符,例如-5或-[。A1]。 请注意,这些优先级与 加和减。
可以使用括号覆盖优先级,因此“ = 2 + 3 * 4”计算为14,而“ =(2 + 3)* 4”计算为20。请注意,+,-,*,/,^可转换任何字符串或二进制值他们在计算之前使用数字;请注意&(字符串串联)在将它们连接之前将任何值转换为字符串。逻辑运算符。逻辑运算符的语法与函数调用相同;它们的名称不区分大小写,参数用分号分隔,并且名称后必须带有括号。逻辑运算符为:
操作员参数计数注释 TRUE()0这是一个布尔常量,尽管其语法使其看起来像一个函数 FALSE()0这是一个布尔常量 NOT(表达式)1如果表达式为TRUE()返回FALSE(),否则返回TRUE() AND(e1; e2 [; e] *)2个或更多如果所有表达式均为TRUE(),则返回TRUE(),否则返回FALSE() OR(e1; e2 [; e] *)2个或更多如果所有表达式均为FALSE(),则返回FALSE(),否则返回TRUE() IF(条件; true_exp; false_exp) 3评估条件。如果为true,则返回true_exp,否则返回false_exp
AND(),OR()和IF()的实现必须短路,也就是说,它们必须依次从左到右求值,并且仅求值它们必须求值才能计算出结果的表达式。一个实现可以选择评估更多,但仅当表达式没有副作用时。AND()和OR()的实现应接受任意数量的参数,但每次使用都必须至少接受30个参数。操作NOT(),AND()和OR()以及IF()中的条件适用于布尔值;如果使用其他类型的表达式,则实现不应将0视为假,将任何其他数字值视为true,并且不应将零长度字符串视为false,而将任何其他字符串值视为true。如果为表达式计算了错误值,则该第一个错误是逻辑运算的结果。
函数调用。函数调用的函数名称与模式[A-za-z] [A-Za-z0-9 _] *相匹配,后跟一个左括号,零个或多个参数以及一个右括号。参数用分号(而不是逗号)分隔,尽管读者也可以选择使用逗号作为分隔符来接受函数调用。函数名称不区分大小写,因此“ sum”和“ SUM”是同一函数。如果有参数,则每个参数都必须是一个表达式,并且每个参数都不能为空,因此X(;)不是合法的函数调用,而RAND()是完全合法的。如果参数是可选的,则可以省略,但如果省略,则也必须省略其分隔符(功能说明应说明哪些参数是可选的,省略这些参数的含义)。典型的实现将具有许多内置功能,并且大多数实现还支持一种或多种创建用户定义函数的方式。常用功能包括:
包含数字的单元格的地址。地址可以是相对的或绝对的。相对地址由列字母和行号组成。在行字母或列编号前面加上a $
可使该行或列成为绝对的。
在默认公式语法中,将忽略空格(空格,制表符,换行符和回车符),但字符串常量的内容以及作为单元格范围地址列表中多个单元格范围地址的分隔符除外。
实现的用户界面可以选择接受和显示公式,与以这种数据格式交换公式的方式不同。例如,他们可以使用当前语言环境的格式来接受和显示数字,它们可以始终将数字格式用于特定的语言环境,它们可以将逗号而不是分号用于参数分隔符,并且可以接受并显示单元格地址而无需使用方括号。但是实现的用户界面应尽可能接受默认格式作为输入,例如,实现的界面应接受符合“ C”语言环境要求(以及当前语言环境)的数字,并应接受带括号的单元格地址。同样,实现的用户界面应该纠正可能的错误,可能需要进行对话。例如,
以下是一个简单公式的示例:
=sum(A1:A5)
此公式计算范围为“ .A1:.A5”的所有单元格的值之和。该功能为“求和”。参数以“(”开头和结尾处“”)标记。如果一个函数包含多个参数,则参数之间用“;”分隔。以下是上面显示的公式的一种变体:
=sum(A1;A2;A3;A4;A5)
此公式的结果相同。在公式中使用的组件取决于您使用的应用程序。
经过一番搜寻之后,我发现
我发现的最详尽的定义是在此旧邮件列表帖子中:http : //lists.oasis-open.org/archives/office-comment/200411/msg00000.html,其中包含yacc语法,词法标记器,以及对语义的简短描述。
目前尚不清楚这与Google Spreadsheet的实现有多紧密-一些示例在Google Spreadsheets中不起作用。
这似乎令人遗憾。此信息的任何进展将不胜感激。
David Hoepelman的硕士论文“工具辅助的电子表格重构和电子表格公式解析”(Delft工业大学)是迄今为止我对电子表格公式语法的最佳描述。BNF,经验验证和所有修饰。足够简单,足以成为手工编码项目的良好指南。XLParser是本文引用的GitHub开源项目。
for,它适用于Excel,而不适用于工作表,但就工作表公式与Excel兼容的程度而言,这是一个很好的起点。