【发布时间】:2015-05-07 19:00:48
【问题描述】:
我目前正在用 Go 实现一个 SASS 编译器 - c6,我在编写表达式解析器和求值器时发现了 Ruby SASS 编译器的一些奇怪行为。
SASS 参考在这里提到了纯 CSS '/' 和 SASS 除法表达式: http://sass-lang.com/documentation/file.SASS_REFERENCE.html#division-and-slash
设计是为了让 SASS 与原生 CSS 语法兼容,如下所示:
font: 10px/8px; // Plain CSS, no division. looks fine.
font: 10px/8px + 3px; // Expression
font: (10px/8px); // Expression
上面看起来还可以,但是如果你写:
.foo {
$a: 10px/8px;
font: $a;
}
以上内容将被编译为:
.foo {
font: 1.25; }
以下 SASS 中的正常表达式将始终是不带括号的表达式:
.foo {
padding: 2px+2px;
padding: 2px*3;
}
输出:
.foo {
padding: 4px;
padding: 6px; }
但是,以下 SASS 会产生不同的结果:
.foo {
padding: 2px-1px;
padding: 2px - 1px;
}
以上内容将被编译为:
.foo {
padding: 2px-1px; // treated as ident instead of expression
padding: 1px; }
除法运算符似乎是属性值的唯一例外,这使得语法不一致和模棱两可。 (其实SASS规范中有这么多歧义的语法……)
那么问题来了:
如何使表达式语法一致并避免纯 CSS '/' 和除法运算符之间的隐式行为? (如果不考虑SASS的兼容性)
你会怎么做?
谢谢
【问题讨论】:
-
Stack Overflow 用于解决技术问题。 “我不知道我想象中的语言应该使用什么语法”不算是技术问题,这纯粹是一个自以为是的问题。
-
在programmers.se上可能会更好
-
@cimmanon:这里没有想象中的语言。 OP 正在实现一个 Sass 编译器,并询问如何处理特定的边缘情况。答案似乎是没有一致的方法可以做到这一点。
-
@BoltClock OP 声明“如果我们不考虑 SASS 的兼容性”,因此它不会完全是 Sass 编译器。
-
@BoltClock 如果 OP 想知道如何防止在 Sass 中发生分裂,那么这个问题与 stackoverflow.com/questions/4988944/scss-font-shorthand 重复(讽刺的是,你回答了:p)
标签: css parsing compiler-construction sass