openclover / clover

This repository contains source code of OpenClover Core as well as its integrations: Clover-for-Ant, Clover-for-Eclipse and Clover-for-IDEA plugins. Sources are licensed under Apache 2.0 license.
Other
61 stars 16 forks source link

Fix nondeterminism in java grammar #180

Closed marek-parfianowicz closed 2 years ago

marek-parfianowicz commented 2 years ago

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 2 years ago

cc: @satob