Chromium Code Reviews| Index: frog/leg/scanner/listener.dart |
| =================================================================== |
| --- frog/leg/scanner/listener.dart (revision 4354) |
| +++ frog/leg/scanner/listener.dart (working copy) |
| @@ -423,15 +423,30 @@ |
| } |
| Token expectedExpression(Token token) { |
| - error("Expected an expression, but got '$token'", token); |
| + error("expected an expression, but got '$token'", token); |
| return skipToEof(token); |
| } |
| Token unexpected(Token token) { |
| - error("Unexpected token '$token'", token); |
| + error("unexpected token '$token'", token); |
| return skipToEof(token); |
| } |
| + Token expectedBlock(Token token) { |
| + error("expected a block '$token'", token); |
|
floitsch
2012/02/19 00:59:43
but got '$token'
ngeoffray
2012/02/20 17:00:02
Done.
|
| + return skipToEof(token); |
| + } |
| + |
| + Token expectedFunctionBody(Token token) { |
| + error("expected a function body '$token'", token); |
|
floitsch
2012/02/19 00:59:43
but got
ngeoffray
2012/02/20 17:00:02
Done.
|
| + return skipToEof(token); |
| + } |
| + |
| + Token expectedClassBody(Token token) { |
| + error("expected a class body '$token'", token); |
|
floitsch
2012/02/19 00:59:43
but got.
ngeoffray
2012/02/20 17:00:02
Done.
|
| + return skipToEof(token); |
| + } |
| + |
| skipToEof(Token token) { |
| while (token.info !== EOF_INFO) { |
| token = token.next; |
| @@ -511,12 +526,21 @@ |
| void endClassDeclaration(int interfacesCount, Token beginToken, |
| Token extendsKeyword, Token implementsKeyword, |
| Token endToken) { |
| + String nativeName; |
|
ahe
2012/02/19 14:38:02
SourceString.
ngeoffray
2012/02/20 17:00:02
Done.
|
| + if (nodes.head != null |
| + && nodes.head.asIdentifier() != null |
| + && nodes.head.asIdentifier().source.stringValue == 'native') { |
| + nativeName = nodes.head.asIdentifier().token.next.stringValue; |
|
ahe
2012/02/19 14:38:02
Don't call stringValue.
ngeoffray
2012/02/20 17:00:02
Done.
|
| + popNode(); |
| + } |
| NodeList interfaces = |
| makeNodeList(interfacesCount, implementsKeyword, null, ","); |
| TypeAnnotation supertype = popNode(); |
| Identifier name = popNode(); |
| - pushElement(new PartialClassElement( |
| - name.source, beginToken, endToken, compilationUnitElement)); |
| + ClassElement element = new PartialClassElement( |
| + name.source, beginToken, endToken, compilationUnitElement); |
| + element.nativeName = nativeName; |
| + pushElement(element); |
| } |
| void endDefaultClause(Token defaultKeyword) { |
| @@ -657,16 +681,56 @@ |
| } |
| Token expectedExpression(Token token) { |
| - listener.cancel("Expected an expression, but got '$token'", token: token); |
| + listener.cancel("expected an expression, but got '$token'", token: token); |
| pushNode(null); |
| return skipToEof(token); |
| } |
| Token unexpected(Token token) { |
| - listener.cancel("Unexpected token '$token'", token: token); |
| + listener.cancel("unexpected token '$token'", token: token); |
| return skipToEof(token); |
| } |
| + Token expectedBlock(Token token) { |
| + if (token.stringValue === 'native') { |
|
ahe
2012/02/19 14:38:02
Should we move this code to some static helpers in
ngeoffray
2012/02/20 17:00:02
Done.
|
| + token = token.next; |
| + if (token.kind === STRING_TOKEN) { |
| + token = token.next; |
| + } |
| + if (token.stringValue === '{') { |
| + BeginGroupToken beginGroupToken = token; |
|
ahe
2012/02/19 14:38:02
Why is the block being skipped here?
Perhaps thi
ngeoffray
2012/02/20 09:09:37
The block contains native code, and I need to retu
|
| + token = beginGroupToken.endGroup; |
| + } |
| + return token; |
| + } else { |
| + return unexpected(token); |
| + } |
| + } |
| + |
| + Token expectedFunctionBody(Token token) { |
| + listener.cancel("expected a function body, but got '$token'", token: token); |
| + return skipToEof(token); |
| + } |
| + |
| + Token expectedClassBody(Token token) { |
| + if (token.stringValue === 'native') { |
| + handleIdentifier(token); |
| + token = token.next; |
| + if (token.kind !== STRING_TOKEN) { |
| + return unexpected(token); |
| + } |
| + token = token.next; |
| + if (token.stringValue !== '{') { |
| + return unexpected(token); |
| + } |
| + BeginGroupToken beginGroupToken = token; |
|
ahe
2012/02/19 14:38:02
Ditto.
ngeoffray
2012/02/20 09:09:37
Ditto, I need to return the end of the class body
|
| + token = beginGroupToken.endGroup; |
| + return token; |
| + } else { |
| + return unexpected(token); |
| + } |
| + } |
| + |
| void recoverableError(String message, [Token token, Node node]) { |
| listener.cancel(message, token: token, node: node); |
| } |
| @@ -866,6 +930,48 @@ |
| listener.cancel("internal error: '${token.value}': ${error}", token: token); |
| } |
| + Token expectedFunctionBody(Token token) { |
| + if (token.stringValue === 'native') { |
| + Token begin = token; |
| + beginExpressionStatement(token); |
| + handleIdentifier(token); |
| + token = token.next; |
| + if (token.kind === STRING_TOKEN) { |
| + beginLiteralString(token); |
| + endLiteralString(0); |
| + pushNode(new NodeList.singleton(popNode())); |
| + endSend(token); |
| + token = token.next; |
| + } else { |
| + pushNode(new NodeList.empty()); |
| + endSend(token); |
| + } |
| + endExpressionStatement(token); |
| + endFunctionBody(1, begin, token); |
| + // TODO(ngeoffray): expect a ';'. |
| + return token.next; |
| + } else { |
| + listener.cancel( |
| + "expected a function body, but got '$token'", token: token); |
| + return skipToEof(token); |
| + } |
| + } |
| + |
| + Token expectedClassBody(Token token) { |
| + if (token.stringValue === 'native') { |
| + token = token.next; |
| + if (token.kind !== STRING_TOKEN) { |
| + unexpected(token); |
| + } else { |
| + token = token.next; |
| + } |
| + return token; |
| + } else { |
| + listener.cancel("expected a class body, but got '$token'", token: token); |
| + return skipToEof(token); |
| + } |
| + } |
| + |
| void handleLiteralInt(Token token) { |
| pushNode(new LiteralInt(token, (t, e) => handleOnError(t, e))); |
| } |