Fix nondeterminism in java grammar
Closed this issue · 1 comments
marek-parfianowicz commented
When generating a parser for java language syntax, ANTLR reports a number of warnings:
_clover-core.run.antlr:
[java] ANTLR Parser Generator Version 2.7.7 (20060906) 1989-2005
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:951: warning:nondeterminism upon
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:951: k==1:DOT
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:951: k==2:IDENT
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:951: between alt 1 and exit branch of block
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:1109:17: warning:Rule 'parameterDeclarationList' returns a value
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:780: warning:nondeterminism upon
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:780: k==1:AT
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:780: k==2:IDENT
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:780: between alt 1 and exit branch of block
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:867: warning:nondeterminism upon
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:867: k==1:AT
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:867: k==2:IDENT
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:867: between alt 1 and exit branch of block
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:906: warning:nondeterminism upon
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:906: k==1:AT
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:906: k==2:IDENT
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:906: between alt 1 and exit branch of block
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:1793:5: warning:nondeterminism between alts 5 and 6 of block upon
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:1793:5: k==1:"final","abstract","strictfp","static","private","protected","public",AT
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:1793:5: k==2:"final","abstract","strictfp",IDENT,"static","private","protected","public",AT
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:1694: warning:nondeterminism upon
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:1694: k==1:AT
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:1694: k==2:IDENT
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:1694: between alt 1 and exit branch of block
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:1695: warning:nondeterminism upon
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:1695: k==1:AT
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:1695: k==2:IDENT
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:1695: between alt 1 and exit branch of block
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:2014:78: warning:nondeterminism between alts 1 and 2 of block upon
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:2014:78: k==1:IDENT
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:2014:78: k==2:LBRACK,AT
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:2014:218: warning:nondeterminism between alts 1 and 2 of block upon
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:2014:218: k==1:IDENT
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:2014:218: k==2:LBRACK,AT
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:2039: warning:nondeterminism upon
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:2039: k==1:AT
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:2039: k==2:IDENT
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:2039: between alt 1 and exit branch of block
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:2041: warning:nondeterminism upon
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:2041: k==1:AT
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:2041: k==2:IDENT
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:2041: between alt 1 and exit branch of block
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:2298:9: warning:nondeterminism between alts 1 and 2 of block upon
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:2298:9: k==1:ASSIGN,PLUS_ASSIGN,MINUS_ASSIGN,STAR_ASSIGN,DIV_ASSIGN,MOD_ASSIGN,SR_ASSIGN,BSR_ASSIGN,SL_ASSIGN,BAND_ASSIGN,BXOR_ASSIGN,BOR_ASSIGN
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:2298:9: k==2:IDENT,"super","void","boolean","byte","char","short","int","float","long","double",LPAREN,"this",PLUS,MINUS,INC,DEC,BNOT,LNOT,"true","false","null","new",NUM_INT,CHAR_LITERAL,STRING_LITERAL,NUM_FLOAT,NUM_LONG,NUM_DOUBLE
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:3112: warning:lexical nondeterminism between alts 3 and 4 of block upon
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:3112: k==1:'\r'
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:3112: k==2:'\n'
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:3112: k==3:'\u0000'..'\ufffe'
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:3112: k==4:'\u0000'..'\ufffe'
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:3112: warning:lexical nondeterminism between alts 6 and 7 of block upon
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:3112: k==1:'\\'
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:3112: k==2:'"','\'','0'..'7','\\','b','f','n','r','t','u'
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:3112: k==3:'\u0000'..'\ufffe'
[java] /Users/marek/OpenClover/clover/clover-core/src/main/java/com/atlassian/clover/instr/java/java.g:3112: k==4:'\u0000'..'\ufffe'
This nondeterminism can lead to syntax errors when parsing valid java files. Fix it.
Note: this is a side-effect of merge of recent pull requests which delivered Java 10-15 language features.
Note: a usual way to resolve these is to add semantic predicates in the grammar.
Tasks:
[] java.g:951
[] java.g:780
[] java.g:867
[] java.g:906
[] java.g:1793
[] java.g:1694
[] java.g:1695
[] java.g:2014
[] java.g:2039
[] java.g:2041
[] java.g:2298
[] java.g:3112
marek-parfianowicz commented
cc: @satob