duangsuse::Echo
720 subscribers
4.31K photos
131 videos
583 files
6.54K links
import this:
美而不丑、明而不暗、短而不凡、长而不乱,扁平不宽,读而后码,行之天下,勿托地上天国。
异常勿吞,难过勿过,叹一真理。效率是很重要,盲目最是低效。
简明是可靠的先验,不是可靠的祭品。
知其变,守其恒,为天下式;穷其变,知不穷,得地上势。知变守恒却穷变知新,我认真理,我不认真。

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
比如包含更多优秀学习资源的社区链接什么的
感觉有点 * 了,霍金生前多次警告不要寻找外星人,现在你们又把他的声音发射到太空…
Forwarded from Solidot
霍金的声音将被发射到太空

英国知名理论物理学家霍金(Stephen Hawking)的骨灰本周五被安葬在西敏寺(Westminster Abbey),位于著名博物学家达尔文和科学家牛顿之间。安葬在西敏寺是一种极其罕见的荣誉,很少授予科学家。在霍金之前,最后两位安息在西敏寺的科学家分别是 1937 年的原子物理学家卢瑟福(Ernest Rutherford)和 1940 年的汤姆森(Joseph John Thomson)。霍金于今年三月去世,享年 76 岁。他写了多本非常受欢迎的科普著作。欧洲航天局(ESA)将把他的声音发射到太空。Media

https://www.solidot.org/story?sid=56877
下面是由奇特版本 Ruby BNF 翻译来的 Ruby EBNF
语法基于 Ruby v1.9
《小白的 Ruby 红宝书》 翻译

终结符 (无法继续用子表达式描述的符号)使用 ALL-CAPS 或使用 '' 包裹
非终结符 使用小写
[] 内的表达式可选
{} 内的表达式可以出现多次也可以不出现
| 切分多种可能的匹配情况
() 用于包裹表达式以提高运算符优先级

; Lexical rules
; Lexer 逻辑比这个特殊一些,不能当作是真正的词法规则,只能用于参考

; 内用规则
; dummy rules
any_char -> ; any character
char -> ; any character, alias for any_char
identifier -> ; sequence in /[a-zA-Z_]{a-zA-Z0-9_}/

; 正则
regexp -> /{any_char}/ ['i' | 'o' | 'p']
| '%r' char {any_char} char

; Heredoc 注释
heredoc -> << (identifier | string) {any_char} identifier

; 字符串
string -> '"' {any_char} '"'
| '’' {any_char} '’'
| '‘' {any_char} '‘'
string2 -> '%' ('Q' | 'q' | 'x') char {any_char} char

; 全局变量名称
global -> '$' identifier | `$` any_char | '$-' any_char

; 有效变量名
varname -> global | '@' identifier | identifier

operation -> identifier ['!' | '?']

; 有效方法名
fname -> identifier | '..' | '|' | '^' | '&' | '<=>' | '==' | '===' | '=~' | '>'
| '>=' | '<' | '<=' | '+' | '-' | '*' | '/' | '%' | '**' | '<<' | '>>' | '~' | '+@'
| '-@' | '[]' | '[]='

; 符号,如 :[]= :a :var
symbol -> ':' fname | ':' varname

; 赋值运算符,>>= 和垃圾 Monad 类型系统没关系
; 皮一下,吐 Monad 类型系统无聊的属性
op-assign -> '+=' | '-=' | '*=' | '/=' | '%=' | '**=' | '&=' | '|=' | '^=' | '<<=' | '>>=' | '&&=' | '||='


然后是真的语法规则

; 从小到大 233

; 字面量们如 2132、"Hello"、:Hello、%q[233]、<<AAAbbcAAA、/a-z/
literal -> NUMERIC | symbol | string | string2 | heredoc | regexp

; 变量值
variable -> varname | NIL | SELF

; 例子: { 'foo' => 'bar' }
; { :a => :b, :b => :c}
; 在 Ruby 新版里,应该使用 { a: :b, b: :c }
assocation -> arg '=>' arg
assocations -> assocation {',' assocation}

singleton -> variable | '(' expr ')'

; 方法参数列表
; 由于特殊逻辑使用 EBNF 表述起来很麻烦,简要说一下
; 你可以在参数列表里使用 '*' identifier 表示 vararg name
; 也可以使用 '&' identifier 表示自动转换 block 为 Proc 对象,这个 identifier 就是 Proc 参数名
; '*' vararg name 和 '&' block arg 后不能出现一般方法参数
; Ruby 新版还支持 default value,对于这种情况,identifier '=' expr 的视为一般方法参数
arglist -> identifier {',' identifier}

; 类似 ES 的 newline 自动切分
; def foo arg0 arg1; puts arg0; puts arg1; end
t -> ';' | '\n'

; 参数列表定义
arg-decl -> '(' arglist ')' | arglist t

args -> arg {',' arg}

; 方法调用参数
call-args -> args
| args [',' assocations] [',' '*' arg] [',' '&' arg]
| assocations [',' '*' arg] [',' '&' arg]
| '*' arg [',' '&' arg] | '&' arg
| command

; 这一部分我也蒙蔽(逃
block-var -> lhs | mlhs
mlhs -> [mlhs-item {',' mlhs_item}] ['*' [lhs]] | '*' lhs
mlhs-item -> lhs | '(' mlhs ')'
lhs -> variable | primary '[' [args] ']' | primary '.' identifier
mrhs -> args [',' '*' arg] | '*' arg

; 程序结构的 BNF
program -> compstmt
compstmt -> stmt {t expr} [t]
; 语句们
stmt -> call DO ['|' [block-var] '|'] compstmt END
| UNDEF fname
| ALIAS fname fname
| stmt IF expr
| stmt WHILE expr
| stmt UNLESS expr
| stmt UNTIL expr
| BEGIN '{' compstmt '}'
| END '{' compstmt '}'
| lhs '=' command [DO ['|' [block-var] '|'] compstmt end]
| expr

expr -> mlhs '=' mrhs
| RETURN call-args
| YIELD call-args
| expr AND expr
| expr OR expr
| NOT expr
| command
| '!' command
| arg

call -> function | command

command -> operation call-args
| primary '.' operation call-args
| primary '::' operation call-args
| SUPER call-args

function -> operation ['(' [call-args] ')']
| primary '.' operation '(' [call-args] ')'
| primary '::' operation '(' [call-args] ')'
| primary '.' operation
| primary '::' operation
| SUPER '(' [call-args] ')'
| SUPER
突然发现关注数目从 50+ 降了几个,估计是之前 LIF 提到的部分粉丝退了,是好事,毕竟他们看不懂 BNF( 🙈 #life #emmm
duangsuse::Echo
突然发现关注数目从 50+ 降了几个,估计是之前 LIF 提到的部分粉丝退了,是好事,毕竟他们看不懂 BNF( 🙈 #life #emmm
(不过 Ruby BNF 的确很难看就是 233)
相比之下 Lua 可以鄙视 Ruby 了(
(其实我也只是想让你们彻底懂得 Ruby 语法,BNF 的话肯定不会在书上教完整版的
我不翻译了,累死
写完了第一章
我打算先写出本篇和题目,这本教程主要还是倾向简单入门的,我会尽可能屏蔽掉 Ruby 灵活的特性,把 Ruby 介绍得更像 Java 🌚♦️