Loading demo.py +1 −1 Original line number Original line Diff line number Diff line Loading @@ -346,7 +346,7 @@ def main(): grammar_test("S'->a|aA''|\e;A''->a|bS'|<ab_0>''") grammar_test("S'->a|aA''|\e;A''->a|bS'|<ab_0>''") grammar_test("S->a;\nS->aA;\nS->\e;\nA->a;\nA->bS;\n") grammar_test("S->a;\nS->aA;\nS->\e;\nA->a;\nA->bS;\n") words = dfa_eq("init=1 (1, a)=2 (2,a)=2 (1,b)=3 final={2,3} $comment#", words = dfa_eq("init=1 (1, a)=2 (2,a)=2 (1,b)=3 final={2,3} #c", "init=A (A, a)=B (A,b)=C (C,b)=C final={B,C}") "init=A (A, a)=B (A,b)=C (C,b)=C final={B,C}") print(words.right_counterexample, words.left_counterexample, words.inf) print(words.right_counterexample, words.left_counterexample, words.inf) print() print() Loading evalweb/web_checker.py +5 −3 Original line number Original line Diff line number Diff line Loading @@ -115,7 +115,8 @@ class WebChecker: task=self.task, student_string=self.student_string) task=self.task, student_string=self.student_string) except ParsingError as ex: except ParsingError as ex: raise ParsingError(ex.args) return ex.args #raise ParsingError(ex.args) def convert(self, student_type): def convert(self, student_type): Loading Loading @@ -143,7 +144,8 @@ class WebChecker: return parser.reggrammar_to_str(nfa.nfa_to_reggrammar().eliminate_useless()) return parser.reggrammar_to_str(nfa.nfa_to_reggrammar().eliminate_useless()) except ParsingError as ex: except ParsingError as ex: raise ParsingError(ex.args) return ex.args # raise ParsingError(ex.args) except Exception as ex: except Exception as ex: print("Error inside of web checker:", ex.args) print("Error inside of web checker:", ex.args) Loading lib/parsing/CFG.g4 +5 −2 Original line number Original line Diff line number Diff line Loading @@ -8,7 +8,9 @@ onerule: nonterminal ARROW (rewrite DELIMITER)* rewrite; rewrite: (term_or_nonterm+ | EPSILON); rewrite: (term_or_nonterm+ | EPSILON); term_or_nonterm: (TERMINAL | nonterminal); term_or_nonterm: (terminal | nonterminal); terminal: (TERMINAL | QUOTE anyvalue+ QUOTE); nonterminal: (CAPS | (LEFT_ANGLE symbol+ RIGHT_ANGLE (APOSTROPHE*)) | (symbol APOSTROPHE+)); nonterminal: (CAPS | (LEFT_ANGLE symbol+ RIGHT_ANGLE (APOSTROPHE*)) | (symbol APOSTROPHE+)); Loading @@ -16,7 +18,7 @@ symbol: (TERMINAL | CAPS | UNDERSCORE); comment: (HASH anyvalue* | ); comment: (HASH anyvalue* | ); anyvalue: LEFT_ANGLE | RIGHT_ANGLE | APOSTROPHE | UNDERSCORE | TERMINAL | CAPS | ARROW | EPSILON | DELIMITER | NEWLINE| ANYCHAR; anyvalue: LEFT_ANGLE | RIGHT_ANGLE | APOSTROPHE | UNDERSCORE | TERMINAL | CAPS | ARROW | EPSILON | DELIMITER | NEWLINE| ANYCHAR | HASH; /* Lexer Rules */ /* Lexer Rules */ Loading @@ -33,6 +35,7 @@ EPSILON : ('ε' | '\\''e'); DELIMITER : '|'; DELIMITER : '|'; NEWLINE : ('\n' | ';' | ','); NEWLINE : ('\n' | ';' | ','); HASH : '#'; HASH : '#'; QUOTE : '"'; /* Characters to be ignored */ /* Characters to be ignored */ WS : [ \r\t]+ -> skip ; WS : [ \r\t]+ -> skip ; Loading lib/parsing/CFGLexer.py +30 −28 Original line number Original line Diff line number Diff line Loading @@ -8,30 +8,31 @@ import sys def serializedATN(): def serializedATN(): with StringIO() as buf: with StringIO() as buf: buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\17") buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\20") buf.write("B\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("F\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("\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\3\2\3\2\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\7\3\7") buf.write("\t\16\4\17\t\17\3\2\3\2\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3") buf.write("\3\b\3\b\3\b\5\b-\n\b\3\t\3\t\3\t\5\t\62\n\t\3\n\3\n\3") buf.write("\6\3\7\3\7\3\b\3\b\3\b\5\b/\n\b\3\t\3\t\3\t\5\t\64\n\t") buf.write("\13\3\13\3\f\3\f\3\r\6\r;\n\r\r\r\16\r<\3\r\3\r\3\16\3") buf.write("\3\n\3\n\3\13\3\13\3\f\3\f\3\r\3\r\3\16\6\16?\n\16\r\16") buf.write("\16\2\2\17\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25") buf.write("\16\16@\3\16\3\16\3\17\3\17\2\2\20\3\3\5\4\7\5\t\6\13") buf.write("\f\27\r\31\16\33\17\3\2\6\4\2\62;c|\3\2C\\\5\2\f\f..=") buf.write("\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20\3\2") buf.write("=\5\2\13\13\17\17\"\"\2D\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3") buf.write("\6\4\2\62;c|\3\2C\\\5\2\f\f..==\5\2\13\13\17\17\"\"\2") buf.write("\2\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") buf.write("H\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13") buf.write("\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2") buf.write("\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3") buf.write("\2\31\3\2\2\2\2\33\3\2\2\2\3\35\3\2\2\2\5\37\3\2\2\2\7") buf.write("\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2") buf.write("!\3\2\2\2\t#\3\2\2\2\13%\3\2\2\2\r\'\3\2\2\2\17,\3\2\2") buf.write("\2\2\2\35\3\2\2\2\3\37\3\2\2\2\5!\3\2\2\2\7#\3\2\2\2\t") buf.write("\2\21\61\3\2\2\2\23\63\3\2\2\2\25\65\3\2\2\2\27\67\3\2") buf.write("%\3\2\2\2\13\'\3\2\2\2\r)\3\2\2\2\17.\3\2\2\2\21\63\3") buf.write("\2\2\31:\3\2\2\2\33@\3\2\2\2\35\36\7>\2\2\36\4\3\2\2\2") buf.write("\2\2\2\23\65\3\2\2\2\25\67\3\2\2\2\279\3\2\2\2\31;\3\2") buf.write("\37 \7@\2\2 \6\3\2\2\2!\"\7)\2\2\"\b\3\2\2\2#$\7a\2\2") buf.write("\2\2\33>\3\2\2\2\35D\3\2\2\2\37 \7>\2\2 \4\3\2\2\2!\"") buf.write("$\n\3\2\2\2%&\t\2\2\2&\f\3\2\2\2\'(\t\3\2\2(\16\3\2\2") buf.write("\7@\2\2\"\6\3\2\2\2#$\7)\2\2$\b\3\2\2\2%&\7a\2\2&\n\3") buf.write("\2)-\7\u2194\2\2*+\7/\2\2+-\7@\2\2,)\3\2\2\2,*\3\2\2\2") buf.write("\2\2\2\'(\t\2\2\2(\f\3\2\2\2)*\t\3\2\2*\16\3\2\2\2+/\7") buf.write("-\20\3\2\2\2.\62\7\u03b7\2\2/\60\7^\2\2\60\62\7g\2\2\61") buf.write("\u2194\2\2,-\7/\2\2-/\7@\2\2.+\3\2\2\2.,\3\2\2\2/\20\3") buf.write(".\3\2\2\2\61/\3\2\2\2\62\22\3\2\2\2\63\64\7~\2\2\64\24") buf.write("\2\2\2\60\64\7\u03b7\2\2\61\62\7^\2\2\62\64\7g\2\2\63") buf.write("\3\2\2\2\65\66\t\4\2\2\66\26\3\2\2\2\678\7%\2\28\30\3") buf.write("\60\3\2\2\2\63\61\3\2\2\2\64\22\3\2\2\2\65\66\7~\2\2\66") buf.write("\2\2\29;\t\5\2\2:9\3\2\2\2;<\3\2\2\2<:\3\2\2\2<=\3\2\2") buf.write("\24\3\2\2\2\678\t\4\2\28\26\3\2\2\29:\7%\2\2:\30\3\2\2") buf.write("\2=>\3\2\2\2>?\b\r\2\2?\32\3\2\2\2@A\13\2\2\2A\34\3\2") buf.write("\2;<\7$\2\2<\32\3\2\2\2=?\t\5\2\2>=\3\2\2\2?@\3\2\2\2") buf.write("\2\2\6\2,\61<\3\b\2\2") buf.write("@>\3\2\2\2@A\3\2\2\2AB\3\2\2\2BC\b\16\2\2C\34\3\2\2\2") buf.write("DE\13\2\2\2E\36\3\2\2\2\6\2.\63@\3\b\2\2") return buf.getvalue() return buf.getvalue() Loading @@ -52,24 +53,25 @@ class CFGLexer(Lexer): DELIMITER = 9 DELIMITER = 9 NEWLINE = 10 NEWLINE = 10 HASH = 11 HASH = 11 WS = 12 QUOTE = 12 ANYCHAR = 13 WS = 13 ANYCHAR = 14 channelNames = [ u"DEFAULT_TOKEN_CHANNEL", u"HIDDEN" ] channelNames = [ u"DEFAULT_TOKEN_CHANNEL", u"HIDDEN" ] modeNames = [ "DEFAULT_MODE" ] modeNames = [ "DEFAULT_MODE" ] literalNames = [ "<INVALID>", literalNames = [ "<INVALID>", "'<'", "'>'", "'''", "'_'", "'|'", "'#'" ] "'<'", "'>'", "'''", "'_'", "'|'", "'#'", "'\"'" ] symbolicNames = [ "<INVALID>", symbolicNames = [ "<INVALID>", "LEFT_ANGLE", "RIGHT_ANGLE", "APOSTROPHE", "UNDERSCORE", "TERMINAL", "LEFT_ANGLE", "RIGHT_ANGLE", "APOSTROPHE", "UNDERSCORE", "TERMINAL", "CAPS", "ARROW", "EPSILON", "DELIMITER", "NEWLINE", "HASH", "CAPS", "ARROW", "EPSILON", "DELIMITER", "NEWLINE", "HASH", "WS", "ANYCHAR" ] "QUOTE", "WS", "ANYCHAR" ] ruleNames = [ "LEFT_ANGLE", "RIGHT_ANGLE", "APOSTROPHE", "UNDERSCORE", ruleNames = [ "LEFT_ANGLE", "RIGHT_ANGLE", "APOSTROPHE", "UNDERSCORE", "TERMINAL", "CAPS", "ARROW", "EPSILON", "DELIMITER", "NEWLINE", "TERMINAL", "CAPS", "ARROW", "EPSILON", "DELIMITER", "NEWLINE", "HASH", "WS", "ANYCHAR" ] "HASH", "QUOTE", "WS", "ANYCHAR" ] grammarFileName = "CFG.g4" grammarFileName = "CFG.g4" Loading lib/parsing/CFGListener.py +9 −0 Original line number Original line Diff line number Diff line Loading @@ -44,6 +44,15 @@ class CFGListener(ParseTreeListener): pass pass # Enter a parse tree produced by CFGParser#terminal. def enterTerminal(self, ctx:CFGParser.TerminalContext): pass # Exit a parse tree produced by CFGParser#terminal. def exitTerminal(self, ctx:CFGParser.TerminalContext): pass # Enter a parse tree produced by CFGParser#nonterminal. # Enter a parse tree produced by CFGParser#nonterminal. def enterNonterminal(self, ctx:CFGParser.NonterminalContext): def enterNonterminal(self, ctx:CFGParser.NonterminalContext): pass pass Loading Loading
demo.py +1 −1 Original line number Original line Diff line number Diff line Loading @@ -346,7 +346,7 @@ def main(): grammar_test("S'->a|aA''|\e;A''->a|bS'|<ab_0>''") grammar_test("S'->a|aA''|\e;A''->a|bS'|<ab_0>''") grammar_test("S->a;\nS->aA;\nS->\e;\nA->a;\nA->bS;\n") grammar_test("S->a;\nS->aA;\nS->\e;\nA->a;\nA->bS;\n") words = dfa_eq("init=1 (1, a)=2 (2,a)=2 (1,b)=3 final={2,3} $comment#", words = dfa_eq("init=1 (1, a)=2 (2,a)=2 (1,b)=3 final={2,3} #c", "init=A (A, a)=B (A,b)=C (C,b)=C final={B,C}") "init=A (A, a)=B (A,b)=C (C,b)=C final={B,C}") print(words.right_counterexample, words.left_counterexample, words.inf) print(words.right_counterexample, words.left_counterexample, words.inf) print() print() Loading
evalweb/web_checker.py +5 −3 Original line number Original line Diff line number Diff line Loading @@ -115,7 +115,8 @@ class WebChecker: task=self.task, student_string=self.student_string) task=self.task, student_string=self.student_string) except ParsingError as ex: except ParsingError as ex: raise ParsingError(ex.args) return ex.args #raise ParsingError(ex.args) def convert(self, student_type): def convert(self, student_type): Loading Loading @@ -143,7 +144,8 @@ class WebChecker: return parser.reggrammar_to_str(nfa.nfa_to_reggrammar().eliminate_useless()) return parser.reggrammar_to_str(nfa.nfa_to_reggrammar().eliminate_useless()) except ParsingError as ex: except ParsingError as ex: raise ParsingError(ex.args) return ex.args # raise ParsingError(ex.args) except Exception as ex: except Exception as ex: print("Error inside of web checker:", ex.args) print("Error inside of web checker:", ex.args) Loading
lib/parsing/CFG.g4 +5 −2 Original line number Original line Diff line number Diff line Loading @@ -8,7 +8,9 @@ onerule: nonterminal ARROW (rewrite DELIMITER)* rewrite; rewrite: (term_or_nonterm+ | EPSILON); rewrite: (term_or_nonterm+ | EPSILON); term_or_nonterm: (TERMINAL | nonterminal); term_or_nonterm: (terminal | nonterminal); terminal: (TERMINAL | QUOTE anyvalue+ QUOTE); nonterminal: (CAPS | (LEFT_ANGLE symbol+ RIGHT_ANGLE (APOSTROPHE*)) | (symbol APOSTROPHE+)); nonterminal: (CAPS | (LEFT_ANGLE symbol+ RIGHT_ANGLE (APOSTROPHE*)) | (symbol APOSTROPHE+)); Loading @@ -16,7 +18,7 @@ symbol: (TERMINAL | CAPS | UNDERSCORE); comment: (HASH anyvalue* | ); comment: (HASH anyvalue* | ); anyvalue: LEFT_ANGLE | RIGHT_ANGLE | APOSTROPHE | UNDERSCORE | TERMINAL | CAPS | ARROW | EPSILON | DELIMITER | NEWLINE| ANYCHAR; anyvalue: LEFT_ANGLE | RIGHT_ANGLE | APOSTROPHE | UNDERSCORE | TERMINAL | CAPS | ARROW | EPSILON | DELIMITER | NEWLINE| ANYCHAR | HASH; /* Lexer Rules */ /* Lexer Rules */ Loading @@ -33,6 +35,7 @@ EPSILON : ('ε' | '\\''e'); DELIMITER : '|'; DELIMITER : '|'; NEWLINE : ('\n' | ';' | ','); NEWLINE : ('\n' | ';' | ','); HASH : '#'; HASH : '#'; QUOTE : '"'; /* Characters to be ignored */ /* Characters to be ignored */ WS : [ \r\t]+ -> skip ; WS : [ \r\t]+ -> skip ; Loading
lib/parsing/CFGLexer.py +30 −28 Original line number Original line Diff line number Diff line Loading @@ -8,30 +8,31 @@ import sys def serializedATN(): def serializedATN(): with StringIO() as buf: with StringIO() as buf: buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\17") buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\20") buf.write("B\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("F\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("\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\3\2\3\2\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\7\3\7") buf.write("\t\16\4\17\t\17\3\2\3\2\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3") buf.write("\3\b\3\b\3\b\5\b-\n\b\3\t\3\t\3\t\5\t\62\n\t\3\n\3\n\3") buf.write("\6\3\7\3\7\3\b\3\b\3\b\5\b/\n\b\3\t\3\t\3\t\5\t\64\n\t") buf.write("\13\3\13\3\f\3\f\3\r\6\r;\n\r\r\r\16\r<\3\r\3\r\3\16\3") buf.write("\3\n\3\n\3\13\3\13\3\f\3\f\3\r\3\r\3\16\6\16?\n\16\r\16") buf.write("\16\2\2\17\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25") buf.write("\16\16@\3\16\3\16\3\17\3\17\2\2\20\3\3\5\4\7\5\t\6\13") buf.write("\f\27\r\31\16\33\17\3\2\6\4\2\62;c|\3\2C\\\5\2\f\f..=") buf.write("\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20\3\2") buf.write("=\5\2\13\13\17\17\"\"\2D\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3") buf.write("\6\4\2\62;c|\3\2C\\\5\2\f\f..==\5\2\13\13\17\17\"\"\2") buf.write("\2\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") buf.write("H\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13") buf.write("\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2") buf.write("\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3") buf.write("\2\31\3\2\2\2\2\33\3\2\2\2\3\35\3\2\2\2\5\37\3\2\2\2\7") buf.write("\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2") buf.write("!\3\2\2\2\t#\3\2\2\2\13%\3\2\2\2\r\'\3\2\2\2\17,\3\2\2") buf.write("\2\2\2\35\3\2\2\2\3\37\3\2\2\2\5!\3\2\2\2\7#\3\2\2\2\t") buf.write("\2\21\61\3\2\2\2\23\63\3\2\2\2\25\65\3\2\2\2\27\67\3\2") buf.write("%\3\2\2\2\13\'\3\2\2\2\r)\3\2\2\2\17.\3\2\2\2\21\63\3") buf.write("\2\2\31:\3\2\2\2\33@\3\2\2\2\35\36\7>\2\2\36\4\3\2\2\2") buf.write("\2\2\2\23\65\3\2\2\2\25\67\3\2\2\2\279\3\2\2\2\31;\3\2") buf.write("\37 \7@\2\2 \6\3\2\2\2!\"\7)\2\2\"\b\3\2\2\2#$\7a\2\2") buf.write("\2\2\33>\3\2\2\2\35D\3\2\2\2\37 \7>\2\2 \4\3\2\2\2!\"") buf.write("$\n\3\2\2\2%&\t\2\2\2&\f\3\2\2\2\'(\t\3\2\2(\16\3\2\2") buf.write("\7@\2\2\"\6\3\2\2\2#$\7)\2\2$\b\3\2\2\2%&\7a\2\2&\n\3") buf.write("\2)-\7\u2194\2\2*+\7/\2\2+-\7@\2\2,)\3\2\2\2,*\3\2\2\2") buf.write("\2\2\2\'(\t\2\2\2(\f\3\2\2\2)*\t\3\2\2*\16\3\2\2\2+/\7") buf.write("-\20\3\2\2\2.\62\7\u03b7\2\2/\60\7^\2\2\60\62\7g\2\2\61") buf.write("\u2194\2\2,-\7/\2\2-/\7@\2\2.+\3\2\2\2.,\3\2\2\2/\20\3") buf.write(".\3\2\2\2\61/\3\2\2\2\62\22\3\2\2\2\63\64\7~\2\2\64\24") buf.write("\2\2\2\60\64\7\u03b7\2\2\61\62\7^\2\2\62\64\7g\2\2\63") buf.write("\3\2\2\2\65\66\t\4\2\2\66\26\3\2\2\2\678\7%\2\28\30\3") buf.write("\60\3\2\2\2\63\61\3\2\2\2\64\22\3\2\2\2\65\66\7~\2\2\66") buf.write("\2\2\29;\t\5\2\2:9\3\2\2\2;<\3\2\2\2<:\3\2\2\2<=\3\2\2") buf.write("\24\3\2\2\2\678\t\4\2\28\26\3\2\2\29:\7%\2\2:\30\3\2\2") buf.write("\2=>\3\2\2\2>?\b\r\2\2?\32\3\2\2\2@A\13\2\2\2A\34\3\2") buf.write("\2;<\7$\2\2<\32\3\2\2\2=?\t\5\2\2>=\3\2\2\2?@\3\2\2\2") buf.write("\2\2\6\2,\61<\3\b\2\2") buf.write("@>\3\2\2\2@A\3\2\2\2AB\3\2\2\2BC\b\16\2\2C\34\3\2\2\2") buf.write("DE\13\2\2\2E\36\3\2\2\2\6\2.\63@\3\b\2\2") return buf.getvalue() return buf.getvalue() Loading @@ -52,24 +53,25 @@ class CFGLexer(Lexer): DELIMITER = 9 DELIMITER = 9 NEWLINE = 10 NEWLINE = 10 HASH = 11 HASH = 11 WS = 12 QUOTE = 12 ANYCHAR = 13 WS = 13 ANYCHAR = 14 channelNames = [ u"DEFAULT_TOKEN_CHANNEL", u"HIDDEN" ] channelNames = [ u"DEFAULT_TOKEN_CHANNEL", u"HIDDEN" ] modeNames = [ "DEFAULT_MODE" ] modeNames = [ "DEFAULT_MODE" ] literalNames = [ "<INVALID>", literalNames = [ "<INVALID>", "'<'", "'>'", "'''", "'_'", "'|'", "'#'" ] "'<'", "'>'", "'''", "'_'", "'|'", "'#'", "'\"'" ] symbolicNames = [ "<INVALID>", symbolicNames = [ "<INVALID>", "LEFT_ANGLE", "RIGHT_ANGLE", "APOSTROPHE", "UNDERSCORE", "TERMINAL", "LEFT_ANGLE", "RIGHT_ANGLE", "APOSTROPHE", "UNDERSCORE", "TERMINAL", "CAPS", "ARROW", "EPSILON", "DELIMITER", "NEWLINE", "HASH", "CAPS", "ARROW", "EPSILON", "DELIMITER", "NEWLINE", "HASH", "WS", "ANYCHAR" ] "QUOTE", "WS", "ANYCHAR" ] ruleNames = [ "LEFT_ANGLE", "RIGHT_ANGLE", "APOSTROPHE", "UNDERSCORE", ruleNames = [ "LEFT_ANGLE", "RIGHT_ANGLE", "APOSTROPHE", "UNDERSCORE", "TERMINAL", "CAPS", "ARROW", "EPSILON", "DELIMITER", "NEWLINE", "TERMINAL", "CAPS", "ARROW", "EPSILON", "DELIMITER", "NEWLINE", "HASH", "WS", "ANYCHAR" ] "HASH", "QUOTE", "WS", "ANYCHAR" ] grammarFileName = "CFG.g4" grammarFileName = "CFG.g4" Loading
lib/parsing/CFGListener.py +9 −0 Original line number Original line Diff line number Diff line Loading @@ -44,6 +44,15 @@ class CFGListener(ParseTreeListener): pass pass # Enter a parse tree produced by CFGParser#terminal. def enterTerminal(self, ctx:CFGParser.TerminalContext): pass # Exit a parse tree produced by CFGParser#terminal. def exitTerminal(self, ctx:CFGParser.TerminalContext): pass # Enter a parse tree produced by CFGParser#nonterminal. # Enter a parse tree produced by CFGParser#nonterminal. def enterNonterminal(self, ctx:CFGParser.NonterminalContext): def enterNonterminal(self, ctx:CFGParser.NonterminalContext): pass pass Loading