Module: LangScan::Shell
- Defined in:
- lib/langscan/sh.rb,
 ext/langscan/sh/sh/sh.c
Defined Under Namespace
Classes: Tokenizer
Constant Summary collapse
- Keywords =
- %w( case do done elif else esac fi for function if in select then until while time ) 
- ShBuiltinCommands =
- %w( break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset ) 
- BashBuiltinCommands =
- %w( alias bind builtin caller command declare echo enable help let local logout printf read shopt set source type typeset ulimit unalias ) 
- KeywordsHash =
- {} 
Class Method Summary collapse
- .abbrev ⇒ Object
- 
  
    
      .each_fragment(input)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    LangScan::Shell.each_fragment iterates over shell script fragments in input. 
- .extnames ⇒ Object
- .name ⇒ Object
- 
  
    
      .scan(input, &block)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    LangScan::Shell.scan iterates over shell scripts. 
Class Method Details
.abbrev ⇒ Object
| 22 23 24 | # File 'lib/langscan/sh.rb', line 22 def abbrev "sh" end | 
.each_fragment(input) ⇒ Object
LangScan::Shell.each_fragment iterates over shell script fragments in input. The fragments contains tokens and inter-token spaces and comments.
If a String is specified, the String itself is assumed as a shell script. If a IO is specified, the content of the IO is assumed as a shell script.
| 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | # File 'lib/langscan/sh.rb', line 77 def each_fragment(input) # :yields: token begin tokenizer = Tokenizer.new(input) while token_info = tokenizer.get_token type, text, beg_lineno, beg_columnno, beg_byteno, end_lineno, end_columnno, end_byteno = token_info token = Fragment.new(type, text, beg_lineno, beg_byteno) if token.type == :ident if KeywordsHash[token.text] token.type = :keyword end end yield token end ensure tokenizer.close end end | 
.extnames ⇒ Object
| 26 27 28 | # File 'lib/langscan/sh.rb', line 26 def extnames [".sh"] end | 
.name ⇒ Object
| 18 19 20 | # File 'lib/langscan/sh.rb', line 18 def name "shell script" end | 
.scan(input, &block) ⇒ Object
LangScan::Shell.scan iterates over shell scripts. It yields for each Fragment.
| 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | # File 'lib/langscan/sh.rb', line 32 def scan(input, &block) last_token = nil each_fragment(input) {|t| if t.type == :ident if t.text[0] == ?$ yield Fragment.new(:punct, '$', t.beg_lineno, t.beg_byteno) yield Fragment.new(:ident, t.text[1 .. -1], t.beg_lineno, t.beg_byteno + 1) last_token = nil next end if last_token != nil && last_token.type == :keyword && last_token.text == "function" t.type = :fundef end end if t.type == :heredoc_end blank_len = t.text.rindex(/\s/) if blank_len == nil yield Fragment.new(:ident, t.text, t.beg_lineno, t.beg_byteno) else yield Fragment.new(:space, t.text[0 .. blank_len], t.beg_lineno, t.beg_byteno) yield Fragment.new(:ident, t.text[blank_len+1 .. -1], t.beg_lineno, t.beg_byteno+blank_len+1) end next end t.type = :ident if t.type == :heredoc_beg yield t if t.type != :space && t.type != :comment last_token = t end } end |