1
0
Fork 0

Add the WhereAmI command

This commit is contained in:
Kevin Matz 2019-08-05 10:20:59 -04:00
parent 6cfe698d76
commit 7d9e97a11e
6 changed files with 154 additions and 110 deletions

View File

@ -43,6 +43,7 @@ command
| 'pause' number #Pause
| 'wait' number? #Wait
| 'pass' #Pass
| 'whereami' #WhereAmI
;
coords : '{' value? ( seperator value? )* '}' ;

View File

@ -8,47 +8,51 @@ import sys
def serializedATN():
with StringIO() as buf:
buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\20")
buf.write("y\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7")
buf.write("\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16")
buf.write("\t\16\4\17\t\17\4\20\t\20\4\21\t\21\3\2\3\2\3\3\3\3\3")
buf.write("\3\3\4\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\6\3\6")
buf.write("\3\6\3\6\3\6\3\7\3\7\3\b\3\b\3\t\3\t\7\t?\n\t\f\t\16\t")
buf.write("B\13\t\3\n\6\nE\n\n\r\n\16\nF\3\n\3\n\6\nK\n\n\r\n\16")
buf.write("\nL\5\nO\n\n\3\13\3\13\3\13\3\f\3\f\3\r\3\r\3\16\3\16")
buf.write("\3\17\5\17[\n\17\3\17\3\17\3\20\6\20`\n\20\r\20\16\20")
buf.write("a\3\20\3\20\3\21\3\21\3\21\3\21\7\21j\n\21\f\21\16\21")
buf.write("m\13\21\3\21\3\21\7\21q\n\21\f\21\16\21t\13\21\5\21v\n")
buf.write("\21\3\21\3\21\2\2\22\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21")
buf.write("\n\23\13\25\f\27\2\31\2\33\r\35\16\37\17!\20\3\2\b\5\2")
buf.write("C\\aac|\6\2\62;C\\aac|\3\2\62;\5\2\62;CHch\4\2\13\13\"")
buf.write("\"\4\2\f\f\17\17\2\177\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2")
buf.write("\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2")
buf.write("\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\33\3\2\2\2\2")
buf.write("\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\3#\3\2\2\2\5%\3\2")
buf.write("\2\2\7(\3\2\2\2\t.\3\2\2\2\13\63\3\2\2\2\r8\3\2\2\2\17")
buf.write(":\3\2\2\2\21<\3\2\2\2\23D\3\2\2\2\25P\3\2\2\2\27S\3\2")
buf.write("\2\2\31U\3\2\2\2\33W\3\2\2\2\35Z\3\2\2\2\37_\3\2\2\2!")
buf.write("u\3\2\2\2#$\7=\2\2$\4\3\2\2\2%&\7i\2\2&\'\7q\2\2\'\6\3")
buf.write("\2\2\2()\7r\2\2)*\7c\2\2*+\7w\2\2+,\7u\2\2,-\7g\2\2-\b")
buf.write("\3\2\2\2./\7y\2\2/\60\7c\2\2\60\61\7k\2\2\61\62\7v\2\2")
buf.write("\62\n\3\2\2\2\63\64\7r\2\2\64\65\7c\2\2\65\66\7u\2\2\66")
buf.write("\67\7u\2\2\67\f\3\2\2\289\7}\2\29\16\3\2\2\2:;\7\177\2")
buf.write("\2;\20\3\2\2\2<@\t\2\2\2=?\t\3\2\2>=\3\2\2\2?B\3\2\2\2")
buf.write("@>\3\2\2\2@A\3\2\2\2A\22\3\2\2\2B@\3\2\2\2CE\5\27\f\2")
buf.write("DC\3\2\2\2EF\3\2\2\2FD\3\2\2\2FG\3\2\2\2GN\3\2\2\2HJ\7")
buf.write("\60\2\2IK\5\27\f\2JI\3\2\2\2KL\3\2\2\2LJ\3\2\2\2LM\3\2")
buf.write("\2\2MO\3\2\2\2NH\3\2\2\2NO\3\2\2\2O\24\3\2\2\2PQ\5\31")
buf.write("\r\2QR\5\31\r\2R\26\3\2\2\2ST\t\4\2\2T\30\3\2\2\2UV\t")
buf.write("\5\2\2V\32\3\2\2\2WX\7.\2\2X\34\3\2\2\2Y[\7\17\2\2ZY\3")
buf.write("\2\2\2Z[\3\2\2\2[\\\3\2\2\2\\]\7\f\2\2]\36\3\2\2\2^`\t")
buf.write("\6\2\2_^\3\2\2\2`a\3\2\2\2a_\3\2\2\2ab\3\2\2\2bc\3\2\2")
buf.write("\2cd\b\20\2\2d \3\2\2\2ef\7\61\2\2fg\7\61\2\2gk\3\2\2")
buf.write("\2hj\n\7\2\2ih\3\2\2\2jm\3\2\2\2ki\3\2\2\2kl\3\2\2\2l")
buf.write("v\3\2\2\2mk\3\2\2\2nr\7%\2\2oq\n\7\2\2po\3\2\2\2qt\3\2")
buf.write("\2\2rp\3\2\2\2rs\3\2\2\2sv\3\2\2\2tr\3\2\2\2ue\3\2\2\2")
buf.write("un\3\2\2\2vw\3\2\2\2wx\b\21\2\2x\"\3\2\2\2\f\2@FLNZak")
buf.write("ru\3\b\2\2")
buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\21")
buf.write("\u0084\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7")
buf.write("\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r")
buf.write("\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22\3\2")
buf.write("\3\2\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3")
buf.write("\5\3\5\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\7\3\7")
buf.write("\3\7\3\7\3\b\3\b\3\t\3\t\3\n\3\n\7\nJ\n\n\f\n\16\nM\13")
buf.write("\n\3\13\6\13P\n\13\r\13\16\13Q\3\13\3\13\6\13V\n\13\r")
buf.write("\13\16\13W\5\13Z\n\13\3\f\3\f\3\f\3\r\3\r\3\16\3\16\3")
buf.write("\17\3\17\3\20\5\20f\n\20\3\20\3\20\3\21\6\21k\n\21\r\21")
buf.write("\16\21l\3\21\3\21\3\22\3\22\3\22\3\22\7\22u\n\22\f\22")
buf.write("\16\22x\13\22\3\22\3\22\7\22|\n\22\f\22\16\22\177\13\22")
buf.write("\5\22\u0081\n\22\3\22\3\22\2\2\23\3\3\5\4\7\5\t\6\13\7")
buf.write("\r\b\17\t\21\n\23\13\25\f\27\r\31\2\33\2\35\16\37\17!")
buf.write("\20#\21\3\2\b\5\2C\\aac|\6\2\62;C\\aac|\3\2\62;\5\2\62")
buf.write(";CHch\4\2\13\13\"\"\4\2\f\f\17\17\2\u008a\2\3\3\2\2\2")
buf.write("\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r")
buf.write("\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3")
buf.write("\2\2\2\2\27\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2")
buf.write("\2\2#\3\2\2\2\3%\3\2\2\2\5\'\3\2\2\2\7*\3\2\2\2\t\60\3")
buf.write("\2\2\2\13\65\3\2\2\2\r:\3\2\2\2\17C\3\2\2\2\21E\3\2\2")
buf.write("\2\23G\3\2\2\2\25O\3\2\2\2\27[\3\2\2\2\31^\3\2\2\2\33")
buf.write("`\3\2\2\2\35b\3\2\2\2\37e\3\2\2\2!j\3\2\2\2#\u0080\3\2")
buf.write("\2\2%&\7=\2\2&\4\3\2\2\2\'(\7i\2\2()\7q\2\2)\6\3\2\2\2")
buf.write("*+\7r\2\2+,\7c\2\2,-\7w\2\2-.\7u\2\2./\7g\2\2/\b\3\2\2")
buf.write("\2\60\61\7y\2\2\61\62\7c\2\2\62\63\7k\2\2\63\64\7v\2\2")
buf.write("\64\n\3\2\2\2\65\66\7r\2\2\66\67\7c\2\2\678\7u\2\289\7")
buf.write("u\2\29\f\3\2\2\2:;\7y\2\2;<\7j\2\2<=\7g\2\2=>\7t\2\2>")
buf.write("?\7g\2\2?@\7c\2\2@A\7o\2\2AB\7k\2\2B\16\3\2\2\2CD\7}\2")
buf.write("\2D\20\3\2\2\2EF\7\177\2\2F\22\3\2\2\2GK\t\2\2\2HJ\t\3")
buf.write("\2\2IH\3\2\2\2JM\3\2\2\2KI\3\2\2\2KL\3\2\2\2L\24\3\2\2")
buf.write("\2MK\3\2\2\2NP\5\31\r\2ON\3\2\2\2PQ\3\2\2\2QO\3\2\2\2")
buf.write("QR\3\2\2\2RY\3\2\2\2SU\7\60\2\2TV\5\31\r\2UT\3\2\2\2V")
buf.write("W\3\2\2\2WU\3\2\2\2WX\3\2\2\2XZ\3\2\2\2YS\3\2\2\2YZ\3")
buf.write("\2\2\2Z\26\3\2\2\2[\\\5\33\16\2\\]\5\33\16\2]\30\3\2\2")
buf.write("\2^_\t\4\2\2_\32\3\2\2\2`a\t\5\2\2a\34\3\2\2\2bc\7.\2")
buf.write("\2c\36\3\2\2\2df\7\17\2\2ed\3\2\2\2ef\3\2\2\2fg\3\2\2")
buf.write("\2gh\7\f\2\2h \3\2\2\2ik\t\6\2\2ji\3\2\2\2kl\3\2\2\2l")
buf.write("j\3\2\2\2lm\3\2\2\2mn\3\2\2\2no\b\21\2\2o\"\3\2\2\2pq")
buf.write("\7\61\2\2qr\7\61\2\2rv\3\2\2\2su\n\7\2\2ts\3\2\2\2ux\3")
buf.write("\2\2\2vt\3\2\2\2vw\3\2\2\2w\u0081\3\2\2\2xv\3\2\2\2y}")
buf.write("\7%\2\2z|\n\7\2\2{z\3\2\2\2|\177\3\2\2\2}{\3\2\2\2}~\3")
buf.write("\2\2\2~\u0081\3\2\2\2\177}\3\2\2\2\u0080p\3\2\2\2\u0080")
buf.write("y\3\2\2\2\u0081\u0082\3\2\2\2\u0082\u0083\b\22\2\2\u0083")
buf.write("$\3\2\2\2\f\2KQWYelv}\u0080\3\b\2\2")
return buf.getvalue()
@ -65,28 +69,29 @@ class ArmControlLexer(Lexer):
T__4 = 5
T__5 = 6
T__6 = 7
NAME = 8
NUMBER = 9
HEX = 10
SEPERATOR = 11
NEWLINE = 12
WS = 13
COMMENT = 14
T__7 = 8
NAME = 9
NUMBER = 10
HEX = 11
SEPERATOR = 12
NEWLINE = 13
WS = 14
COMMENT = 15
channelNames = [ u"DEFAULT_TOKEN_CHANNEL", u"HIDDEN" ]
modeNames = [ "DEFAULT_MODE" ]
literalNames = [ "<INVALID>",
"';'", "'go'", "'pause'", "'wait'", "'pass'", "'{'", "'}'",
"','" ]
"';'", "'go'", "'pause'", "'wait'", "'pass'", "'whereami'",
"'{'", "'}'", "','" ]
symbolicNames = [ "<INVALID>",
"NAME", "NUMBER", "HEX", "SEPERATOR", "NEWLINE", "WS", "COMMENT" ]
ruleNames = [ "T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6",
"NAME", "NUMBER", "HEX", "DIGIT", "HexDigit", "SEPERATOR",
"NEWLINE", "WS", "COMMENT" ]
"T__7", "NAME", "NUMBER", "HEX", "DIGIT", "HexDigit",
"SEPERATOR", "NEWLINE", "WS", "COMMENT" ]
grammarFileName = "ArmControl.g4"

View File

@ -62,6 +62,15 @@ class ArmControlListener(ParseTreeListener):
pass
# Enter a parse tree produced by ArmControlParser#WhereAmI.
def enterWhereAmI(self, ctx:ArmControlParser.WhereAmIContext):
pass
# Exit a parse tree produced by ArmControlParser#WhereAmI.
def exitWhereAmI(self, ctx:ArmControlParser.WhereAmIContext):
pass
# Enter a parse tree produced by ArmControlParser#coords.
def enterCoords(self, ctx:ArmControlParser.CoordsContext):
pass

View File

@ -8,35 +8,35 @@ import sys
def serializedATN():
with StringIO() as buf:
buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\20")
buf.write("W\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b")
buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\21")
buf.write("X\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b")
buf.write("\t\b\4\t\t\t\4\n\t\n\3\2\7\2\26\n\2\f\2\16\2\31\13\2\3")
buf.write("\2\3\2\3\3\3\3\3\3\7\3 \n\3\f\3\16\3#\13\3\3\3\5\3&\n")
buf.write("\3\3\3\5\3)\n\3\3\4\3\4\3\4\3\4\3\4\3\4\5\4\61\n\4\3\4")
buf.write("\3\4\3\4\3\4\5\4\67\n\4\3\4\5\4:\n\4\3\5\3\5\5\5>\n\5")
buf.write("\3\5\3\5\5\5B\n\5\7\5D\n\5\f\5\16\5G\13\5\3\5\3\5\3\6")
buf.write("\3\6\3\7\3\7\5\7O\n\7\3\b\3\b\3\t\3\t\3\n\3\n\3\n\2\2")
buf.write("\13\2\4\6\b\n\f\16\20\22\2\2\2[\2\27\3\2\2\2\4(\3\2\2")
buf.write("\2\69\3\2\2\2\b;\3\2\2\2\nJ\3\2\2\2\fN\3\2\2\2\16P\3\2")
buf.write("\2\2\20R\3\2\2\2\22T\3\2\2\2\24\26\5\4\3\2\25\24\3\2\2")
buf.write("\2\26\31\3\2\2\2\27\25\3\2\2\2\27\30\3\2\2\2\30\32\3\2")
buf.write("\2\2\31\27\3\2\2\2\32\33\7\2\2\3\33\3\3\2\2\2\34!\5\6")
buf.write("\4\2\35\36\7\3\2\2\36 \5\6\4\2\37\35\3\2\2\2 #\3\2\2\2")
buf.write("!\37\3\2\2\2!\"\3\2\2\2\"%\3\2\2\2#!\3\2\2\2$&\7\16\2")
buf.write("\2%$\3\2\2\2%&\3\2\2\2&)\3\2\2\2\')\7\16\2\2(\34\3\2\2")
buf.write("\2(\'\3\2\2\2)\5\3\2\2\2*\60\7\4\2\2+\61\5\b\5\2,-\5\n")
buf.write("\6\2-.\5\f\7\2.\61\3\2\2\2/\61\5\n\6\2\60+\3\2\2\2\60")
buf.write(",\3\2\2\2\60/\3\2\2\2\61:\3\2\2\2\62\63\7\5\2\2\63:\5")
buf.write("\16\b\2\64\66\7\6\2\2\65\67\5\16\b\2\66\65\3\2\2\2\66")
buf.write("\67\3\2\2\2\67:\3\2\2\28:\7\7\2\29*\3\2\2\29\62\3\2\2")
buf.write("\29\64\3\2\2\298\3\2\2\2:\7\3\2\2\2;=\7\b\2\2<>\5\f\7")
buf.write("\2=<\3\2\2\2=>\3\2\2\2>E\3\2\2\2?A\5\22\n\2@B\5\f\7\2")
buf.write("A@\3\2\2\2AB\3\2\2\2BD\3\2\2\2C?\3\2\2\2DG\3\2\2\2EC\3")
buf.write("\2\2\2EF\3\2\2\2FH\3\2\2\2GE\3\2\2\2HI\7\t\2\2I\t\3\2")
buf.write("\2\2JK\7\n\2\2K\13\3\2\2\2LO\5\16\b\2MO\5\20\t\2NL\3\2")
buf.write("\2\2NM\3\2\2\2O\r\3\2\2\2PQ\7\13\2\2Q\17\3\2\2\2RS\7\f")
buf.write("\2\2S\21\3\2\2\2TU\7\r\2\2U\23\3\2\2\2\r\27!%(\60\669")
buf.write("=AEN")
buf.write("\3\4\3\4\3\4\5\4\67\n\4\3\4\3\4\5\4;\n\4\3\5\3\5\5\5?")
buf.write("\n\5\3\5\3\5\5\5C\n\5\7\5E\n\5\f\5\16\5H\13\5\3\5\3\5")
buf.write("\3\6\3\6\3\7\3\7\5\7P\n\7\3\b\3\b\3\t\3\t\3\n\3\n\3\n")
buf.write("\2\2\13\2\4\6\b\n\f\16\20\22\2\2\2]\2\27\3\2\2\2\4(\3")
buf.write("\2\2\2\6:\3\2\2\2\b<\3\2\2\2\nK\3\2\2\2\fO\3\2\2\2\16")
buf.write("Q\3\2\2\2\20S\3\2\2\2\22U\3\2\2\2\24\26\5\4\3\2\25\24")
buf.write("\3\2\2\2\26\31\3\2\2\2\27\25\3\2\2\2\27\30\3\2\2\2\30")
buf.write("\32\3\2\2\2\31\27\3\2\2\2\32\33\7\2\2\3\33\3\3\2\2\2\34")
buf.write("!\5\6\4\2\35\36\7\3\2\2\36 \5\6\4\2\37\35\3\2\2\2 #\3")
buf.write("\2\2\2!\37\3\2\2\2!\"\3\2\2\2\"%\3\2\2\2#!\3\2\2\2$&\7")
buf.write("\17\2\2%$\3\2\2\2%&\3\2\2\2&)\3\2\2\2\')\7\17\2\2(\34")
buf.write("\3\2\2\2(\'\3\2\2\2)\5\3\2\2\2*\60\7\4\2\2+\61\5\b\5\2")
buf.write(",-\5\n\6\2-.\5\f\7\2.\61\3\2\2\2/\61\5\n\6\2\60+\3\2\2")
buf.write("\2\60,\3\2\2\2\60/\3\2\2\2\61;\3\2\2\2\62\63\7\5\2\2\63")
buf.write(";\5\16\b\2\64\66\7\6\2\2\65\67\5\16\b\2\66\65\3\2\2\2")
buf.write("\66\67\3\2\2\2\67;\3\2\2\28;\7\7\2\29;\7\b\2\2:*\3\2\2")
buf.write("\2:\62\3\2\2\2:\64\3\2\2\2:8\3\2\2\2:9\3\2\2\2;\7\3\2")
buf.write("\2\2<>\7\t\2\2=?\5\f\7\2>=\3\2\2\2>?\3\2\2\2?F\3\2\2\2")
buf.write("@B\5\22\n\2AC\5\f\7\2BA\3\2\2\2BC\3\2\2\2CE\3\2\2\2D@")
buf.write("\3\2\2\2EH\3\2\2\2FD\3\2\2\2FG\3\2\2\2GI\3\2\2\2HF\3\2")
buf.write("\2\2IJ\7\n\2\2J\t\3\2\2\2KL\7\13\2\2L\13\3\2\2\2MP\5\16")
buf.write("\b\2NP\5\20\t\2OM\3\2\2\2ON\3\2\2\2P\r\3\2\2\2QR\7\f\2")
buf.write("\2R\17\3\2\2\2ST\7\r\2\2T\21\3\2\2\2UV\7\16\2\2V\23\3")
buf.write("\2\2\2\r\27!%(\60\66:>BFO")
return buf.getvalue()
@ -51,13 +51,13 @@ class ArmControlParser ( Parser ):
sharedContextCache = PredictionContextCache()
literalNames = [ "<INVALID>", "';'", "'go'", "'pause'", "'wait'", "'pass'",
"'{'", "'}'", "<INVALID>", "<INVALID>", "<INVALID>",
"','" ]
"'whereami'", "'{'", "'}'", "<INVALID>", "<INVALID>",
"<INVALID>", "','" ]
symbolicNames = [ "<INVALID>", "<INVALID>", "<INVALID>", "<INVALID>",
"<INVALID>", "<INVALID>", "<INVALID>", "<INVALID>",
"NAME", "NUMBER", "HEX", "SEPERATOR", "NEWLINE", "WS",
"COMMENT" ]
"<INVALID>", "NAME", "NUMBER", "HEX", "SEPERATOR",
"NEWLINE", "WS", "COMMENT" ]
RULE_prog = 0
RULE_statement = 1
@ -80,13 +80,14 @@ class ArmControlParser ( Parser ):
T__4=5
T__5=6
T__6=7
NAME=8
NUMBER=9
HEX=10
SEPERATOR=11
NEWLINE=12
WS=13
COMMENT=14
T__7=8
NAME=9
NUMBER=10
HEX=11
SEPERATOR=12
NEWLINE=13
WS=14
COMMENT=15
def __init__(self, input:TokenStream, output:TextIO = sys.stdout):
super().__init__(input, output)
@ -137,7 +138,7 @@ class ArmControlParser ( Parser ):
self.state = 21
self._errHandler.sync(self)
_la = self._input.LA(1)
while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << ArmControlParser.T__1) | (1 << ArmControlParser.T__2) | (1 << ArmControlParser.T__3) | (1 << ArmControlParser.T__4) | (1 << ArmControlParser.NEWLINE))) != 0):
while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << ArmControlParser.T__1) | (1 << ArmControlParser.T__2) | (1 << ArmControlParser.T__3) | (1 << ArmControlParser.T__4) | (1 << ArmControlParser.T__5) | (1 << ArmControlParser.NEWLINE))) != 0):
self.state = 18
self.statement()
self.state = 23
@ -194,7 +195,7 @@ class ArmControlParser ( Parser ):
self.state = 38
self._errHandler.sync(self)
token = self._input.LA(1)
if token in [ArmControlParser.T__1, ArmControlParser.T__2, ArmControlParser.T__3, ArmControlParser.T__4]:
if token in [ArmControlParser.T__1, ArmControlParser.T__2, ArmControlParser.T__3, ArmControlParser.T__4, ArmControlParser.T__5]:
self.enterOuterAlt(localctx, 1)
self.state = 26
self.command()
@ -312,6 +313,22 @@ class ArmControlParser ( Parser ):
listener.exitGo(self)
class WhereAmIContext(CommandContext):
def __init__(self, parser, ctx:ParserRuleContext): # actually a ArmControlParser.CommandContext
super().__init__(parser)
self.copyFrom(ctx)
def enterRule(self, listener:ParseTreeListener):
if hasattr( listener, "enterWhereAmI" ):
listener.enterWhereAmI(self)
def exitRule(self, listener:ParseTreeListener):
if hasattr( listener, "exitWhereAmI" ):
listener.exitWhereAmI(self)
class WaitContext(CommandContext):
def __init__(self, parser, ctx:ParserRuleContext): # actually a ArmControlParser.CommandContext
@ -338,7 +355,7 @@ class ArmControlParser ( Parser ):
self.enterRule(localctx, 4, self.RULE_command)
self._la = 0 # Token type
try:
self.state = 55
self.state = 56
self._errHandler.sync(self)
token = self._input.LA(1)
if token in [ArmControlParser.T__1]:
@ -396,6 +413,12 @@ class ArmControlParser ( Parser ):
self.state = 54
self.match(ArmControlParser.T__4)
pass
elif token in [ArmControlParser.T__5]:
localctx = ArmControlParser.WhereAmIContext(self, localctx)
self.enterOuterAlt(localctx, 5)
self.state = 55
self.match(ArmControlParser.T__5)
pass
else:
raise NoViableAltException(self)
@ -449,36 +472,36 @@ class ArmControlParser ( Parser ):
self._la = 0 # Token type
try:
self.enterOuterAlt(localctx, 1)
self.state = 57
self.match(ArmControlParser.T__5)
self.state = 59
self.state = 58
self.match(ArmControlParser.T__6)
self.state = 60
self._errHandler.sync(self)
_la = self._input.LA(1)
if _la==ArmControlParser.NUMBER or _la==ArmControlParser.HEX:
self.state = 58
self.state = 59
self.value()
self.state = 67
self.state = 68
self._errHandler.sync(self)
_la = self._input.LA(1)
while _la==ArmControlParser.SEPERATOR:
self.state = 61
self.state = 62
self.seperator()
self.state = 63
self.state = 64
self._errHandler.sync(self)
_la = self._input.LA(1)
if _la==ArmControlParser.NUMBER or _la==ArmControlParser.HEX:
self.state = 62
self.state = 63
self.value()
self.state = 69
self.state = 70
self._errHandler.sync(self)
_la = self._input.LA(1)
self.state = 70
self.match(ArmControlParser.T__6)
self.state = 71
self.match(ArmControlParser.T__7)
except RecognitionException as re:
localctx.exception = re
self._errHandler.reportError(self, re)
@ -517,7 +540,7 @@ class ArmControlParser ( Parser ):
self.enterRule(localctx, 8, self.RULE_name)
try:
self.enterOuterAlt(localctx, 1)
self.state = 72
self.state = 73
self.match(ArmControlParser.NAME)
except RecognitionException as re:
localctx.exception = re
@ -561,17 +584,17 @@ class ArmControlParser ( Parser ):
localctx = ArmControlParser.ValueContext(self, self._ctx, self.state)
self.enterRule(localctx, 10, self.RULE_value)
try:
self.state = 76
self.state = 77
self._errHandler.sync(self)
token = self._input.LA(1)
if token in [ArmControlParser.NUMBER]:
self.enterOuterAlt(localctx, 1)
self.state = 74
self.state = 75
self.number()
pass
elif token in [ArmControlParser.HEX]:
self.enterOuterAlt(localctx, 2)
self.state = 75
self.state = 76
self.hexidecimal()
pass
else:
@ -615,7 +638,7 @@ class ArmControlParser ( Parser ):
self.enterRule(localctx, 12, self.RULE_number)
try:
self.enterOuterAlt(localctx, 1)
self.state = 78
self.state = 79
self.match(ArmControlParser.NUMBER)
except RecognitionException as re:
localctx.exception = re
@ -655,7 +678,7 @@ class ArmControlParser ( Parser ):
self.enterRule(localctx, 14, self.RULE_hexidecimal)
try:
self.enterOuterAlt(localctx, 1)
self.state = 80
self.state = 81
self.match(ArmControlParser.HEX)
except RecognitionException as re:
localctx.exception = re
@ -695,7 +718,7 @@ class ArmControlParser ( Parser ):
self.enterRule(localctx, 16, self.RULE_seperator)
try:
self.enterOuterAlt(localctx, 1)
self.state = 82
self.state = 83
self.match(ArmControlParser.SEPERATOR)
except RecognitionException as re:
localctx.exception = re

View File

@ -83,6 +83,10 @@ class ArmCtlListener(ArmControlListener):
if (ctx.number() is not None):
sleep(ctx.number().value)
# Exit a parse tree produced by ArmControlParser#WhereAmI.
def exitWhereAmI(self, ctx: ArmControlParser.WhereAmIContext):
print(self.r.target)
# Enter a parse tree produced by ArmControlParser#coords.
def enterCoords(self, ctx: ArmControlParser.CoordsContext):
ctx.values = self.r.target

View File

@ -90,6 +90,8 @@ Wait for the arm to stop moving.
If time is given, pause for that amount of time after movement has completed. If time is omitted, do the next command immediately after movement stops.
#### pass
Do nothing.
#### wherami
Print out the current coordinates of the arm.
### Shell Commands
#### exit