628
631
>>> print (c.parser.parseString('multiline command /* with comment in progress;').dump())
629
['multiline', ' command']
632
['multiline', ' command /* with comment in progress;']
630
633
- multilineCommand: multiline
631
634
>>> print (c.parser.parseString('multiline command /* with comment complete */ is done;').dump())
632
635
['multiline', 'command /* with comment complete */ is done', ';', '']
646
649
- multilineCommand: multiline
647
650
- terminator: ['\n', '\n']
648
651
- terminator: ['\n', '\n']
652
>>> print (c.parser.parseString('multiline command "with term; ends" now\n\n').dump())
653
['multiline', 'command "with term; ends" now', '\n', '\n']
654
- args: command "with term; ends" now
655
- multilineCommand: multiline
656
- statement: ['multiline', 'command "with term; ends" now', '\n', '\n']
657
- args: command "with term; ends" now
658
- multilineCommand: multiline
659
- terminator: ['\n', '\n']
660
- terminator: ['\n', '\n']
661
>>> print (c.parser.parseString('what if "quoted strings /* seem to " start comments?').dump())
662
['what', 'if "quoted strings /* seem to " start comments?']
663
- args: if "quoted strings /* seem to " start comments?
665
- statement: ['what', 'if "quoted strings /* seem to " start comments?']
666
- args: if "quoted strings /* seem to " start comments?
650
outputParser = (pyparsing.Literal('>>') | (pyparsing.WordStart() + '>') | pyparsing.Regex('[^=]>'))('output')
669
#outputParser = (pyparsing.Literal('>>') | (pyparsing.WordStart() + '>') | pyparsing.Regex('[^=]>'))('output')
670
outputParser = (pyparsing.Literal(self.redirector *2) | \
671
(pyparsing.WordStart() + self.redirector) | \
672
pyparsing.Regex('[^=]' + self.redirector))('output')
652
674
terminatorParser = pyparsing.Or([(hasattr(t, 'parseString') and t) or pyparsing.Literal(t) for t in self.terminators])('terminator')
653
675
stringEnd = pyparsing.stringEnd ^ '\nEOF'
654
676
self.multilineCommand = pyparsing.Or([pyparsing.Keyword(c, caseless=self.case_insensitive) for c in self.multilineCommands])('multilineCommand')
655
677
oneLineCommand = (~self.multilineCommand + pyparsing.Word(self.legalChars))('command')
656
678
pipe = pyparsing.Keyword('|', identChars='|')
657
self.commentGrammars.ignore(pyparsing.quotedString).setParseAction(lambda x: '')
679
self.commentGrammars.ignore(pyparsing.quotedString).setParseAction(lambda x: '')
680
doNotParse = self.commentGrammars | self.commentInProgress | pyparsing.quotedString
658
681
afterElements = \
659
pyparsing.Optional(pipe + pyparsing.SkipTo(outputParser ^ stringEnd)('pipeTo')) + \
660
pyparsing.Optional(outputParser + pyparsing.SkipTo(stringEnd).setParseAction(lambda x: x[0].strip())('outputTo'))
682
pyparsing.Optional(pipe + pyparsing.SkipTo(outputParser ^ stringEnd, ignore=doNotParse)('pipeTo')) + \
683
pyparsing.Optional(outputParser + pyparsing.SkipTo(stringEnd, ignore=doNotParse).setParseAction(lambda x: x[0].strip())('outputTo'))
661
684
if self.case_insensitive:
662
685
self.multilineCommand.setParseAction(lambda x: x[0].lower())
663
686
oneLineCommand.setParseAction(lambda x: x[0].lower())
667
690
self.blankLineTerminator = (pyparsing.lineEnd + pyparsing.lineEnd)('terminator')
668
691
self.blankLineTerminator.setResultsName('terminator')
669
self.blankLineTerminationParser = ((self.multilineCommand ^ oneLineCommand) + pyparsing.SkipTo(self.blankLineTerminator).setParseAction(lambda x: x[0].strip())('args') + self.blankLineTerminator)('statement')
670
self.multilineParser = (((self.multilineCommand ^ oneLineCommand) + pyparsing.SkipTo(terminatorParser, ignore=self.commentInProgress).setParseAction(lambda x: x[0].strip())('args') + terminatorParser)('statement') +
671
pyparsing.SkipTo(outputParser ^ pipe ^ stringEnd).setParseAction(lambda x: x[0].strip())('suffix') + afterElements)
692
self.blankLineTerminationParser = ((self.multilineCommand ^ oneLineCommand) + pyparsing.SkipTo(self.blankLineTerminator, ignore=doNotParse).setParseAction(lambda x: x[0].strip())('args') + self.blankLineTerminator)('statement')
693
self.multilineParser = (((self.multilineCommand ^ oneLineCommand) + pyparsing.SkipTo(terminatorParser, ignore=doNotParse).setParseAction(lambda x: x[0].strip())('args') + terminatorParser)('statement') +
694
pyparsing.SkipTo(outputParser ^ pipe ^ stringEnd, ignore=doNotParse).setParseAction(lambda x: x[0].strip())('suffix') + afterElements)
672
695
self.multilineParser.ignore(self.commentInProgress)
673
self.singleLineParser = ((oneLineCommand + pyparsing.SkipTo(terminatorParser ^ stringEnd ^ pipe ^ outputParser).setParseAction(lambda x:x[0].strip())('args'))('statement') +
696
self.singleLineParser = ((oneLineCommand + pyparsing.SkipTo(terminatorParser ^ stringEnd ^ pipe ^ outputParser, ignore=doNotParse).setParseAction(lambda x:x[0].strip())('args'))('statement') +
674
697
pyparsing.Optional(terminatorParser) + afterElements)
675
698
#self.multilineParser = self.multilineParser.setResultsName('multilineParser')
676
699
#self.singleLineParser = self.singleLineParser.setResultsName('singleLineParser')
680
703
self.multilineParser |
681
704
self.singleLineParser |
682
705
self.blankLineTerminationParser |
683
self.multilineCommand + pyparsing.SkipTo(stringEnd)
706
self.multilineCommand + pyparsing.SkipTo(stringEnd, ignore=doNotParse)
685
self.parser.ignore(pyparsing.quotedString).ignore(self.commentGrammars)
708
self.parser.ignore(self.commentGrammars)
687
710
inputMark = pyparsing.Literal('<')
688
711
inputMark.setParseAction(lambda x: '')
693
716
# as in "lesser than"
694
717
self.inputParser = inputMark + pyparsing.Optional(inputFrom) + pyparsing.Optional('>') + \
695
718
pyparsing.Optional(fileName) + (pyparsing.stringEnd | '|')
696
self.inputParser.ignore(pyparsing.quotedString).ignore(self.commentGrammars).ignore(self.commentInProgress)
719
self.inputParser.ignore(self.commentInProgress)
698
721
def preparse(self, raw, **kwargs):
796
819
self.kept_sys = Statekeeper(sys, ('stdout',))
797
820
if statement.parsed.outputTo:
799
if statement.parsed.output == '>>':
822
if statement.parsed.output == 2 * self.redirector:
801
824
sys.stdout = self.stdout = open(os.path.expanduser(statement.parsed.outputTo), mode)
1056
1079
keepstate.restore()
1058
def do_history(self, arg):
1081
@options([make_option('-s', '--script', action="store_true", help="Script format; no separation lines"),
1082
], arg_desc = '(limit on which commands to include)')
1083
def do_history(self, arg, opts):
1059
1084
"""history [arg]: lists past commands issued
1061
1086
| no arg: list all