diff options
author | Doug Schaefer | 2003-02-11 18:10:40 +0000 |
---|---|---|
committer | Doug Schaefer | 2003-02-11 18:10:40 +0000 |
commit | f6d742c5b5348012d559c1c61145cca093eb6069 (patch) | |
tree | 0db6e5c317cf21d2f97fe5691dc21e3e861adca7 | |
parent | a4aa1fbf6b5e8ec64c50b9556a3fb62d2b02e445 (diff) | |
download | org.eclipse.cdt-f6d742c5b5348012d559c1c61145cca093eb6069.tar.gz org.eclipse.cdt-f6d742c5b5348012d559c1c61145cca093eb6069.tar.xz org.eclipse.cdt-f6d742c5b5348012d559c1c61145cca093eb6069.zip |
Able to parse "int x" into the DOM.
8 files changed, 124 insertions, 26 deletions
diff --git a/core/org.eclipse.cdt.core/newparser/org/eclipse/cdt/internal/core/dom/DOMBuilder.java b/core/org.eclipse.cdt.core/newparser/org/eclipse/cdt/internal/core/dom/DOMBuilder.java index bcf8294242f..83c3fd48a64 100644 --- a/core/org.eclipse.cdt.core/newparser/org/eclipse/cdt/internal/core/dom/DOMBuilder.java +++ b/core/org.eclipse.cdt.core/newparser/org/eclipse/cdt/internal/core/dom/DOMBuilder.java @@ -46,18 +46,24 @@ public class DOMBuilder implements IParserCallback { * @see org.eclipse.cdt.internal.core.newparser.IParserCallback#declaratorBegin() */ public void declaratorBegin() { + SimpleDeclaration decl = (SimpleDeclaration)stack.peek(); + Declarator declarator = new Declarator(decl); + decl.addDeclarator(declarator); + stack.push(declarator); } /** * @see org.eclipse.cdt.internal.core.newparser.IParserCallback#declaratorEnd() */ public void declaratorEnd() { + stack.pop(); } /** * @see org.eclipse.cdt.internal.core.newparser.IParserCallback#declaratorId(org.eclipse.cdt.internal.core.newparser.Token) */ - public void declaratorId(Token id) { + public void declaratorId() { + ((Declarator)stack.peek()).setName(currName); } /** @@ -212,4 +218,20 @@ public class DOMBuilder implements IParserCallback { stack.pop(); } + private Name currName; + + /** + * @see org.eclipse.cdt.internal.core.newparser.IParserCallback#nameBegin(org.eclipse.cdt.internal.core.newparser.Token) + */ + public void nameBegin(Token firstToken) { + currName = new Name(firstToken); + } + + /** + * @see org.eclipse.cdt.internal.core.newparser.IParserCallback#nameEnd(org.eclipse.cdt.internal.core.newparser.Token) + */ + public void nameEnd(Token lastToken) { + currName.setEnd(lastToken); + } + } diff --git a/core/org.eclipse.cdt.core/newparser/org/eclipse/cdt/internal/core/dom/Declarator.java b/core/org.eclipse.cdt.core/newparser/org/eclipse/cdt/internal/core/dom/Declarator.java index d30d8ce6807..e77bae47867 100644 --- a/core/org.eclipse.cdt.core/newparser/org/eclipse/cdt/internal/core/dom/Declarator.java +++ b/core/org.eclipse.cdt.core/newparser/org/eclipse/cdt/internal/core/dom/Declarator.java @@ -1,18 +1,45 @@ package org.eclipse.cdt.internal.core.dom; -/** - * @author dschaefe - */ public class Declarator { - - private Name name; - public void setName(Name name) { - this.name = name; + public Declarator(SimpleDeclaration declaration) { + this.declaration = declaration; } + private SimpleDeclaration declaration; + + /** + * Returns the declaration. + * @return SimpleDeclaration + */ + public SimpleDeclaration getDeclaration() { + return declaration; + } + + /** + * Sets the declaration. + * @param declaration The declaration to set + */ + public void setDeclaration(SimpleDeclaration declaration) { + this.declaration = declaration; + } + + private Name name; + + /** + * Returns the name. + * @return Name + */ public Name getName() { return name; } - + + /** + * Sets the name. + * @param name The name to set + */ + public void setName(Name name) { + this.name = name; + } + } diff --git a/core/org.eclipse.cdt.core/newparser/org/eclipse/cdt/internal/core/dom/Name.java b/core/org.eclipse.cdt.core/newparser/org/eclipse/cdt/internal/core/dom/Name.java index e948aac56ab..fd66b612bd4 100644 --- a/core/org.eclipse.cdt.core/newparser/org/eclipse/cdt/internal/core/dom/Name.java +++ b/core/org.eclipse.cdt.core/newparser/org/eclipse/cdt/internal/core/dom/Name.java @@ -1,7 +1,6 @@ package org.eclipse.cdt.internal.core.dom; -import java.util.LinkedList; -import java.util.List; +import org.eclipse.cdt.internal.core.newparser.Token; /** * @author dschaefe @@ -13,14 +12,24 @@ import java.util.List; */ public class Name { - private List names = new LinkedList(); + private Token nameStart, nameEnd; - public void addName(String name) { - names.add(name); + public Name(Token nameStart) { + this.nameStart = nameStart; } - public List getNames() { - return names; + public void setEnd(Token nameEnd) { + this.nameEnd = nameEnd; + } + + public String getName() { + String name = nameStart.getImage(); + + for (Token t = nameStart; nameStart != nameEnd;) { + t = nameStart.getNext(); + name += t.getImage(); + } + + return name; } - } diff --git a/core/org.eclipse.cdt.core/newparser/org/eclipse/cdt/internal/core/newparser/IParserCallback.java b/core/org.eclipse.cdt.core/newparser/org/eclipse/cdt/internal/core/newparser/IParserCallback.java index cedde096b29..c592c40ad5c 100644 --- a/core/org.eclipse.cdt.core/newparser/org/eclipse/cdt/internal/core/newparser/IParserCallback.java +++ b/core/org.eclipse.cdt.core/newparser/org/eclipse/cdt/internal/core/newparser/IParserCallback.java @@ -25,8 +25,11 @@ public interface IParserCallback { public void simpleDeclSpecifier(Token specifier); + public void nameBegin(Token firstToken); + public void nameEnd(Token lastToken); + public void declaratorBegin(); - public void declaratorId(Token id); + public void declaratorId(); public void argumentsBegin(); public void argumentsEnd(); public void declaratorEnd(); diff --git a/core/org.eclipse.cdt.core/newparser/org/eclipse/cdt/internal/core/newparser/NullParserCallback.java b/core/org.eclipse.cdt.core/newparser/org/eclipse/cdt/internal/core/newparser/NullParserCallback.java index 7215c66d655..9ce39d1acce 100644 --- a/core/org.eclipse.cdt.core/newparser/org/eclipse/cdt/internal/core/newparser/NullParserCallback.java +++ b/core/org.eclipse.cdt.core/newparser/org/eclipse/cdt/internal/core/newparser/NullParserCallback.java @@ -46,7 +46,7 @@ public class NullParserCallback implements IParserCallback { /** * @see org.eclipse.cdt.internal.core.newparser.IParserCallback#declaratorId(Token) */ - public void declaratorId(Token id) { + public void declaratorId() { } /** @@ -115,4 +115,16 @@ public class NullParserCallback implements IParserCallback { public void macro(String macroName) { } + /** + * @see org.eclipse.cdt.internal.core.newparser.IParserCallback#nameBegin(org.eclipse.cdt.internal.core.newparser.Token) + */ + public void nameBegin(Token firstToken) { + } + + /** + * @see org.eclipse.cdt.internal.core.newparser.IParserCallback#nameEnd(org.eclipse.cdt.internal.core.newparser.Token) + */ + public void nameEnd(Token lastToken) { + } + } diff --git a/core/org.eclipse.cdt.core/newparser/org/eclipse/cdt/internal/core/newparser/Parser.java b/core/org.eclipse.cdt.core/newparser/org/eclipse/cdt/internal/core/newparser/Parser.java index 1d3fd70bc8a..de5cf8e0f01 100644 --- a/core/org.eclipse.cdt.core/newparser/org/eclipse/cdt/internal/core/newparser/Parser.java +++ b/core/org.eclipse.cdt.core/newparser/org/eclipse/cdt/internal/core/newparser/Parser.java @@ -286,17 +286,23 @@ c, quick); * - Handle unqualifiedId */ public boolean name() throws Exception { + Token last = null; + + callback.nameBegin(LA(1)); + if (LT(1) == Token.tCOLONCOLON) - consume(); + last = consume(); - consume(Token.tIDENTIFIER); + last = consume(Token.tIDENTIFIER); while (LT(1) == Token.tCOLONCOLON) { - consume(); + last = consume(); - consume(Token.tIDENTIFIER); + last = consume(Token.tIDENTIFIER); } - + + callback.nameEnd(last); + return true; } @@ -359,8 +365,8 @@ c, quick); return; } - callback.declaratorId(LA(1)); name(); + callback.declaratorId(); for (;;) { switch (LT(1)) { diff --git a/core/org.eclipse.cdt.ui.tests/newparser/org/eclipse/cdt/core/parser/tests/DOMTests.java b/core/org.eclipse.cdt.ui.tests/newparser/org/eclipse/cdt/core/parser/tests/DOMTests.java index 35a24558476..7bd9544fcef 100644 --- a/core/org.eclipse.cdt.ui.tests/newparser/org/eclipse/cdt/core/parser/tests/DOMTests.java +++ b/core/org.eclipse.cdt.ui.tests/newparser/org/eclipse/cdt/core/parser/tests/DOMTests.java @@ -3,6 +3,8 @@ package org.eclipse.cdt.core.parser.tests; import java.util.List; import org.eclipse.cdt.internal.core.dom.DOMBuilder; +import org.eclipse.cdt.internal.core.dom.Declarator; +import org.eclipse.cdt.internal.core.dom.Name; import org.eclipse.cdt.internal.core.dom.SimpleDeclaration; import org.eclipse.cdt.internal.core.dom.TranslationUnit; import org.eclipse.cdt.internal.core.newparser.Parser; @@ -24,5 +26,10 @@ public class DOMTests extends TestCase { assertEquals(1, declarations.size()); SimpleDeclaration declaration = (SimpleDeclaration)declarations.get(0); assertEquals(SimpleDeclaration.t_int, declaration.getDeclSpecifierSeq()); + List declarators = declaration.getDeclarators(); + assertEquals(1, declarators.size()); + Declarator declarator = (Declarator)declarators.get(0); + Name name = declarator.getName(); + assertEquals("x", name.getName()); } } diff --git a/core/org.eclipse.cdt.ui.tests/newparser/org/eclipse/cdt/core/parser/tests/TestCallback.java b/core/org.eclipse.cdt.ui.tests/newparser/org/eclipse/cdt/core/parser/tests/TestCallback.java index 675eafbc621..eb4b0521d73 100644 --- a/core/org.eclipse.cdt.ui.tests/newparser/org/eclipse/cdt/core/parser/tests/TestCallback.java +++ b/core/org.eclipse.cdt.ui.tests/newparser/org/eclipse/cdt/core/parser/tests/TestCallback.java @@ -126,7 +126,7 @@ public class TestCallback extends Assert implements IParserCallback { /** * @see org.eclipse.cdt.internal.core.newparser.IParserCallback#declaratorId(org.eclipse.cdt.internal.core.newparser.Token) */ - public void declaratorId(Token id) { + public void declaratorId() { fail(); } @@ -202,4 +202,16 @@ public class TestCallback extends Assert implements IParserCallback { validate(expressionTerminal, terminal.getImage()); } + /** + * @see org.eclipse.cdt.internal.core.newparser.IParserCallback#nameBegin(org.eclipse.cdt.internal.core.newparser.Token) + */ + public void nameBegin(Token firstToken) { + } + + /** + * @see org.eclipse.cdt.internal.core.newparser.IParserCallback#nameEnd(org.eclipse.cdt.internal.core.newparser.Token) + */ + public void nameEnd(Token lastToken) { + } + } |