forked from jasder/antlr
TestParserErrors passes now.
Fixed a bug in the Cpp.stg file where more input was consumed than should be.
This commit is contained in:
parent
08f844af0e
commit
814a1821be
|
@ -224,13 +224,13 @@ ToStringTree(s) ::= <%<s>->toStringTree(this)%>
|
|||
|
||||
Column() ::= "column"
|
||||
|
||||
Text() ::= "text"
|
||||
Text() ::= "getText()"
|
||||
|
||||
ValEquals(a,b) ::= <%<a> == <b>%>
|
||||
|
||||
TextEquals(a) ::= <%text == "<a>"%>
|
||||
TextEquals(a) ::= <%getText() == "<a>"%>
|
||||
|
||||
PlusText(a) ::= <%"<a>" + text%>
|
||||
PlusText(a) ::= <%"<a>" + getText()%>
|
||||
|
||||
InputText() ::= "_input->getText()"
|
||||
|
||||
|
@ -242,7 +242,7 @@ TokenStartColumnEquals(i) ::= <%_tokenStartColumn == <i>%>
|
|||
|
||||
ImportListener(X) ::= ""
|
||||
|
||||
GetExpectedTokenNames() ::= "getExpectedTokens()->toString(literalNames, symbolicNames)"
|
||||
GetExpectedTokenNames() ::= "getExpectedTokens().toString(_tokenNames)"
|
||||
|
||||
RuleInvocationStack() ::= "str_list(getRuleInvocationStack())"
|
||||
|
||||
|
@ -258,70 +258,96 @@ bool Parser::Property() {
|
|||
>>
|
||||
|
||||
PositionAdjustingLexer() ::= <<
|
||||
protected:
|
||||
class PositionAdjustingLexerATNSimulator : public atn::LexerATNSimulator {
|
||||
public:
|
||||
PositionAdjustingLexerATNSimulator(Lexer *recog, const atn::ATN &atn, std::vector\<dfa::DFA> &decisionToDFA,
|
||||
Ref\<atn::PredictionContextCache> sharedContextCache)
|
||||
: atn::LexerATNSimulator(recog, atn, decisionToDFA, sharedContextCache) {
|
||||
}
|
||||
|
||||
def resetAcceptPosition(self, index, line, column):
|
||||
_input->seek(index)
|
||||
this->line = line
|
||||
this->column = column
|
||||
_interp.consume(_input)
|
||||
void resetAcceptPosition(CharStream *input, int index, int line, int charPositionInLine) {
|
||||
input->seek(index);
|
||||
_line = line;
|
||||
_charPositionInLine = charPositionInLine;
|
||||
consume(input);
|
||||
}
|
||||
|
||||
def nextToken(self):
|
||||
if _interp.__dict__.get("resetAcceptPosition", None) is None:
|
||||
_interp.__dict__["resetAcceptPosition"] = resetAcceptPosition
|
||||
return super(type(self),self).nextToken()
|
||||
};
|
||||
|
||||
def emit(self):
|
||||
if _type==PositionAdjustingLexer.TOKENS:
|
||||
handleAcceptPositionForKeyword("tokens")
|
||||
elif _type==PositionAdjustingLexer.LABEL:
|
||||
handleAcceptPositionForIdentifier()
|
||||
return super(type(self),self).emit()
|
||||
public:
|
||||
virtual Ref\<Token> nextToken() override {
|
||||
if (dynamic_cast\<PositionAdjustingLexerATNSimulator *>(_interpreter) == nullptr) {
|
||||
delete _interpreter;
|
||||
_interpreter = new PositionAdjustingLexerATNSimulator(this, _atn, _decisionToDFA, _sharedContextCache);
|
||||
}
|
||||
|
||||
def handleAcceptPositionForIdentifier(self):
|
||||
tokenText = text
|
||||
identifierLength = 0
|
||||
while identifierLength \< len(tokenText) and isIdentifierChar(tokenText[identifierLength]):
|
||||
identifierLength += 1
|
||||
return Lexer::nextToken();
|
||||
}
|
||||
|
||||
if _input->index > _tokenStartCharIndex + identifierLength:
|
||||
offset = identifierLength - 1
|
||||
_interp.resetAcceptPosition(_tokenStartCharIndex + offset,
|
||||
_tokenStartLine, _tokenStartColumn + offset)
|
||||
return true
|
||||
else:
|
||||
return false
|
||||
virtual Ref\<Token> emit() override {
|
||||
switch (type) {
|
||||
case TOKENS:
|
||||
handleAcceptPositionForKeyword("tokens");
|
||||
break;
|
||||
|
||||
case LABEL:
|
||||
handleAcceptPositionForIdentifier();
|
||||
break;
|
||||
|
||||
def handleAcceptPositionForKeyword(self, keyword):
|
||||
if _input->index > _tokenStartCharIndex + len(keyword):
|
||||
offset = len(keyword) - 1
|
||||
_interp.resetAcceptPosition(_tokenStartCharIndex + offset,
|
||||
_tokenStartLine, _tokenStartColumn + offset)
|
||||
return true
|
||||
else:
|
||||
return false
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return Lexer::emit();
|
||||
}
|
||||
|
||||
@staticmethod
|
||||
def isIdentifierChar(c):
|
||||
return c.isalnum() or c == '_'
|
||||
private:
|
||||
bool handleAcceptPositionForIdentifier() {
|
||||
std::string tokenText = getText();
|
||||
int identifierLength = 0;
|
||||
while (identifierLength \< tokenText.length() && isIdentifierChar(tokenText[identifierLength])) {
|
||||
identifierLength++;
|
||||
}
|
||||
|
||||
if (getInputStream()->index() > tokenStartCharIndex + identifierLength) {
|
||||
int offset = identifierLength - 1;
|
||||
getInterpreter\<PositionAdjustingLexerATNSimulator>()->resetAcceptPosition(getInputStream(),
|
||||
tokenStartCharIndex + offset, tokenStartLine, tokenStartCharPositionInLine + offset);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool handleAcceptPositionForKeyword(const std::string &keyword) {
|
||||
if (getInputStream()->index() > tokenStartCharIndex + keyword.length()) {
|
||||
long offset = keyword.size() - 1;
|
||||
getInterpreter\<PositionAdjustingLexerATNSimulator>()->resetAcceptPosition(getInputStream(),
|
||||
tokenStartCharIndex + offset, tokenStartLine, tokenStartCharPositionInLine + offset);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool isIdentifierChar(char c) {
|
||||
return std::isalnum(c) || c == '_';
|
||||
}
|
||||
|
||||
public:
|
||||
>>
|
||||
|
||||
BasicListener(X) ::= <<
|
||||
if __name__ is not None and "." in __name__:
|
||||
from .<X>Listener import <X>Listener
|
||||
else:
|
||||
from <X>Listener import <X>Listener
|
||||
|
||||
class LeafListener(TListener):
|
||||
def visitTerminal(self, node):
|
||||
std::cout \<\< node.symbol.text;
|
||||
|
||||
class LeafListener : public TBaseListener {
|
||||
public:
|
||||
virtual void visitTerminal(Ref\<tree::TerminalNode> node) override {
|
||||
std::cout \<\< node->getSymbol()->getText() \<\< std::endl;
|
||||
}
|
||||
};
|
||||
>>
|
||||
|
||||
WalkListener(s) ::= <<
|
||||
walker = ParseTreeWalker()
|
||||
walker.walk(TParser.LeafListener(), <s>)
|
||||
tree::ParseTreeWalker::DEFAULT->walk(std::make_shared\<LeafListener>(), <s>);
|
||||
>>
|
||||
|
||||
TreeNodeWithAltNumField(X) ::= <<
|
||||
|
@ -400,10 +426,11 @@ class LeafListener(TListener):
|
|||
>>
|
||||
|
||||
DeclareContextListGettersFunction() ::= <<
|
||||
def foo():
|
||||
s = SContext()
|
||||
a = s.a()
|
||||
b = s.b()
|
||||
void foo() {
|
||||
Ref\<SContext> s;
|
||||
std::vector\<Ref\<AContext\>> a = s->a();
|
||||
std::vector\<Ref\<BContext\>> b = s->b();
|
||||
}
|
||||
>>
|
||||
|
||||
Declare_foo() ::= <<void foo() {
|
||||
|
|
|
@ -13,9 +13,9 @@ public class TestParserErrors extends BaseCppTest {
|
|||
public void testConjuringUpToken() throws Exception {
|
||||
mkdir(tmpdir);
|
||||
|
||||
StringBuilder grammarBuilder = new StringBuilder(76);
|
||||
StringBuilder grammarBuilder = new StringBuilder(88);
|
||||
grammarBuilder.append("grammar T;\n");
|
||||
grammarBuilder.append("a : 'a' x='b' {std::cout << \"conjured=\" + str($x) << \"\\n\";} 'c' ;");
|
||||
grammarBuilder.append("a : 'a' x='b' {std::cout << \"conjured=\" + $x->toString() << std::endl;} 'c' ;");
|
||||
String grammar = grammarBuilder.toString();
|
||||
|
||||
|
||||
|
@ -33,9 +33,9 @@ public class TestParserErrors extends BaseCppTest {
|
|||
public void testConjuringUpTokenFromSet() throws Exception {
|
||||
mkdir(tmpdir);
|
||||
|
||||
StringBuilder grammarBuilder = new StringBuilder(82);
|
||||
StringBuilder grammarBuilder = new StringBuilder(94);
|
||||
grammarBuilder.append("grammar T;\n");
|
||||
grammarBuilder.append("a : 'a' x=('b'|'c') {std::cout << \"conjured=\" + str($x) << \"\\n\";} 'd' ;");
|
||||
grammarBuilder.append("a : 'a' x=('b'|'c') {std::cout << \"conjured=\" + $x->toString() << std::endl;} 'd' ;");
|
||||
String grammar = grammarBuilder.toString();
|
||||
|
||||
|
||||
|
@ -53,13 +53,14 @@ public class TestParserErrors extends BaseCppTest {
|
|||
public void testContextListGetters() throws Exception {
|
||||
mkdir(tmpdir);
|
||||
|
||||
StringBuilder grammarBuilder = new StringBuilder(160);
|
||||
StringBuilder grammarBuilder = new StringBuilder(218);
|
||||
grammarBuilder.append("grammar T;\n");
|
||||
grammarBuilder.append("@parser::members{\n");
|
||||
grammarBuilder.append("def foo():\n");
|
||||
grammarBuilder.append(" s = SContext()\n");
|
||||
grammarBuilder.append(" a = s.a()\n");
|
||||
grammarBuilder.append(" b = s.b()\n");
|
||||
grammarBuilder.append("void foo() {\n");
|
||||
grammarBuilder.append(" Ref<SContext> s;\n");
|
||||
grammarBuilder.append(" std::vector<Ref<AContext>> a = s->a();\n");
|
||||
grammarBuilder.append(" std::vector<Ref<BContext>> b = s->b();\n");
|
||||
grammarBuilder.append("}\n");
|
||||
grammarBuilder.append("}\n");
|
||||
grammarBuilder.append("s : (a | b)+;\n");
|
||||
grammarBuilder.append("a : 'a' {std::cout << 'a';};\n");
|
||||
|
@ -211,7 +212,7 @@ public class TestParserErrors extends BaseCppTest {
|
|||
public void testLL1ErrorInfo() throws Exception {
|
||||
mkdir(tmpdir);
|
||||
|
||||
StringBuilder grammarBuilder = new StringBuilder(314);
|
||||
StringBuilder grammarBuilder = new StringBuilder(303);
|
||||
grammarBuilder.append("grammar T;\n");
|
||||
grammarBuilder.append("start : animal (AND acClass)? service EOF;\n");
|
||||
grammarBuilder.append("animal : (DOG | CAT );\n");
|
||||
|
@ -224,7 +225,7 @@ public class TestParserErrors extends BaseCppTest {
|
|||
grammarBuilder.append("WS : ' ' -> skip ;\n");
|
||||
grammarBuilder.append("acClass\n");
|
||||
grammarBuilder.append("@init\n");
|
||||
grammarBuilder.append("{std::cout << getExpectedTokens().toString(literalNames, symbolicNames) << \"\\n\";}\n");
|
||||
grammarBuilder.append("{std::cout << getExpectedTokens().toString(_tokenNames) << std::endl;}\n");
|
||||
grammarBuilder.append(" : ;");
|
||||
String grammar = grammarBuilder.toString();
|
||||
|
||||
|
@ -440,10 +441,10 @@ public class TestParserErrors extends BaseCppTest {
|
|||
public void testSingleSetInsertionConsumption() throws Exception {
|
||||
mkdir(tmpdir);
|
||||
|
||||
StringBuilder grammarBuilder = new StringBuilder(95);
|
||||
StringBuilder grammarBuilder = new StringBuilder(107);
|
||||
grammarBuilder.append("grammar T;\n");
|
||||
grammarBuilder.append("myset: ('b'|'c') ;\n");
|
||||
grammarBuilder.append("a: 'a' myset 'd' {std::cout << \"\" + str($myset.stop) << \"\\n\";} ; ");
|
||||
grammarBuilder.append("a: 'a' myset 'd' {std::cout << \"\" + $myset.stop->toString() << std::endl;} ; ");
|
||||
String grammar = grammarBuilder.toString();
|
||||
|
||||
|
||||
|
@ -571,10 +572,10 @@ public class TestParserErrors extends BaseCppTest {
|
|||
public void testSingleTokenDeletionConsumption() throws Exception {
|
||||
mkdir(tmpdir);
|
||||
|
||||
StringBuilder grammarBuilder = new StringBuilder(95);
|
||||
StringBuilder grammarBuilder = new StringBuilder(107);
|
||||
grammarBuilder.append("grammar T;\n");
|
||||
grammarBuilder.append("myset: ('b'|'c') ;\n");
|
||||
grammarBuilder.append("a: 'a' myset 'd' {std::cout << \"\" + str($myset.stop) << \"\\n\";} ; ");
|
||||
grammarBuilder.append("a: 'a' myset 'd' {std::cout << \"\" + $myset.stop->toString() << std::endl;} ; ");
|
||||
String grammar = grammarBuilder.toString();
|
||||
|
||||
|
||||
|
|
|
@ -809,8 +809,9 @@ setState(<m.stateNumber>);
|
|||
<capture>
|
||||
if (<if (invert)><m.varName> \<= 0 || <else>!<endif>(<expr>)) {
|
||||
<if (m.labels)><m.labels:{l | <labelref(l)> = }><endif>_errHandler->recoverInline(this);
|
||||
} else {
|
||||
consume();
|
||||
}
|
||||
consume();
|
||||
>>
|
||||
|
||||
WildcardHeader(w) ::= "<! Required but unused. !>"
|
||||
|
@ -907,8 +908,10 @@ TokenPropertyRef_index(t) ::= "(<ctx(t)>-><t.label> != nullptr ? <ctx(t)>-><t.la
|
|||
TokenPropertyRef_intHeader(t) ::= "<! Required but unused. !>"
|
||||
TokenPropertyRef_int(t) ::= "(<ctx(t)>-><t.label> != nullptr ? std::stoi(<ctx(t)>-><t.label>->getText()) : 0)"
|
||||
|
||||
|
||||
RulePropertyRef_stopHeaderHeader(r) ::= "<! Required but unused. !>"
|
||||
RulePropertyRef_start(r) ::= "(<ctx(r)>-><r.label> != nullptr ? (<ctx(r)>-><r.label>->start) : nullptr)"
|
||||
|
||||
RulePropertyRef_stopHeader(r) ::= "<! Required but unused. !>"
|
||||
RulePropertyRef_stop(r) ::= "(<ctx(r)>-><r.label> != nullptr ? (<ctx(r)>-><r.label>->stop) : nullptr)"
|
||||
|
||||
RulePropertyRef_textHeader(r) ::= "<! Required but unused. !>"
|
||||
|
|
Loading…
Reference in New Issue