Forwarded from Solidot
霍金的声音将被发射到太空
英国知名理论物理学家霍金(Stephen Hawking)的骨灰本周五被安葬在西敏寺(Westminster Abbey),位于著名博物学家达尔文和科学家牛顿之间。安葬在西敏寺是一种极其罕见的荣誉,很少授予科学家。在霍金之前,最后两位安息在西敏寺的科学家分别是 1937 年的原子物理学家卢瑟福(Ernest Rutherford)和 1940 年的汤姆森(Joseph John Thomson)。霍金于今年三月去世,享年 76 岁。他写了多本非常受欢迎的科普著作。欧洲航天局(ESA)将把他的声音发射到太空。Media
https://www.solidot.org/story?sid=56877
英国知名理论物理学家霍金(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
duangsuse::Echo
突然发现关注数目从 50+ 降了几个,估计是之前 LIF 提到的部分粉丝退了,是好事,毕竟他们看不懂 BNF( 🙈 #life #emmm
(不过 Ruby BNF 的确很难看就是 233)
相比之下 Lua 可以鄙视 Ruby 了(
(其实我也只是想让你们彻底懂得 Ruby 语法,BNF 的话肯定不会在书上教完整版的
相比之下 Lua 可以鄙视 Ruby 了(
(其实我也只是想让你们彻底懂得 Ruby 语法,BNF 的话肯定不会在书上教完整版的
duangsuse::Echo
下面是由奇特版本 Ruby BNF 翻译来的 Ruby EBNF 语法基于 Ruby v1.9 为 《小白的 Ruby 红宝书》 翻译 终结符 (无法继续用子表达式描述的符号)使用 ALL-CAPS 或使用 '' 包裹 非终结符 使用小写 [] 内的表达式可选 {} 内的表达式可以出现多次也可以不出现 | 切分多种可能的匹配情况 () 用于包裹表达式以提高运算符优先级 ; Lexical rules ; Lexer 逻辑比这个特殊一些,不能当作是真正的词法规则,只能用于参考 ; 内用规则 ; dummy…
This media is not supported in your browser
VIEW IN TELEGRAM
#project
https://github.com/neoFelhz/neohosts/commit/925ab85052003bea723c5e738a3b07ddde6b8cd8
广告一下,使用 HostsGen 可以检测到这种手写的错误(跑
虽然 HostsGen 代码是很不怎么样了( 233
https://github.com/neoFelhz/neohosts/commit/925ab85052003bea723c5e738a3b07ddde6b8cd8
广告一下,使用 HostsGen 可以检测到这种手写的错误(跑
虽然 HostsGen 代码是很不怎么样了( 233
GitHub
fix: adwo, close #38 · neoFelhz/neohosts@925ab85
neohosts - 自由·负责·克制 去广告 Hosts 项目
duangsuse::Echo
#project https://github.com/neoFelhz/neohosts/commit/925ab85052003bea723c5e738a3b07ddde6b8cd8 广告一下,使用 HostsGen 可以检测到这种手写的错误(跑 虽然 HostsGen 代码是很不怎么样了( 233
(反正重写了 nfz 也不会合并的
https://github.com/duangsuse/hostsgen
https://github.com/duangsuse/hostsgen
GitHub
duangsuse/hostsgen
hostsgen - 📝 Simple&powerful hosts file generator for your hosts projects