Skip to content

Commit

Permalink
[parser] better recover for statements, don't take '++' and so on int…
Browse files Browse the repository at this point in the history
…o account

prevent stub mismatch
fix #2241
  • Loading branch information
ignatov committed Feb 6, 2016
1 parent 3ebb86b commit 58cf961
Show file tree
Hide file tree
Showing 5 changed files with 215 additions and 29 deletions.
30 changes: 2 additions & 28 deletions gen/com/goide/parser/GoParser.java

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion grammars/go.bnf
Expand Up @@ -208,7 +208,7 @@ Statement ::=
| ForStatement
| DeferStatement {methods=[processDeclarations]}

private StatementRecover ::= !('!' | '!=' | '%' | '%=' | '&&' | '&' | '&=' | '&^' | '&^=' | '(' | '*' | '*=' | '+' | '++' | '+=' | '-' | '--' | '-=' | '...' | '/' | '/=' | ';' | '<' | '<-' | '<<' | '<<=' | '<=' | '=' | '==' | '>' | '>=' | '>>' | '>>=' | '^' | '^=' | 'type' | '{' | '|' | '|=' | '||' | '}' | break | case | char | const | continue | decimali | default | defer | else | fallthrough | float | floati | for | func | go | goto | hex | identifier | if | int | interface | map | oct | return | select | string | raw_string | struct | switch | var)
private StatementRecover ::= !('!' | '&' | '(' | '*' | '+' | '-' | ';' | '<-' | '^' | 'type' | '{' | '|' | '|=' | '||' | '}' | break | case | char | const | continue | decimali | default | defer | else | fallthrough | float | floati | for | func | go | goto | hex | identifier | if | int | interface | map | oct | return | select | string | raw_string | struct | switch | var)

SimpleStatement ::=
ShortVarDeclaration
Expand Down
28 changes: 28 additions & 0 deletions testData/parser/PlusPlusRecover.go
@@ -0,0 +1,28 @@
package main

func main() {
i := 0
i //error
&i //error
/i //error
/=i //error
^i //error
<i //error
<<i //error
=i //error
==i //error
>i //error
>>i //error
...i //error
!i //error
!=i //error
%i //error
&&i //error
&=i //error
&^i //error
&^=i //error
+=i //error
--i //error
++i //error
Println()
}
183 changes: 183 additions & 0 deletions testData/parser/PlusPlusRecover.txt
@@ -0,0 +1,183 @@
GO_FILE
PACKAGE_CLAUSE
PsiElement(package)('package')
PsiElement(identifier)('main')
IMPORT_LIST
<empty list>
FUNCTION_DECLARATION
PsiElement(func)('func')
PsiElement(identifier)('main')
SIGNATURE
PARAMETERS
PsiElement(()('(')
PsiElement())(')')
BLOCK
PsiElement({)('{')
SIMPLE_STATEMENT
SHORT_VAR_DECLARATION
VAR_DEFINITION
PsiElement(identifier)('i')
PsiElement(:=)(':=')
LITERAL
PsiElement(int)('0')
SIMPLE_STATEMENT
LEFT_HAND_EXPR_LIST
REFERENCE_EXPRESSION
PsiElement(identifier)('i')
PsiComment(GO_LINE_COMMENT)('//error')
SIMPLE_STATEMENT
LEFT_HAND_EXPR_LIST
UNARY_EXPR
PsiElement(&)('&')
REFERENCE_EXPRESSION
PsiElement(identifier)('i')
PsiComment(GO_LINE_COMMENT)('//error')
PsiErrorElement:'/' unexpected
PsiElement(/)('/')
SIMPLE_STATEMENT
LEFT_HAND_EXPR_LIST
REFERENCE_EXPRESSION
PsiElement(identifier)('i')
PsiComment(GO_LINE_COMMENT)('//error')
PsiErrorElement:'/=' unexpected
PsiElement(/=)('/=')
SIMPLE_STATEMENT
LEFT_HAND_EXPR_LIST
REFERENCE_EXPRESSION
PsiElement(identifier)('i')
PsiComment(GO_LINE_COMMENT)('//error')
SIMPLE_STATEMENT
LEFT_HAND_EXPR_LIST
UNARY_EXPR
PsiElement(^)('^')
REFERENCE_EXPRESSION
PsiElement(identifier)('i')
PsiComment(GO_LINE_COMMENT)('//error')
PsiErrorElement:'<' unexpected
PsiElement(<)('<')
SIMPLE_STATEMENT
LEFT_HAND_EXPR_LIST
REFERENCE_EXPRESSION
PsiElement(identifier)('i')
PsiComment(GO_LINE_COMMENT)('//error')
PsiErrorElement:'<<' unexpected
PsiElement(<<)('<<')
SIMPLE_STATEMENT
LEFT_HAND_EXPR_LIST
REFERENCE_EXPRESSION
PsiElement(identifier)('i')
PsiComment(GO_LINE_COMMENT)('//error')
PsiErrorElement:'=' unexpected
PsiElement(=)('=')
SIMPLE_STATEMENT
LEFT_HAND_EXPR_LIST
REFERENCE_EXPRESSION
PsiElement(identifier)('i')
PsiComment(GO_LINE_COMMENT)('//error')
PsiErrorElement:'==' unexpected
PsiElement(==)('==')
SIMPLE_STATEMENT
LEFT_HAND_EXPR_LIST
REFERENCE_EXPRESSION
PsiElement(identifier)('i')
PsiComment(GO_LINE_COMMENT)('//error')
PsiErrorElement:'>' unexpected
PsiElement(>)('>')
SIMPLE_STATEMENT
LEFT_HAND_EXPR_LIST
REFERENCE_EXPRESSION
PsiElement(identifier)('i')
PsiComment(GO_LINE_COMMENT)('//error')
PsiErrorElement:'>>' unexpected
PsiElement(>>)('>>')
SIMPLE_STATEMENT
LEFT_HAND_EXPR_LIST
REFERENCE_EXPRESSION
PsiElement(identifier)('i')
PsiComment(GO_LINE_COMMENT)('//error')
PsiErrorElement:'...' unexpected
PsiElement(...)('...')
SIMPLE_STATEMENT
LEFT_HAND_EXPR_LIST
REFERENCE_EXPRESSION
PsiElement(identifier)('i')
PsiComment(GO_LINE_COMMENT)('//error')
SIMPLE_STATEMENT
LEFT_HAND_EXPR_LIST
UNARY_EXPR
PsiElement(!)('!')
REFERENCE_EXPRESSION
PsiElement(identifier)('i')
PsiComment(GO_LINE_COMMENT)('//error')
PsiErrorElement:'!=' unexpected
PsiElement(!=)('!=')
SIMPLE_STATEMENT
LEFT_HAND_EXPR_LIST
REFERENCE_EXPRESSION
PsiElement(identifier)('i')
PsiComment(GO_LINE_COMMENT)('//error')
PsiErrorElement:'%' unexpected
PsiElement(%)('%')
SIMPLE_STATEMENT
LEFT_HAND_EXPR_LIST
REFERENCE_EXPRESSION
PsiElement(identifier)('i')
PsiComment(GO_LINE_COMMENT)('//error')
PsiErrorElement:'&&' unexpected
PsiElement(&&)('&&')
SIMPLE_STATEMENT
LEFT_HAND_EXPR_LIST
REFERENCE_EXPRESSION
PsiElement(identifier)('i')
PsiComment(GO_LINE_COMMENT)('//error')
PsiErrorElement:'&=' unexpected
PsiElement(&=)('&=')
SIMPLE_STATEMENT
LEFT_HAND_EXPR_LIST
REFERENCE_EXPRESSION
PsiElement(identifier)('i')
PsiComment(GO_LINE_COMMENT)('//error')
PsiErrorElement:'&^' unexpected
PsiElement(&^)('&^')
SIMPLE_STATEMENT
LEFT_HAND_EXPR_LIST
REFERENCE_EXPRESSION
PsiElement(identifier)('i')
PsiComment(GO_LINE_COMMENT)('//error')
PsiErrorElement:'&^=' unexpected
PsiElement(&^=)('&^=')
SIMPLE_STATEMENT
LEFT_HAND_EXPR_LIST
REFERENCE_EXPRESSION
PsiElement(identifier)('i')
PsiComment(GO_LINE_COMMENT)('//error')
PsiErrorElement:'+=' unexpected
PsiElement(+=)('+=')
SIMPLE_STATEMENT
LEFT_HAND_EXPR_LIST
REFERENCE_EXPRESSION
PsiElement(identifier)('i')
PsiComment(GO_LINE_COMMENT)('//error')
PsiErrorElement:'--' unexpected
PsiElement(--)('--')
SIMPLE_STATEMENT
LEFT_HAND_EXPR_LIST
REFERENCE_EXPRESSION
PsiElement(identifier)('i')
PsiComment(GO_LINE_COMMENT)('//error')
PsiErrorElement:'++' unexpected
PsiElement(++)('++')
SIMPLE_STATEMENT
LEFT_HAND_EXPR_LIST
REFERENCE_EXPRESSION
PsiElement(identifier)('i')
PsiComment(GO_LINE_COMMENT)('//error')
SIMPLE_STATEMENT
LEFT_HAND_EXPR_LIST
CALL_EXPR
REFERENCE_EXPRESSION
PsiElement(identifier)('Println')
ARGUMENT_LIST
PsiElement(()('(')
PsiElement())(')')
PsiElement(})('}')
1 change: 1 addition & 0 deletions tests/com/goide/parser/GoParserTest.java
Expand Up @@ -81,4 +81,5 @@ protected void setUp() throws Exception {
public void testElementRecover() { doTest(false); }
public void testChanRecover() { doTest(false); }
public void testMapLiteralRecover() { doTest(false); }
public void testPlusPlusRecover() { doTest(false); }
}

0 comments on commit 58cf961

Please sign in to comment.