ruby中使用yacc定义的语法规则
来源:互联网 发布:校园二手网源码 编辑:程序博客网 时间:2024/06/09 21:05
摘自1.8.6,parse.y
stmt : kALIAS fitem {lex_state = EXPR_FNAME;} fitem
| kALIAS tGVAR tGVAR
| kALIAS tGVAR tBACK_REF
| kALIAS tGVAR tNTH_REF
kALIAS没有找到定义的部分,不知哪里可以产生这个信号
莫非这个是由yacc而非lex产生的?
不过这个的意思还比较明显,语言中使用alias定义的转义
| kUNDEF undef_list
意义也比较明显,undef_list由fitem构成的
| stmt kIF_MOD expr_value
这个ms可以看作stat if cond的语法糖
| stmt kUNLESS_MOD expr_value
unless好像也是一个语法糖,从代码中可以看到将条件和else互换
| stmt kWHILE_MOD expr_value
| stmt kUNTIL_MOD expr_value
while和until,两个写法相似,但好像不仅仅像if,unless一样,这两个语句似乎有自己的node类型
| stmt kRESCUE_MOD stmt
resure,我还没怎么用过的东西
| klBEGIN '{' compstmt '}'
| klEND '{' compstmt '}'
这两个语句的意义暂时搞不清
| lhs '=' command_call
lhs包含的类型十分丰富,不深究了。
出乎意料的是,后面的那个不是expr,而是command_call。从名字上,是否可以认为一切的expr都是command_call呢?
| mlhs '=' command_call
m=multiple?,有这个可能
| var_lhs tOP_ASGN command_call
+=,-=等语法糖,这里or和and单独处理,原因不明
| primary_value '[' aref_args ']' tOP_ASGN command_call
| primary_value '.' tIDENTIFIER tOP_ASGN command_call
| primary_value '.' tCONSTANT tOP_ASGN command_call
| primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_call
| backref tOP_ASGN command_call
这几个和上面的那个一样,不过把lhs写成var_lhs和primary...,可能有部分的lhs并不能用+=之类
| lhs '=' mrhs
| mlhs '=' arg_value
| mlhs '=' mrhs
还是几个赋值语句,不管啦
| expr
这个包含的学问又大了
;
expr : command_call
| arg
第一个先不说
第二个其实就是各种四则运算(不止四则)
剩下的可能最重要的是primary,通过看这一段可以知道那些语句是ruby语言本身定义的原语
primary
: literal
暂时不说
| strings
“”定义和链接的字符串,"a" "b"算一个串,也包括%q[打头的吧
| xstring
也是字符串,用``包围的可执行的命令,%x
| regexp
正则表达式
| words
‘’定义的字符串,也包括%w打头的,%w和%q啥区别来着?
| qwords
%q定义的字符串
| var_ref
变量名
| backref
不祥
| tFID
不祥
| kBEGIN bodystmt kEND
begin end块
| tLPAREN_ARG expr {lex_state = EXPR_ENDARG;} opt_nl ')'
| tLPAREN compstmt ')'
| primary_value tCOLON2 tCONSTANT
| tCOLON3 tCONSTANT
| primary_value '[' aref_args ']'
| tLBRACK aref_args ']'
| tLBRACE assoc_list '}'
| kRETURN
| kYIELD '(' call_args ')'
| kYIELD '(' ')'
| kYIELD
| kDEFINED opt_nl '(' {in_defined = 1;} expr ')'
| operation brace_block
| method_call
| method_call brace_block
| kIF expr_value then
compstmt
if_tail
kEND
| kUNLESS expr_value then
compstmt
opt_else
kEND
| kWHILE {COND_PUSH(1);} expr_value do {COND_POP();}
compstmt
kEND
| kUNTIL {COND_PUSH(1);} expr_value do {COND_POP();}
compstmt
kEND
| kCASE expr_value opt_terms
case_body
kEND
| kCASE opt_terms case_body kEND
| kCASE opt_terms kELSE compstmt kEND
| kFOR block_var kIN {COND_PUSH(1);} expr_value do {COND_POP();}
compstmt
kEND
| kCLASS cpath superclass bodystmt kEND
| kCLASS tLSHFT expr term bodystmt kEND
| kMODULE cpath bodystmt kEND
| kDEF fname f_arglist bodystmt kEND
| kDEF singleton dot_or_colon {lex_state = EXPR_FNAME;} fname f_arglist bodystmt kEND
| kBREAK
| kNEXT
| kREDO
| kRETRY
;
stmt : kALIAS fitem {lex_state = EXPR_FNAME;} fitem
| kALIAS tGVAR tGVAR
| kALIAS tGVAR tBACK_REF
| kALIAS tGVAR tNTH_REF
kALIAS没有找到定义的部分,不知哪里可以产生这个信号
莫非这个是由yacc而非lex产生的?
不过这个的意思还比较明显,语言中使用alias定义的转义
| kUNDEF undef_list
意义也比较明显,undef_list由fitem构成的
| stmt kIF_MOD expr_value
这个ms可以看作stat if cond的语法糖
| stmt kUNLESS_MOD expr_value
unless好像也是一个语法糖,从代码中可以看到将条件和else互换
| stmt kWHILE_MOD expr_value
| stmt kUNTIL_MOD expr_value
while和until,两个写法相似,但好像不仅仅像if,unless一样,这两个语句似乎有自己的node类型
| stmt kRESCUE_MOD stmt
resure,我还没怎么用过的东西
| klBEGIN '{' compstmt '}'
| klEND '{' compstmt '}'
这两个语句的意义暂时搞不清
| lhs '=' command_call
lhs包含的类型十分丰富,不深究了。
出乎意料的是,后面的那个不是expr,而是command_call。从名字上,是否可以认为一切的expr都是command_call呢?
| mlhs '=' command_call
m=multiple?,有这个可能
| var_lhs tOP_ASGN command_call
+=,-=等语法糖,这里or和and单独处理,原因不明
| primary_value '[' aref_args ']' tOP_ASGN command_call
| primary_value '.' tIDENTIFIER tOP_ASGN command_call
| primary_value '.' tCONSTANT tOP_ASGN command_call
| primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_call
| backref tOP_ASGN command_call
这几个和上面的那个一样,不过把lhs写成var_lhs和primary...,可能有部分的lhs并不能用+=之类
| lhs '=' mrhs
| mlhs '=' arg_value
| mlhs '=' mrhs
还是几个赋值语句,不管啦
| expr
这个包含的学问又大了
;
expr : command_call
| arg
第一个先不说
第二个其实就是各种四则运算(不止四则)
剩下的可能最重要的是primary,通过看这一段可以知道那些语句是ruby语言本身定义的原语
primary
: literal
暂时不说
| strings
“”定义和链接的字符串,"a" "b"算一个串,也包括%q[打头的吧
| xstring
也是字符串,用``包围的可执行的命令,%x
| regexp
正则表达式
| words
‘’定义的字符串,也包括%w打头的,%w和%q啥区别来着?
| qwords
%q定义的字符串
| var_ref
变量名
| backref
不祥
| tFID
不祥
| kBEGIN bodystmt kEND
begin end块
| tLPAREN_ARG expr {lex_state = EXPR_ENDARG;} opt_nl ')'
| tLPAREN compstmt ')'
| primary_value tCOLON2 tCONSTANT
| tCOLON3 tCONSTANT
| primary_value '[' aref_args ']'
| tLBRACK aref_args ']'
| tLBRACE assoc_list '}'
| kRETURN
| kYIELD '(' call_args ')'
| kYIELD '(' ')'
| kYIELD
| kDEFINED opt_nl '(' {in_defined = 1;} expr ')'
| operation brace_block
| method_call
| method_call brace_block
| kIF expr_value then
compstmt
if_tail
kEND
| kUNLESS expr_value then
compstmt
opt_else
kEND
| kWHILE {COND_PUSH(1);} expr_value do {COND_POP();}
compstmt
kEND
| kUNTIL {COND_PUSH(1);} expr_value do {COND_POP();}
compstmt
kEND
| kCASE expr_value opt_terms
case_body
kEND
| kCASE opt_terms case_body kEND
| kCASE opt_terms kELSE compstmt kEND
| kFOR block_var kIN {COND_PUSH(1);} expr_value do {COND_POP();}
compstmt
kEND
| kCLASS cpath superclass bodystmt kEND
| kCLASS tLSHFT expr term bodystmt kEND
| kMODULE cpath bodystmt kEND
| kDEF fname f_arglist bodystmt kEND
| kDEF singleton dot_or_colon {lex_state = EXPR_FNAME;} fname f_arglist bodystmt kEND
| kBREAK
| kNEXT
| kREDO
| kRETRY
;
- ruby中使用yacc定义的语法规则
- ruby中数组的定义和使用
- Ruby之旅(二) Ruby的基本语法以及对象的使用,方法的定义及调用,属性的定义及使用
- yacc的使用
- yacc的使用
- yacc的使用
- 验证Yacc的使用
- ruby中散列的定义和使用
- ruby模块的概念、定义和使用
- C语言词法及语法定义-Lex,Yacc
- C++中基本的语法规则
- JSTL的使用和语法规则
- bash 中定义变量的规则
- java中方法的定义与规则
- Lex与Yacc的使用
- LEX和YACC的使用
- 各种变量的定义规则和使用规则?
- Spring 2.0 中使用AOP新特性中关于Poincur的定义规则
- jsp基础速成精华讲解
- GridView的用法
- cygwin下载安装
- 测试一下
- 2007年软件开发者薪资调查报告
- ruby中使用yacc定义的语法规则
- ASP.NET MVC Framework与WCSF中MVP模式之小小比较
- ntsd
- 程序设计者孤独之美
- super.super.xxx为什么不行
- 面向.NET开发人员的Ajax 技术平台策略
- 躬身入局 2.6
- 从职位中预测2008年Java框架之争
- 让Struts2 在NetBeans 6中安家——在 NetBeans 6 中使用 Struts2