summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcatherine devlin <catherine.devlin@gmail.com>2011-08-21 02:39:43 -0400
committercatherine devlin <catherine.devlin@gmail.com>2011-08-21 02:39:43 -0400
commitbf78cb82f0f7119058d94330a69455f3cd9980c0 (patch)
tree97144d9641d53152053f721d4001e983f198660f
parent1d1cddac90500c76a286ab28a0b8bab4de2933c0 (diff)
downloadcmd2-hg-bf78cb82f0f7119058d94330a69455f3cd9980c0.tar.gz
better SkipTo around quoted strings
-rwxr-xr-xcmd2.py44
1 files changed, 17 insertions, 27 deletions
diff --git a/cmd2.py b/cmd2.py
index 104fc1d..332d9b3 100755
--- a/cmd2.py
+++ b/cmd2.py
@@ -628,7 +628,7 @@ class Cmd(cmd.Cmd):
- terminator: ;
- terminator: ;
>>> print (c.parser.parseString('multiline command /* with comment in progress;').dump())
- ['multiline', ' command']
+ ['multiline', ' command /* with comment in progress;']
- multilineCommand: multiline
>>> print (c.parser.parseString('multiline command /* with comment complete */ is done;').dump())
['multiline', 'command /* with comment complete */ is done', ';', '']
@@ -649,42 +649,34 @@ class Cmd(cmd.Cmd):
- terminator: ['\n', '\n']
- terminator: ['\n', '\n']
>>> print (c.parser.parseString('multiline command "with term; ends" now\n\n').dump())
- ['multiline', 'command ends', '\n', '\n']
+ ['multiline', 'command "with term; ends" now', '\n', '\n']
- args: command "with term; ends" now
- multilineCommand: multiline
- - statement: ['multiline', '"with term; ends" now', '\n', '\n']
+ - statement: ['multiline', 'command "with term; ends" now', '\n', '\n']
- args: command "with term; ends" now
- multilineCommand: multiline
- terminator: ['\n', '\n']
- terminator: ['\n', '\n']
- >>> print (c.parser.parseString('what if "ending is in quotes" but').dump())
- ['what', 'if "ending is in quotes" but']
- - args: if "ending is in quotes" but
- - command: what
- - statement: ['what', 'if "ending is in quotes" but']
- - args: if "ending is in quotes" but
- - command: what
- >>> print (c.parser.parseString('what if "ending is in quotes"').dump())
- ['what', 'if "ending is in quotes"']
- - args: if "ending is in quotes"
+ >>> print (c.parser.parseString('what if "quoted strings /* seem to " start comments?').dump())
+ ['what', 'if "quoted strings /* seem to " start comments?']
+ - args: if "quoted strings /* seem to " start comments?
- command: what
- - statement: ['what', 'if "ending is in quotes"']
- - args: if "ending is in quotes"
+ - statement: ['what', 'if "quoted strings /* seem to " start comments?']
+ - args: if "quoted strings /* seem to " start comments?
- command: what
'''
outputParser = (pyparsing.Literal('>>') | (pyparsing.WordStart() + '>') | pyparsing.Regex('[^=]>'))('output')
terminatorParser = pyparsing.Or([(hasattr(t, 'parseString') and t) or pyparsing.Literal(t) for t in self.terminators])('terminator')
- terminatorParser.ignore(pyparsing.quotedString) #fail
stringEnd = pyparsing.stringEnd ^ '\nEOF'
self.multilineCommand = pyparsing.Or([pyparsing.Keyword(c, caseless=self.case_insensitive) for c in self.multilineCommands])('multilineCommand')
oneLineCommand = (~self.multilineCommand + pyparsing.Word(self.legalChars))('command')
pipe = pyparsing.Keyword('|', identChars='|')
self.commentGrammars.ignore(pyparsing.quotedString).setParseAction(lambda x: '')
- doNotParse = self.commentGrammars | commentInProgress
+ doNotParse = self.commentGrammars | self.commentInProgress | pyparsing.quotedString
afterElements = \
- pyparsing.Optional(pipe + pyparsing.SkipTo(outputParser ^ stringEnd)('pipeTo')) + \
- pyparsing.Optional(outputParser + pyparsing.SkipTo(stringEnd).setParseAction(lambda x: x[0].strip())('outputTo'))
+ pyparsing.Optional(pipe + pyparsing.SkipTo(outputParser ^ stringEnd, ignore=doNotParse)('pipeTo')) + \
+ pyparsing.Optional(outputParser + pyparsing.SkipTo(stringEnd, ignore=doNotParse).setParseAction(lambda x: x[0].strip())('outputTo'))
if self.case_insensitive:
self.multilineCommand.setParseAction(lambda x: x[0].lower())
oneLineCommand.setParseAction(lambda x: x[0].lower())
@@ -693,11 +685,11 @@ class Cmd(cmd.Cmd):
else:
self.blankLineTerminator = (pyparsing.lineEnd + pyparsing.lineEnd)('terminator')
self.blankLineTerminator.setResultsName('terminator')
- self.blankLineTerminationParser = ((self.multilineCommand ^ oneLineCommand) + pyparsing.SkipTo(self.blankLineTerminator).setParseAction(lambda x: x[0].strip())('args') + self.blankLineTerminator)('statement')
- self.multilineParser = (((self.multilineCommand ^ oneLineCommand) + pyparsing.SkipTo(terminatorParser, ignore=self.commentInProgress).setParseAction(lambda x: x[0].strip())('args') + terminatorParser)('statement') +
- pyparsing.SkipTo(outputParser ^ pipe ^ stringEnd).setParseAction(lambda x: x[0].strip())('suffix') + afterElements)
+ self.blankLineTerminationParser = ((self.multilineCommand ^ oneLineCommand) + pyparsing.SkipTo(self.blankLineTerminator, ignore=doNotParse).setParseAction(lambda x: x[0].strip())('args') + self.blankLineTerminator)('statement')
+ self.multilineParser = (((self.multilineCommand ^ oneLineCommand) + pyparsing.SkipTo(terminatorParser, ignore=doNotParse).setParseAction(lambda x: x[0].strip())('args') + terminatorParser)('statement') +
+ pyparsing.SkipTo(outputParser ^ pipe ^ stringEnd, ignore=doNotParse).setParseAction(lambda x: x[0].strip())('suffix') + afterElements)
self.multilineParser.ignore(self.commentInProgress)
- self.singleLineParser = ((oneLineCommand + pyparsing.SkipTo(terminatorParser ^ stringEnd ^ pipe ^ outputParser).setParseAction(lambda x:x[0].strip())('args'))('statement') +
+ self.singleLineParser = ((oneLineCommand + pyparsing.SkipTo(terminatorParser ^ stringEnd ^ pipe ^ outputParser, ignore=doNotParse).setParseAction(lambda x:x[0].strip())('args'))('statement') +
pyparsing.Optional(terminatorParser) + afterElements)
#self.multilineParser = self.multilineParser.setResultsName('multilineParser')
#self.singleLineParser = self.singleLineParser.setResultsName('singleLineParser')
@@ -707,9 +699,8 @@ class Cmd(cmd.Cmd):
self.multilineParser |
self.singleLineParser |
self.blankLineTerminationParser |
- self.multilineCommand + pyparsing.SkipTo(stringEnd)
+ self.multilineCommand + pyparsing.SkipTo(stringEnd, ignore=doNotParse)
)
- #self.parser.ignore(pyparsing.quotedString).ignore(self.commentGrammars)
self.parser.ignore(self.commentGrammars)
inputMark = pyparsing.Literal('<')
@@ -721,8 +712,7 @@ class Cmd(cmd.Cmd):
# as in "lesser than"
self.inputParser = inputMark + pyparsing.Optional(inputFrom) + pyparsing.Optional('>') + \
pyparsing.Optional(fileName) + (pyparsing.stringEnd | '|')
- #self.inputParser.ignore(pyparsing.quotedString).ignore(self.commentGrammars).ignore(self.commentInProgress)
- self.inputParser.ignore(self.commentGrammars).ignore(self.commentInProgress)
+ self.inputParser.ignore(self.commentInProgress)
def preparse(self, raw, **kwargs):
return raw