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
                    ;
原创粉丝点击