Jan 9, 2010 at 2:01 PM
Edited Jan 9, 2010 at 2:08 PM
I have a proprietary language I'm creating a grammar for which has commands in the following form:
someCommand <flags> <arguments>
Flags are in the form of -someFlag
Arguments are any literal, so numbers, strings,
true, and false are valid values.
Here is an example command:
someCommand -someFlag -someOtherFlag 5 true false 6 -7 "string" "another string";
A problem occurs though when using a unary operator on a numerical argument immediately after the flags. This statement fails to parse correctly, but it is valid syntax:
someCommand -someFlag -someOtherFlag -5 true false 6 -7 "string" "another string";
The issue seems to be that the parser is in the command flags state, so it hits the
-5 and gags because it wants an Identifier, not a
Number. I had hoped it would just leave the state when it hit something that didn't match. If that were the case, the
-5 would be picked up properly by the arguments rule.
Any suggestions for how to make this work would be greatly appreciated.
CommandStatement.Rule = Identifier + CommandFlags_opt + CommandArgs_opt + SemiColon;
CommandFlags_opt.Rule = MakeStarRule(CommandFlags_opt, CommandFlag);
CommandFlag.Rule = ToTerm("-") + Identifier;
CommandArgs_opt.Rule = MakeStarRule(CommandArgs_opt, Literal);
Literal.Rule = UnaryOperator_opt + Number | String | ToTerm("true") | "false";
UnaryOperator.Rule = ToTerm("+") | "-";