Lines Matching full:self
129 def __init__(self, heredoc = False): argument
131 self._buffer = []
134 self._stack = []
135 self._escapable = None
137 self._heredoc = heredoc
139 def add(self, data, eof=False): argument
145 self._buffer += list(data)
146 self._parse(eof)
148 result = self._stack[0]
149 remaining = ''.join(self._buffer)
150 self._stack = []
151 self._buffer = []
154 def _is_escapable(self, c, delim=None): argument
156 if self._heredoc:
161 if len(self._stack)<=1:
163 delim = self._stack[-2][0]
165 escapables = self.ESCAPABLE.get(delim, None)
168 def _parse_squote(self, buf, result, eof): argument
179 def _parse_bquote(self, buf, result, eof): argument
186 elif self._is_escapable(buf[0]):
195 def _parse_dquote(self, buf, result, eof): argument
210 def _parse_command(self, buf, result, eof): argument
228 def _parse_parameter(self, buf, result, eof): argument
243 def _parse_dollar(self, buf, result, eof): argument
264 if buf[0] in self.SPECIAL_CHARSET:
269 if c not in self.NAME_CHARSET:
286 parsefunc = self._parse_command
288 parsefunc = self._parse_parameter
295 def _parse(self, eof): argument
296 buf = self._buffer
297 stack = self._stack
312 parsefunc = self._parse_squote
314 parsefunc = self._parse_bquote
316 parsefunc = self._parse_dquote
318 parsefunc = self._parse_command
320 parsefunc = self._parse_dollar
424 def __init__(self, op, delim): argument
429 self._op = op
430 self._delim = delim
431 self._buffer = []
432 self._token = []
434 def add(self, data, eof): argument
438 self._buffer += list(data)
439 self._parse(eof)
440 token = ''.join(self._token)
441 remaining = ''.join(self._buffer)
442 self._token, self._remaining = [], []
445 def _parse(self, eof): argument
449 for i,c in enumerate(self._buffer):
459 if i==-1 or self._buffer[i]!='\n':
463 line = ''.join(self._buffer)
465 self._buffer[:] = []
467 line = ''.join(self._buffer[:i])
468 eol = self._buffer[i]
469 self._buffer[:i+1] = []
471 if self._op=='<<-':
474 if line==self._delim:
477 self._token += [line, eol]
486 def __init__(self): argument
487 self.value = ''
488 self.type = None
490 def __getitem__(self, key): argument
493 return self.type
495 return self.value
500 def __init__(self, op, name=None): argument
501 self.op = op
502 self.name = name
503 self.pendings = []
526 # *self._state==ST_NORMAL
527 # - self._heredoc.op is None: no here-document
528 # - self._heredoc.op is not None but name is: here-document operator matched,
530 # - self._heredoc.op and name are not None: here-document is ready, following
533 # *self._state==ST_HEREDOC
534 # - The here-document is being delimited by self._herelexer. Once it is done
547 def __init__(self, parent_state = None): argument
548 self._input = []
549 self._pos = 0
551 self._token = ''
552 self._type = TK_TOKEN
554 self._state = self.ST_NORMAL
555 self._parent_state = parent_state
556 self._wordlexer = None
558 self._heredoc = HereDoc(None)
559 self._herelexer = None
566 self._for_count = None
568 def add(self, data, eof=False): argument
575 self._input += list(data)
576 self._parse(eof)
577 self._input[:self._pos] = []
578 return ''.join(self._input)
580 def _parse(self, eof): argument
581 while self._state:
582 if self._pos>=len(self._input):
585 elif self._state not in (self.ST_OP, self.ST_QUOTED, self.ST_HEREDOC):
587 self._push_token('')
593 if self._state==self.ST_NORMAL:
594 self._parse_normal()
595 elif self._state==self.ST_COMMENT:
596 self._parse_comment()
597 elif self._state==self.ST_OP:
598 self._parse_op(eof)
599 elif self._state==self.ST_QUOTED:
600 self._parse_quoted(eof)
601 elif self._state==self.ST_HEREDOC:
602 self._parse_heredoc(eof)
604 assert False, "Unknown state " + str(self._state)
606 if self._heredoc.op is not None:
609 def _parse_normal(self): argument
610 c = self._input[self._pos]
612 self._push_token(c)
613 self._token = c
614 self._type = TK_NEWLINE
615 self._push_token('')
616 self._pos += 1
618 self._state = self.ST_QUOTED
620 self._push_token(c)
622 self._type = TK_OP
623 self._token += c
624 self._pos += 1
625 self._state = self.ST_OP
627 self._push_token(c)
630 self._pos += 1
631 elif self._token:
632 self._token += c
633 self._pos += 1
635 self._state = self.ST_COMMENT
636 self._type = TK_COMMENT
637 self._pos += 1
639 self._pos += 1
640 self._token += c
642 def _parse_op(self, eof): argument
643 assert self._token
646 if self._pos>=len(self._input):
651 c = self._input[self._pos]
653 op = self._token + c
656 self._token = op
657 self._pos += 1
660 self._push_token(c)
661 self._state = self.ST_NORMAL
664 def _parse_comment(self): argument
666 if self._pos>=len(self._input):
669 c = self._input[self._pos]
672 self._state = self.ST_NORMAL
675 self._token += c
676 self._pos += 1
678 def _parse_quoted(self, eof): argument
680 if not self._wordlexer:
681 self._wordlexer = WordLexer()
683 if self._pos<len(self._input):
685 input = self._input[self._pos:]
686 self._pos += len(input)
688 wtree, remaining = self._wordlexer.add(input, eof)
689 self._wordlexer = None
690 self._token += wordtree_as_string(wtree)
694 self._input[self._pos:self._pos] = list(remaining)
695 self._state = self.ST_NORMAL
697 def _parse_heredoc(self, eof): argument
698 assert not self._token
700 if self._herelexer is None:
701 self._herelexer = HereDocLexer(self._heredoc.op, self._heredoc.name)
703 if self._pos<len(self._input):
705 input = self._input[self._pos:]
706 self._pos += len(input)
708 self._token, remaining = self._herelexer.add(input, eof)
711 self._herelexer = None
712 heredoc, self._heredoc = self._heredoc, HereDoc(None)
714 self._input[self._pos:self._pos] = list(remaining)
715 self._state = self.ST_NORMAL
718 heredoc.pendings[:0] = [(self._token, self._type, heredoc.name)]
720 self._token = token
721 self._type = type
722 self._push_token(delim)
724 def _push_token(self, delim): argument
725 if not self._token:
728 if self._heredoc.op is not None:
729 if self._heredoc.name is None:
731 if self._type!=TK_TOKEN:
732 raise ShellSyntaxError("expecting here-document name, got '%s'" % self._token)
733 self._heredoc.name = unquote_wordtree(make_wordtree(self._token))
734 self._type = TK_HERENAME
737 if self._type==TK_NEWLINE:
738 assert self._state==self.ST_NORMAL
739 self._state = self.ST_HEREDOC
741 self._heredoc.pendings.append((self._token, self._type, delim))
742 self._token = ''
743 self._type = TK_TOKEN
748 # tokens are stored in self._heredoc.pendings. Therefore, they will not
752 if self._type==TK_OP:
754 op = is_op(self._token)
756 self._type = TK_TOKEN
759 self._type = op
760 if self._token in ('<<', '<<-'):
764 if self._heredoc.op is not None:
765 raise ShellSyntaxError("syntax error near token '%s'" % self._token)
766 assert self._heredoc.op is None
767 self._heredoc.op = self._token
769 if self._type==TK_TOKEN:
770 if '=' in self._token and not delim:
771 if self._token.startswith('='):
775 prev = self._token[:self._token.find('=')]
777 self._type = TK_ASSIGNMENT
782 reserved = get_reserved(self._token)
784 if reserved=='In' and self._for_count!=2:
788 self._type = reserved
790 self._for_count = 0
791 elif are_digits(self._token) and delim in ('<', '>'):
793 self._type = TK_IONUMBER
794 elif self._token==';':
795 self._type = TK_COMMA
796 elif self._token=='&':
797 self._type = TK_AMPERSAND
798 elif self._type==TK_COMMENT:
800 self._token = ''
801 self._type = TK_TOKEN
804 if self._for_count is not None:
807 self._for_count += 1
808 if self._for_count==3:
809 self._for_count = None
811 self.on_token((self._token, self._type))
812 self._token = ''
813 self._type = TK_TOKEN
816 def on_token(self, token): argument
837 def __init__(self): argument
838 Lexer.__init__(self)
839 self._tokens = []
840 self._current = 0
841 self.lineno = 0
843 def on_token(self, token): argument
846 self.lineno = 0
850 t.lexer = self
854 self._tokens.append(t)
856 def is_empty(self): argument
857 return not bool(self._tokens)
860 def token(self): argument
861 if self._current>=len(self._tokens):
863 t = self._tokens[self._current]
864 self._current += 1