Bug 572429: [R-Source] Add concept of R language version to R-Source

  - Improve RTerminal and related unit tests

Change-Id: If2fd6df717f1741932d70d8662037090e241a10e
diff --git a/r/org.eclipse.statet.r.console.core/META-INF/MANIFEST.MF b/r/org.eclipse.statet.r.console.core/META-INF/MANIFEST.MF
index b09f523..0f3d0ca 100644
--- a/r/org.eclipse.statet.r.console.core/META-INF/MANIFEST.MF
+++ b/r/org.eclipse.statet.r.console.core/META-INF/MANIFEST.MF
@@ -29,7 +29,8 @@
  org.eclipse.statet.jcommons.status.eplatform;version="4.4.0",
  org.eclipse.statet.jcommons.text.core;version="4.4.0",
  org.eclipse.statet.jcommons.text.core.input;version="4.4.0",
- org.eclipse.statet.jcommons.ts.core;version="4.4.0"
+ org.eclipse.statet.jcommons.ts.core;version="4.4.0",
+ org.eclipse.statet.jcommons.util;version="4.4.0"
 Export-Package: org.eclipse.statet.r.console.core,
  org.eclipse.statet.r.console.core.util,
  org.eclipse.statet.r.launching.core,
diff --git a/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/r/core/rsource/RLexerNumericLiteralTest.java b/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/r/core/rsource/RLexerNumericLiteralTest.java
index 40f50f9..a273724 100644
--- a/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/r/core/rsource/RLexerNumericLiteralTest.java
+++ b/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/r/core/rsource/RLexerNumericLiteralTest.java
@@ -27,8 +27,6 @@
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.text.core.input.StringParserInput;
 
-import org.eclipse.statet.r.core.rlang.RTerminal;
-
 
 @NonNullByDefault
 public class RLexerNumericLiteralTest {
diff --git a/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/r/core/rsource/RLexerStringLiteralTest.java b/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/r/core/rsource/RLexerStringLiteralTest.java
index d1a2061..26694af 100644
--- a/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/r/core/rsource/RLexerStringLiteralTest.java
+++ b/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/r/core/rsource/RLexerStringLiteralTest.java
@@ -35,8 +35,6 @@
 import org.eclipse.statet.jcommons.text.core.BasicTextRegion;
 import org.eclipse.statet.jcommons.text.core.input.StringParserInput;
 
-import org.eclipse.statet.r.core.rlang.RTerminal;
-
 
 @NonNullByDefault
 public class RLexerStringLiteralTest {
diff --git a/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/r/core/rsource/RLexerStringTextTest.java b/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/r/core/rsource/RLexerStringTextTest.java
index fe28b5f..56a9e4f 100644
--- a/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/r/core/rsource/RLexerStringTextTest.java
+++ b/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/r/core/rsource/RLexerStringTextTest.java
@@ -31,8 +31,6 @@
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.text.core.input.StringParserInput;
 
-import org.eclipse.statet.r.core.rlang.RTerminal;
-
 
 @NonNullByDefault
 public class RLexerStringTextTest {
diff --git a/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/r/core/rsource/RLexerTest.java b/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/r/core/rsource/RLexerTest.java
index 4a11324..5daee80 100644
--- a/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/r/core/rsource/RLexerTest.java
+++ b/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/r/core/rsource/RLexerTest.java
@@ -23,8 +23,6 @@
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.text.core.input.StringParserInput;
 
-import org.eclipse.statet.r.core.rlang.RTerminal;
-
 
 @NonNullByDefault
 public class RLexerTest {
@@ -48,6 +46,7 @@
 		lexer.reset(this.input.reset("").init());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
+		assertEquals(0, lexer.getOffset());
 	}
 	
 	@Test
@@ -77,6 +76,20 @@
 		lexer.reset(this.input.reset(" \n ").init());
 		
 		assertEquals(RTerminal.LINEBREAK, lexer.next());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(1, lexer.getLength());
+		
+		assertEquals(RTerminal.EOF, lexer.next());
+	}
+	
+	@Test
+	public void matchLinebreakWin() {
+		final RLexer lexer= new RLexer(getConfig() | RLexer.SKIP_WHITESPACE);
+		lexer.reset(this.input.reset(" \r\n ").init());
+		
+		assertEquals(RTerminal.LINEBREAK, lexer.next());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(2, lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -88,6 +101,8 @@
 		
 		assertEquals(RTerminal.COMMENT, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(2, lexer.getOffset());
+		assertEquals(9, lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -99,7 +114,11 @@
 		
 		assertEquals(RTerminal.COMMENT, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(2, lexer.getOffset());
+		assertEquals(9, lexer.getLength());
 		assertEquals(RTerminal.LINEBREAK, lexer.next());
+		assertEquals(2 + 9, lexer.getOffset());
+		assertEquals(1, lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -107,10 +126,12 @@
 	@Test
 	public void matchRoxygenComment() {
 		final RLexer lexer= new RLexer(getConfig() | RLexer.SKIP_WHITESPACE);
-		lexer.reset(this.input.reset("#' comment").init());
+		lexer.reset(this.input.reset(" #' comment").init());
 		
 		assertEquals(RTerminal.ROXYGEN_COMMENT, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(10, lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -136,6 +157,8 @@
 		
 		assertEquals(RTerminal.BLOCK_OPEN, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_BLOCK_OPEN.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -147,6 +170,8 @@
 		
 		assertEquals(RTerminal.BLOCK_CLOSE, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_BLOCK_CLOSE.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -158,6 +183,8 @@
 		
 		assertEquals(RTerminal.GROUP_OPEN, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_GROUP_OPEN.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -169,6 +196,8 @@
 		
 		assertEquals(RTerminal.GROUP_CLOSE, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_GROUP_CLOSE.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -180,6 +209,8 @@
 		
 		assertEquals(RTerminal.SUB_INDEXED_S_OPEN, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_SUB_INDEXED_OPEN.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -191,6 +222,8 @@
 		
 		assertEquals(RTerminal.SUB_INDEXED_D_OPEN, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_SUB_INDEXED_D_OPEN.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -202,6 +235,8 @@
 		
 		assertEquals(RTerminal.SUB_INDEXED_CLOSE, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_SUB_INDEXED_CLOSE.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -213,6 +248,8 @@
 		
 		assertEquals(RTerminal.SUB_NAMED_PART, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_SUB_NAMED.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -224,6 +261,8 @@
 		
 		assertEquals(RTerminal.SUB_NAMED_SLOT, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_SUB_AT.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -235,6 +274,8 @@
 		
 		assertEquals(RTerminal.NS_GET, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_NS_GET.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -246,6 +287,8 @@
 		
 		assertEquals(RTerminal.NS_GET_INT, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_NS_GET_INT.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -257,6 +300,8 @@
 		
 		assertEquals(RTerminal.PLUS, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_PLUS.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -268,6 +313,8 @@
 		
 		assertEquals(RTerminal.MINUS, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_MINUS.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -279,6 +326,8 @@
 		
 		assertEquals(RTerminal.MULT, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_MULT.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -290,6 +339,8 @@
 		
 		assertEquals(RTerminal.DIV, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_DIV.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -301,6 +352,8 @@
 		
 		assertEquals(RTerminal.OR, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_OR.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -312,6 +365,8 @@
 		
 		assertEquals(RTerminal.OR_D, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_OR_D.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -323,6 +378,8 @@
 		
 		assertEquals(RTerminal.AND, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_AND.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -334,6 +391,8 @@
 		
 		assertEquals(RTerminal.AND_D, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_AND_D.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -345,6 +404,8 @@
 		
 		assertEquals(RTerminal.NOT, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_NOT.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -356,6 +417,8 @@
 		
 		assertEquals(RTerminal.POWER, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_POWER.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -367,6 +430,8 @@
 		
 		assertEquals(RTerminal.SEQ, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_COLON.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -378,6 +443,8 @@
 		
 		assertEquals(RTerminal.SPECIAL, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(3, lexer.getLength());
 		assertEquals("/", lexer.getText());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
@@ -390,6 +457,8 @@
 		
 		assertEquals(RTerminal.SPECIAL, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(2, lexer.getLength());
 		assertEquals("", lexer.getText());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
@@ -402,6 +471,8 @@
 		
 		assertEquals(RTerminal.SPECIAL, lexer.next());
 		assertEquals(STATUS12_SYNTAX_TOKEN_NOT_CLOSED, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(3, lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 		
@@ -409,6 +480,8 @@
 		
 		assertEquals(RTerminal.SPECIAL, lexer.next());
 		assertEquals(STATUS12_SYNTAX_TOKEN_NOT_CLOSED, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(3, lexer.getLength());
 		
 		assertEquals(RTerminal.LINEBREAK, lexer.next());
 	}
@@ -420,6 +493,8 @@
 		
 		assertEquals(RTerminal.QUESTIONMARK, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_QUESTIONMARK.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -431,17 +506,21 @@
 		
 		assertEquals(RTerminal.COMMA, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_COMMA.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
 	
 	@Test
-	public void matchSemi() {
+	public void matchSemicolon() {
 		final RLexer lexer= new RLexer(getConfig() | RLexer.SKIP_WHITESPACE);
 		lexer.reset(this.input.reset(" ; ").init());
 		
-		assertEquals(RTerminal.SEMI, lexer.next());
+		assertEquals(RTerminal.SEMICOLON, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_SEMICOLON.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -453,6 +532,8 @@
 		
 		assertEquals(RTerminal.ARROW_LEFT_S, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_ARROW_LEFT.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -464,6 +545,8 @@
 		
 		assertEquals(RTerminal.ARROW_LEFT_D, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_ARROW_LEFT_D.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -475,6 +558,8 @@
 		
 		assertEquals(RTerminal.ARROW_RIGHT_S, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_ARROW_RIGHT.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -486,6 +571,8 @@
 		
 		assertEquals(RTerminal.ARROW_RIGHT_D, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_ARROW_RIGHT_D.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -497,6 +584,8 @@
 		
 		assertEquals(RTerminal.EQUAL, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_EQUAL.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -508,6 +597,8 @@
 		
 		assertEquals(RTerminal.COLON_EQUAL, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(2, lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -530,6 +621,8 @@
 		
 		assertEquals(RTerminal.TILDE, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_TILDE.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -541,6 +634,8 @@
 		
 		assertEquals(RTerminal.REL_NE, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_REL_NE.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -552,6 +647,8 @@
 		
 		assertEquals(RTerminal.REL_EQ, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_REL_EQ.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -563,6 +660,8 @@
 		
 		assertEquals(RTerminal.REL_LT, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_REL_LT.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -574,6 +673,8 @@
 		
 		assertEquals(RTerminal.REL_LE, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_REL_LE.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -585,6 +686,8 @@
 		
 		assertEquals(RTerminal.REL_GT, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_REL_GT.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -596,6 +699,8 @@
 		
 		assertEquals(RTerminal.REL_GE, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_REL_GE.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -608,6 +713,8 @@
 		
 		assertEquals(RTerminal.IF, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_IF.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -619,6 +726,8 @@
 		
 		assertEquals(RTerminal.ELSE, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_ELSE.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -630,6 +739,8 @@
 		
 		assertEquals(RTerminal.FOR, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_FOR.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -641,6 +752,8 @@
 		
 		assertEquals(RTerminal.IN, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_IN.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -652,6 +765,8 @@
 		
 		assertEquals(RTerminal.WHILE, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_WHILE.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -663,6 +778,8 @@
 		
 		assertEquals(RTerminal.REPEAT, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_REPEAT.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -674,6 +791,8 @@
 		
 		assertEquals(RTerminal.NEXT, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_NEXT.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -685,6 +804,8 @@
 		
 		assertEquals(RTerminal.BREAK, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_BREAK.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -696,6 +817,8 @@
 		
 		assertEquals(RTerminal.FUNCTION, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_FUNCTION.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -707,6 +830,8 @@
 		
 		assertEquals(RTerminal.TRUE, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_TRUE.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -718,6 +843,8 @@
 		
 		assertEquals(RTerminal.FALSE, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_FALSE.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -729,6 +856,8 @@
 		
 		assertEquals(RTerminal.NA, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_NA.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -740,6 +869,8 @@
 		
 		assertEquals(RTerminal.NA_REAL, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_NA_REAL.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -751,6 +882,8 @@
 		
 		assertEquals(RTerminal.NA_INT, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_NA_INT.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -762,6 +895,8 @@
 		
 		assertEquals(RTerminal.NA_CPLX, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_NA_CPLX.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -773,6 +908,8 @@
 		
 		assertEquals(RTerminal.NA_CHAR, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_NA_CHAR.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -784,6 +921,8 @@
 		
 		assertEquals(RTerminal.NULL, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_NULL.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -795,6 +934,8 @@
 		
 		assertEquals(RTerminal.NAN, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_NAN.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
@@ -806,6 +947,8 @@
 		
 		assertEquals(RTerminal.INF, lexer.next());
 		assertEquals(0, lexer.getFlags());
+		assertEquals(1, lexer.getOffset());
+		assertEquals(RTerminal.S_INF.length(), lexer.getLength());
 		
 		assertEquals(RTerminal.EOF, lexer.next());
 	}
diff --git a/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/r/core/rsource/ast/RParserBasicTest.java b/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/r/core/rsource/ast/RParserBasicTest.java
index 6e15378..462addb 100644
--- a/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/r/core/rsource/ast/RParserBasicTest.java
+++ b/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/r/core/rsource/ast/RParserBasicTest.java
@@ -31,7 +31,7 @@
 import org.eclipse.statet.jcommons.text.core.input.StringParserInput;
 
 import org.eclipse.statet.ltk.model.core.ModelManager;
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 @NonNullByDefault
diff --git a/r/org.eclipse.statet.r.core/META-INF/MANIFEST.MF b/r/org.eclipse.statet.r.core/META-INF/MANIFEST.MF
index 7ee24e6..529d8d3 100644
--- a/r/org.eclipse.statet.r.core/META-INF/MANIFEST.MF
+++ b/r/org.eclipse.statet.r.core/META-INF/MANIFEST.MF
@@ -45,6 +45,7 @@
  org.eclipse.statet.jcommons.text.core.input;version="4.4.0",
  org.eclipse.statet.jcommons.text.core.util;version="4.4.0",
  org.eclipse.statet.jcommons.ts.core;version="4.4.0",
+ org.eclipse.statet.jcommons.util;version="4.4.0",
  org.eclipse.statet.rj.rsetups;version="4.4.0"
 Export-Package: org.eclipse.statet.internal.r.core.sourcemodel;x-friends:="org.eclipse.statet.r.console.core",
  org.eclipse.statet.r.core,
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/sourcemodel/SourceAnalyzer.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/sourcemodel/SourceAnalyzer.java
index ba969eb..6fd12e3 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/sourcemodel/SourceAnalyzer.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/sourcemodel/SourceAnalyzer.java
@@ -57,8 +57,8 @@
 import org.eclipse.statet.r.core.model.RSourceFrame;
 import org.eclipse.statet.r.core.model.RSourceUnit;
 import org.eclipse.statet.r.core.model.RSourceUnitModelInfo;
-import org.eclipse.statet.r.core.rlang.RTerminal;
 import org.eclipse.statet.r.core.rsource.RSourceConstants;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 import org.eclipse.statet.r.core.rsource.ast.Arithmetic;
 import org.eclipse.statet.r.core.rsource.ast.Assignment;
 import org.eclipse.statet.r.core.rsource.ast.CForLoop;
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/sourcemodel/SyntaxProblemReporter.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/sourcemodel/SyntaxProblemReporter.java
index f1c3eb1..69b10e5 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/sourcemodel/SyntaxProblemReporter.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/sourcemodel/SyntaxProblemReporter.java
@@ -84,8 +84,8 @@
 import org.eclipse.statet.r.core.data.RValueFormatter;
 import org.eclipse.statet.r.core.model.RModel;
 import org.eclipse.statet.r.core.model.RSourceUnit;
-import org.eclipse.statet.r.core.rlang.RTerminal;
 import org.eclipse.statet.r.core.rsource.RSourceConstants;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 import org.eclipse.statet.r.core.rsource.ast.Arithmetic;
 import org.eclipse.statet.r.core.rsource.ast.Assignment;
 import org.eclipse.statet.r.core.rsource.ast.Block;
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/data/RValueValidator.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/data/RValueValidator.java
index fe57b69..e2c6434 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/data/RValueValidator.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/data/RValueValidator.java
@@ -16,9 +16,9 @@
 
 import org.eclipse.statet.jcommons.text.core.input.StringParserInput;
 
-import org.eclipse.statet.r.core.rlang.RTerminal;
 import org.eclipse.statet.r.core.rsource.RLexer;
 import org.eclipse.statet.r.core.rsource.RSourceConstants;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 import org.eclipse.statet.rj.data.RCharacterStore;
 import org.eclipse.statet.rj.data.RComplexStore;
 import org.eclipse.statet.rj.data.RFactorStore;
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/model/RElementName.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/model/RElementName.java
index 97ccaf5..442b997 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/model/RElementName.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/model/RElementName.java
@@ -31,8 +31,8 @@
 import org.eclipse.statet.ltk.core.ElementName;
 import org.eclipse.statet.r.core.RSymbolComparator;
 import org.eclipse.statet.r.core.data.RValueFormatter;
-import org.eclipse.statet.r.core.rlang.RTerminal;
 import org.eclipse.statet.r.core.rsource.RLexer;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 /**
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/refactoring/ExtractTempRefactoring.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/refactoring/ExtractTempRefactoring.java
index 04c4da8..4ed6810 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/refactoring/ExtractTempRefactoring.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/refactoring/ExtractTempRefactoring.java
@@ -60,6 +60,7 @@
 import org.eclipse.statet.r.core.rsource.ast.RAsts;
 import org.eclipse.statet.r.core.source.RHeuristicTokenScanner;
 
+
 public class ExtractTempRefactoring extends Refactoring {
 	
 	
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/refactoring/FunctionToS4MethodRefactoring.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/refactoring/FunctionToS4MethodRefactoring.java
index d6e2355..666f839 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/refactoring/FunctionToS4MethodRefactoring.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/refactoring/FunctionToS4MethodRefactoring.java
@@ -61,13 +61,14 @@
 import org.eclipse.statet.r.core.model.RModelManager;
 import org.eclipse.statet.r.core.model.RSourceUnit;
 import org.eclipse.statet.r.core.model.RSourceUnitModelInfo;
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 import org.eclipse.statet.r.core.rsource.ast.FDef;
 import org.eclipse.statet.r.core.rsource.ast.NodeType;
 import org.eclipse.statet.r.core.rsource.ast.RAstNode;
 import org.eclipse.statet.r.core.rsource.ast.RAsts;
 import org.eclipse.statet.r.core.source.RHeuristicTokenScanner;
 
+
 public class FunctionToS4MethodRefactoring extends Refactoring {
 	
 	
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/refactoring/RRefactoringAdapter.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/refactoring/RRefactoringAdapter.java
index 00b027f..89068dc 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/refactoring/RRefactoringAdapter.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/refactoring/RRefactoringAdapter.java
@@ -44,10 +44,10 @@
 import org.eclipse.statet.r.core.RCoreAccess;
 import org.eclipse.statet.r.core.model.RModel;
 import org.eclipse.statet.r.core.model.RSourceUnit;
-import org.eclipse.statet.r.core.rlang.RTerminal;
 import org.eclipse.statet.r.core.rsource.RLexer;
 import org.eclipse.statet.r.core.rsource.RSourceConstants;
 import org.eclipse.statet.r.core.rsource.RSourceIndenter;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 import org.eclipse.statet.r.core.rsource.ast.Assignment;
 import org.eclipse.statet.r.core.rsource.ast.RAstNode;
 import org.eclipse.statet.r.core.rsource.ast.RParser;
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/refactoring/RenameInRegionRefactoring.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/refactoring/RenameInRegionRefactoring.java
index 14df365..3d761b1 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/refactoring/RenameInRegionRefactoring.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/refactoring/RenameInRegionRefactoring.java
@@ -60,13 +60,14 @@
 import org.eclipse.statet.r.core.model.RSourceFrame;
 import org.eclipse.statet.r.core.model.RSourceUnit;
 import org.eclipse.statet.r.core.model.RSourceUnitModelInfo;
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 import org.eclipse.statet.r.core.rsource.ast.GenericVisitor;
 import org.eclipse.statet.r.core.rsource.ast.NodeType;
 import org.eclipse.statet.r.core.rsource.ast.RAstNode;
 import org.eclipse.statet.r.core.rsource.ast.RAsts;
 import org.eclipse.statet.r.core.source.RHeuristicTokenScanner;
 
+
 public class RenameInRegionRefactoring extends Refactoring {
 	
 	
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/refactoring/RenameInWorkspaceRefactoring.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/refactoring/RenameInWorkspaceRefactoring.java
index 6589b1b..95d8c92 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/refactoring/RenameInWorkspaceRefactoring.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/refactoring/RenameInWorkspaceRefactoring.java
@@ -59,7 +59,7 @@
 import org.eclipse.statet.r.core.model.RSourceUnitModelInfo;
 import org.eclipse.statet.r.core.model.RWorkspaceSourceUnit;
 import org.eclipse.statet.r.core.refactoring.RElementSearchProcessor.Mode;
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 import org.eclipse.statet.r.core.rsource.ast.NodeType;
 import org.eclipse.statet.r.core.rsource.ast.RAstNode;
 import org.eclipse.statet.r.core.rsource.ast.RAsts;
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rlang/RTokens.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rlang/RTokens.java
index 4ec109d..9addda6 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rlang/RTokens.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rlang/RTokens.java
@@ -18,6 +18,8 @@
 
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 
+import org.eclipse.statet.r.core.rsource.RTerminal;
+
 
 /**
  * Provides util-method for tokens of the R-language.
@@ -27,6 +29,7 @@
 @NonNullByDefault
 public final class RTokens {
 	
+	
 	public static final String[] CONSTANT_WORDS= new String[] {
 			RTerminal.S_NULL,
 			RTerminal.S_NA,
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/RLexer.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/RLexer.java
index 5b4133e..c8a7940 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/RLexer.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/RLexer.java
@@ -36,7 +36,6 @@
 import org.eclipse.statet.jcommons.text.core.input.TextParserInput;
 
 import org.eclipse.statet.ltk.ast.core.StatusDetail;
-import org.eclipse.statet.r.core.rlang.RTerminal;
 
 
 @NonNullByDefault
@@ -460,7 +459,7 @@
 			found1(in, RTerminal.COMMA);
 			return;
 		case ';':
-			found1(in, RTerminal.SEMI);
+			found1(in, RTerminal.SEMICOLON);
 			return;
 		case '$':
 			found1(in, RTerminal.SUB_NAMED_PART);
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/RSourceConstants.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/RSourceConstants.java
index d1d32c8..2fa9444 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/RSourceConstants.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/RSourceConstants.java
@@ -15,12 +15,17 @@
 package org.eclipse.statet.r.core.rsource;
 
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.util.Version;
 
 
 @NonNullByDefault
 public interface RSourceConstants {
 	
 	
+	Version LANG_VERSION_4_0=           new Version(4, 0, 0);
+	Version LANG_VERSION_4_1=           new Version(4, 1, 0);
+	
+	
 	int STATUS_MASK_1=                  0x0_0000_FF00;
 	int STATUS_MASK_12=                 0x0_000F_FFF0;
 	int STATUS_MASK_3=                  0x0_0000_000F;
@@ -95,6 +100,13 @@
 	int STATUS12_SYNTAX_FDEF_ARGS_MISSING=                  STATUS1_SYNTAX_INCOMPLETE_FDEF | 0x10 | STATUSFLAG_REAL_ERROR;
 	int STATUS12_SYNTAX_FDEF_ARGS_NOT_CLOSED=               STATUS1_SYNTAX_INCOMPLETE_FDEF | 0x20 | STATUSFLAG_REAL_ERROR;
 	
+	/**
+	 * Syntax not supported by current config.
+	 */
+	int STATUS1_SYNTAX_INCOMPATIBLE=                    0x1700;
+	int STATUS12_SYNTAX_UNSUPPORTED_IN_LANG_VERSION=        STATUS1_SYNTAX_INCOMPATIBLE | 0x10 | STATUSFLAG_REAL_ERROR;
+	int STATUS12_SYNTAX_OPTIONAL_IN_LANG_VERSION=           STATUS1_SYNTAX_INCOMPATIBLE | 0x20;
+	
 	int STATUS3_IF=                     0x1;
 	int STATUS3_ELSE=                   0x2;
 	int STATUS3_FOR=                    0x3;
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rlang/RTerminal.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/RTerminal.java
similarity index 60%
rename from r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rlang/RTerminal.java
rename to r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/RTerminal.java
index 86693e9..d8253e5 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rlang/RTerminal.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/RTerminal.java
@@ -12,99 +12,100 @@
  #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
  #=============================================================================*/
 
-package org.eclipse.statet.r.core.rlang;
+package org.eclipse.statet.r.core.rsource;
+
+import static org.eclipse.statet.r.core.rsource.RSourceConstants.LANG_VERSION_4_0;
 
 import org.eclipse.statet.jcommons.lang.NonNull;
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.util.Version;
 
 
 @NonNullByDefault
 public enum RTerminal {
 	
 	EOF (""), //$NON-NLS-1$
-	BLANK (" "), //$NON-NLS-1$
+	BLANK (RTerminal.S_WHITESPACE),
 	LINEBREAK ("\n"), //$NON-NLS-1$
-	COMMENT ("#"), //$NON-NLS-1$
+	COMMENT (RTerminal.S_COMMENT),
 	ROXYGEN_COMMENT ("#'"), //$NON-NLS-1$
 	UNKNOWN (""), //$NON-NLS-1$
 	OTHER (""), //$NON-NLS-1$
 	
-	BLOCK_OPEN ("{"), //$NON-NLS-1$
-	BLOCK_CLOSE ("}"), //$NON-NLS-1$
-	GROUP_OPEN ("("), //$NON-NLS-1$
-	GROUP_CLOSE (")"), //$NON-NLS-1$
+	BLOCK_OPEN (RTerminal.S_BLOCK_OPEN),
+	BLOCK_CLOSE (RTerminal.S_BLOCK_CLOSE),
+	GROUP_OPEN (RTerminal.S_GROUP_OPEN),
+	GROUP_CLOSE (RTerminal.S_GROUP_CLOSE),
 	
-	SUB_INDEXED_S_OPEN ("["), //$NON-NLS-1$
-	SUB_INDEXED_D_OPEN ("[["), //$NON-NLS-1$
-	SUB_INDEXED_CLOSE ("]"), //$NON-NLS-1$
-	SUB_NAMED_PART ("$"), //$NON-NLS-1$
-	SUB_NAMED_SLOT ("@"), //$NON-NLS-1$
+	SUB_INDEXED_S_OPEN (RTerminal.S_SUB_INDEXED_OPEN),
+	SUB_INDEXED_D_OPEN (RTerminal.S_SUB_INDEXED_D_OPEN),
+	SUB_INDEXED_CLOSE (RTerminal.S_SUB_INDEXED_CLOSE),
+	SUB_NAMED_PART (RTerminal.S_SUB_NAMED),
+	SUB_NAMED_SLOT (RTerminal.S_SUB_AT),
 	
-	NS_GET ("::"), //$NON-NLS-1$
-	NS_GET_INT (":::"), //$NON-NLS-1$
+	NS_GET (RTerminal.S_NS_GET),
+	NS_GET_INT (RTerminal.S_NS_GET_INT),
 	
-	PLUS ("+"), //$NON-NLS-1$
-	MINUS ("-"), //$NON-NLS-1$
-	MULT ("*"), //$NON-NLS-1$
-	DIV ("/"), //$NON-NLS-1$
-	OR ("|"), //$NON-NLS-1$
-	OR_D ("||"), //$NON-NLS-1$
-	AND ("&"), //$NON-NLS-1$
-	AND_D ("&&"), //$NON-NLS-1$
-	NOT ("!"), //$NON-NLS-1$
-	POWER ("^"), //$NON-NLS-1$
-	SEQ (":"), //$NON-NLS-1$
-	SPECIAL ("%"), //$NON-NLS-1$
+	PLUS (RTerminal.S_PLUS),
+	MINUS (RTerminal.S_MINUS),
+	MULT (RTerminal.S_MULT),
+	DIV (RTerminal.S_DIV),
+	OR (RTerminal.S_OR),
+	OR_D (RTerminal.S_OR_D),
+	AND (RTerminal.S_AND),
+	AND_D (RTerminal.S_AND_D),
+	NOT (RTerminal.S_NOT),
+	POWER (RTerminal.S_POWER),
+	SEQ (RTerminal.S_COLON),
+	SPECIAL (RTerminal.S_SPECIAL),
 	
-	QUESTIONMARK ("?"), //$NON-NLS-1$
-	COMMA (","), //$NON-NLS-1$
-	SEMI (";"), //$NON-NLS-1$
+	QUESTIONMARK (RTerminal.S_QUESTIONMARK),
+	COMMA (RTerminal.S_COMMA),
+	SEMICOLON (RTerminal.S_SEMICOLON),
 	
-	ARROW_LEFT_S ("<-"), //$NON-NLS-1$
-	ARROW_LEFT_D ("<<-"), //$NON-NLS-1$
-	ARROW_RIGHT_S ("->"), //$NON-NLS-1$
-	ARROW_RIGHT_D ("->>"), //$NON-NLS-1$
-	EQUAL ("="), //$NON-NLS-1$
-	COLON_EQUAL (":="), //$NON-NLS-1$
-	TILDE ("~"), //$NON-NLS-1$
-	REL_NE ("!="), //$NON-NLS-1$
-	REL_EQ ("=="), //$NON-NLS-1$
-	REL_LT ("<"), //$NON-NLS-1$
-	REL_LE ("<="), //$NON-NLS-1$
-	REL_GT (">"), //$NON-NLS-1$
-	REL_GE (">="), //$NON-NLS-1$
+	ARROW_LEFT_S (RTerminal.S_ARROW_LEFT),
+	ARROW_LEFT_D (RTerminal.S_ARROW_LEFT_D),
+	ARROW_RIGHT_S (RTerminal.S_ARROW_RIGHT),
+	ARROW_RIGHT_D (RTerminal.S_ARROW_RIGHT_D),
+	EQUAL (RTerminal.S_EQUAL),
+	COLON_EQUAL (":="),
+	TILDE (RTerminal.S_TILDE),
+	REL_NE (RTerminal.S_REL_NE),
+	REL_EQ (RTerminal.S_REL_EQ),
+	REL_LT (RTerminal.S_REL_LT),
+	REL_LE (RTerminal.S_REL_LE),
+	REL_GT (RTerminal.S_REL_GT),
+	REL_GE (RTerminal.S_REL_GE),
 	
-	IF ("if"), //$NON-NLS-1$
-	ELSE ("else"), //$NON-NLS-1$
-	FOR ("for"), //$NON-NLS-1$
-	IN ("in"), //$NON-NLS-1$
-	WHILE ("while"), //$NON-NLS-1$
-	REPEAT ("repeat"), //$NON-NLS-1$
-	NEXT ("next"), //$NON-NLS-1$
-	BREAK ("break"), //$NON-NLS-1$
-	FUNCTION ("function"), //$NON-NLS-1$
+	IF (RTerminal.S_IF),
+	ELSE (RTerminal.S_ELSE),
+	FOR (RTerminal.S_FOR),
+	IN (RTerminal.S_IN),
+	WHILE (RTerminal.S_WHILE),
+	REPEAT (RTerminal.S_REPEAT),
+	NEXT (RTerminal.S_NEXT),
+	BREAK (RTerminal.S_BREAK),
+	FUNCTION (RTerminal.S_FUNCTION),
 	
 	SYMBOL (""), //$NON-NLS-1$
 	SYMBOL_G ("`"), //$NON-NLS-1$
 	NUM_INT (""), //$NON-NLS-1$
 	NUM_NUM (""), //$NON-NLS-1$
 	NUM_CPLX (""), //$NON-NLS-1$
-	STRING_D ("\""), //$NON-NLS-1$
-	STRING_S ("\'"), //$NON-NLS-1$
+	STRING_D (RTerminal.S_QUOT_D),
+	STRING_S (RTerminal.S_QUOT_S),
 	STRING_R ("r\"("), //$NON-NLS-1$
 	
-	NULL ("NULL"), //$NON-NLS-1$
-	TRUE ("TRUE"), //$NON-NLS-1$
-	FALSE ("FALSE"), //$NON-NLS-1$
-	NA ("NA"), //$NON-NLS-1$
-	NA_INT ("NA_integer_"), //$NON-NLS-1$
-	NA_REAL ("NA_real_"), //$NON-NLS-1$
-	NA_CPLX ("NA_complex_"), //$NON-NLS-1$
-	NA_CHAR ("NA_character_"), //$NON-NLS-1$
-	NAN ("NaN"), //$NON-NLS-1$
-	INF ("Inf"), //$NON-NLS-1$
-	
-	;
+	NULL (RTerminal.S_NULL),
+	TRUE (RTerminal.S_TRUE),
+	FALSE (RTerminal.S_FALSE),
+	NA (RTerminal.S_NA),
+	NA_INT (RTerminal.S_NA_INT),
+	NA_REAL (RTerminal.S_NA_REAL),
+	NA_CPLX (RTerminal.S_NA_CPLX),
+	NA_CHAR (RTerminal.S_NA_CHAR),
+	NAN (RTerminal.S_NAN),
+	INF (RTerminal.S_INF);
 	
 	
 	public static final String S_WHITESPACE= " "; //$NON-NLS-1$
@@ -117,7 +118,7 @@
 	public static final String S_BLOCK_CLOSE= "}"; //$NON-NLS-1$
 	public static final String S_GROUP_OPEN= "("; //$NON-NLS-1$
 	public static final String S_GROUP_CLOSE= ")"; //$NON-NLS-1$
-	public static final String S_SUB_INDEXED_S_OPEN= "["; //$NON-NLS-1$
+	public static final String S_SUB_INDEXED_OPEN= "["; //$NON-NLS-1$
 	public static final String S_SUB_INDEXED_D_OPEN= "[["; //$NON-NLS-1$
 	public static final String S_SUB_INDEXED_CLOSE= "]"; //$NON-NLS-1$
 	public static final String S_SUB_NAMED= "$"; //$NON-NLS-1$
@@ -134,17 +135,17 @@
 	public static final String S_AND_D= "&&"; //$NON-NLS-1$
 	public static final String S_NOT= "!"; //$NON-NLS-1$
 	public static final String S_POWER= "^"; //$NON-NLS-1$
-	public static final String S_SEQ= ":"; //$NON-NLS-1$
+	public static final String S_COLON= ":"; //$NON-NLS-1$
 	public static final String S_SPECIAL= "%"; //$NON-NLS-1$
-	public static final String S_HELP= "?"; //$NON-NLS-1$
+	public static final String S_QUESTIONMARK= "?"; //$NON-NLS-1$
 	public static final String S_COMMA= ","; //$NON-NLS-1$
-	public static final String S_SEMI= ";"; //$NON-NLS-1$
-	public static final String S_ASSIGN_LEFT= "<-"; //$NON-NLS-1$
-	public static final String S_ASSIGN_LEFT_D= "<<-"; //$NON-NLS-1$
-	public static final String S_ASSIGN_RIGHT= "->"; //$NON-NLS-1$
-	public static final String S_ASSIGN_RIGHT_D= "->>"; //$NON-NLS-1$
+	public static final String S_SEMICOLON= ";"; //$NON-NLS-1$
+	public static final String S_ARROW_LEFT= "<-"; //$NON-NLS-1$
+	public static final String S_ARROW_LEFT_D= "<<-"; //$NON-NLS-1$
+	public static final String S_ARROW_RIGHT= "->"; //$NON-NLS-1$
+	public static final String S_ARROW_RIGHT_D= "->>"; //$NON-NLS-1$
 	public static final String S_EQUAL= "="; //$NON-NLS-1$
-	public static final String S_MODEL= "~"; //$NON-NLS-1$
+	public static final String S_TILDE= "~"; //$NON-NLS-1$
 	public static final String S_REL_NE= "!="; //$NON-NLS-1$
 	public static final String S_REL_EQ= "=="; //$NON-NLS-1$
 	public static final String S_REL_LT= "<"; //$NON-NLS-1$
@@ -161,8 +162,8 @@
 	public static final String S_BREAK= "break"; //$NON-NLS-1$
 	public static final String S_FUNCTION= "function"; //$NON-NLS-1$
 	public static final String S_ELLIPSIS= "..."; //$NON-NLS-1$
-	public static final String S_STRING_S= "\'"; //$NON-NLS-1$
-	public static final String S_STRING_D= "\""; //$NON-NLS-1$
+	public static final String S_QUOT_S= "\'"; //$NON-NLS-1$
+	public static final String S_QUOT_D= "\""; //$NON-NLS-1$
 	public static final String S_TRUE= "TRUE"; //$NON-NLS-1$
 	public static final String S_FALSE= "FALSE"; //$NON-NLS-1$
 	public static final String S_NA= "NA"; //$NON-NLS-1$
@@ -186,8 +187,21 @@
 	
 	public final String text;
 	
-	RTerminal(final String text) {
+	private final Version minRLangVersion;
+	
+	
+	RTerminal(final String text, final Version minRLangVersion) {
 		this.text= text;
+		this.minRLangVersion= minRLangVersion;
+	}
+	
+	RTerminal(final String text) {
+		this(text, LANG_VERSION_4_0);
+	}
+	
+	
+	public Version getMinRLangVersion() {
+		return this.minRLangVersion;
 	}
 	
 }
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Arithmetic.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Arithmetic.java
index b77c1ff..588afea 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Arithmetic.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Arithmetic.java
@@ -18,7 +18,7 @@
 
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 /**
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Assignment.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Assignment.java
index b70da40..1f3e5ce 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Assignment.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Assignment.java
@@ -18,7 +18,7 @@
 
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 /**
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Block.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Block.java
index 33ea490..839faf5 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Block.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Block.java
@@ -18,7 +18,7 @@
 
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 /**
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CForLoop.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CForLoop.java
index b23df08..b58224e 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CForLoop.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CForLoop.java
@@ -25,7 +25,7 @@
 
 import org.eclipse.statet.ltk.ast.core.AstNode;
 import org.eclipse.statet.ltk.ast.core.AstVisitor;
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 /**
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CIfElse.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CIfElse.java
index c4c890e..4bb2bfd 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CIfElse.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CIfElse.java
@@ -26,7 +26,7 @@
 
 import org.eclipse.statet.ltk.ast.core.AstNode;
 import org.eclipse.statet.ltk.ast.core.AstVisitor;
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 /**
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CLoopCommand.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CLoopCommand.java
index ebf9eac..f768586 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CLoopCommand.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CLoopCommand.java
@@ -21,7 +21,7 @@
 
 import org.eclipse.statet.ltk.ast.core.AstNode;
 import org.eclipse.statet.ltk.ast.core.AstVisitor;
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 /**
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CRepeatLoop.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CRepeatLoop.java
index bcd6b97..a6489f8 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CRepeatLoop.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CRepeatLoop.java
@@ -24,7 +24,7 @@
 
 import org.eclipse.statet.ltk.ast.core.AstNode;
 import org.eclipse.statet.ltk.ast.core.AstVisitor;
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 /**
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CWhileLoop.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CWhileLoop.java
index 82e4174..e9bb0c8 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CWhileLoop.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/CWhileLoop.java
@@ -25,7 +25,7 @@
 
 import org.eclipse.statet.ltk.ast.core.AstNode;
 import org.eclipse.statet.ltk.ast.core.AstVisitor;
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 /**
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Comment.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Comment.java
index 6670c1a..f1ad05a 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Comment.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Comment.java
@@ -21,7 +21,7 @@
 
 import org.eclipse.statet.ltk.ast.core.AstNode;
 import org.eclipse.statet.ltk.ast.core.AstVisitor;
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 @NonNullByDefault
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/DocuComment.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/DocuComment.java
index 76873ab..d4d03c9 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/DocuComment.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/DocuComment.java
@@ -24,7 +24,7 @@
 
 import org.eclipse.statet.ltk.ast.core.AstNode;
 import org.eclipse.statet.ltk.ast.core.AstVisitor;
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 /**
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/DocuTag.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/DocuTag.java
index d742fcc..a7dfbf7 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/DocuTag.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/DocuTag.java
@@ -23,7 +23,7 @@
 
 import org.eclipse.statet.ltk.ast.core.AstNode;
 import org.eclipse.statet.ltk.ast.core.AstVisitor;
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 @NonNullByDefault
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/DocuText.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/DocuText.java
index b76a0ba..03bfed1 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/DocuText.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/DocuText.java
@@ -22,7 +22,7 @@
 
 import org.eclipse.statet.ltk.ast.core.AstNode;
 import org.eclipse.statet.ltk.ast.core.AstVisitor;
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 @NonNullByDefault
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Dummy.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Dummy.java
index 987cb7b..6b3b7f1 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Dummy.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Dummy.java
@@ -24,7 +24,7 @@
 
 import org.eclipse.statet.ltk.ast.core.AstNode;
 import org.eclipse.statet.ltk.ast.core.AstVisitor;
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 /**
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/FCall.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/FCall.java
index 8bed5f5..f1b238d 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/FCall.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/FCall.java
@@ -28,7 +28,7 @@
 
 import org.eclipse.statet.ltk.ast.core.AstNode;
 import org.eclipse.statet.ltk.ast.core.AstVisitor;
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 /**
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/FDef.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/FDef.java
index da909fe..e6d5c77 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/FDef.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/FDef.java
@@ -28,7 +28,7 @@
 
 import org.eclipse.statet.ltk.ast.core.AstNode;
 import org.eclipse.statet.ltk.ast.core.AstVisitor;
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 /**
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Group.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Group.java
index e540196..0614c1f 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Group.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Group.java
@@ -23,7 +23,7 @@
 
 import org.eclipse.statet.ltk.ast.core.AstNode;
 import org.eclipse.statet.ltk.ast.core.AstVisitor;
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 /**
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Help.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Help.java
index 4d0b9fa..0dca0bb 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Help.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Help.java
@@ -24,7 +24,7 @@
 
 import org.eclipse.statet.ltk.ast.core.AstNode;
 import org.eclipse.statet.ltk.ast.core.AstVisitor;
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 /**
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Logical.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Logical.java
index 0ee2763..35b6a7c 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Logical.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Logical.java
@@ -18,7 +18,7 @@
 
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 /**
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Model.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Model.java
index 9966e4f..50812f8 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Model.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Model.java
@@ -24,7 +24,7 @@
 
 import org.eclipse.statet.ltk.ast.core.AstNode;
 import org.eclipse.statet.ltk.ast.core.AstVisitor;
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 /**
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/NSGet.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/NSGet.java
index ecdc54f..2c31924 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/NSGet.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/NSGet.java
@@ -21,7 +21,7 @@
 
 import org.eclipse.statet.ltk.ast.core.AstNode;
 import org.eclipse.statet.ltk.ast.core.AstVisitor;
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 /**
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/NullConst.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/NullConst.java
index 1c3a65a..695ae99 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/NullConst.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/NullConst.java
@@ -21,7 +21,7 @@
 
 import org.eclipse.statet.ltk.ast.core.AstNode;
 import org.eclipse.statet.ltk.ast.core.AstVisitor;
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 /**
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/NumberConst.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/NumberConst.java
index 62410f0..0e69550 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/NumberConst.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/NumberConst.java
@@ -20,7 +20,7 @@
 import org.eclipse.statet.jcommons.lang.Nullable;
 import org.eclipse.statet.jcommons.text.core.TextRegion;
 
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 /**
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Power.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Power.java
index ae3bd0e..e0257f8 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Power.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Power.java
@@ -18,7 +18,7 @@
 
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 /**
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/RAstNode.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/RAstNode.java
index 3c99200..107d17f 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/RAstNode.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/RAstNode.java
@@ -24,7 +24,7 @@
 
 import org.eclipse.statet.ltk.ast.core.AstNode;
 import org.eclipse.statet.ltk.ast.core.impl.AbstractAstNode;
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 /**
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/RParser.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/RParser.java
index dc9251f..c34b523 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/RParser.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/RParser.java
@@ -18,8 +18,6 @@
 
 import static org.eclipse.statet.ltk.ast.core.AstNode.NA_OFFSET;
 import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS123_SYNTAX_SEQREL_UNEXPECTED;
-import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS12_SYNTAX_TOKEN_UNEXPECTED;
-import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS12_SYNTAX_TOKEN_UNKNOWN;
 import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS12_SYNTAX_CC_NOT_CLOSED;
 import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS12_SYNTAX_CONDITION_MISSING;
 import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS12_SYNTAX_CONDITION_NOT_CLOSED;
@@ -35,6 +33,8 @@
 import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS12_SYNTAX_OPERATOR_MISSING;
 import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS12_SYNTAX_SUBINDEXED_NOT_CLOSED;
 import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS12_SYNTAX_SYMBOL_MISSING;
+import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS12_SYNTAX_TOKEN_UNEXPECTED;
+import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS12_SYNTAX_TOKEN_UNKNOWN;
 import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS3_FDEF;
 import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS3_FOR;
 import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS3_IF;
@@ -55,13 +55,15 @@
 import org.eclipse.statet.jcommons.string.BasicStringFactory;
 import org.eclipse.statet.jcommons.string.StringFactory;
 import org.eclipse.statet.jcommons.text.core.input.TextParserInput;
+import org.eclipse.statet.jcommons.util.Version;
 
 import org.eclipse.statet.internal.r.core.RCorePlugin;
 import org.eclipse.statet.ltk.ast.core.AstInfo;
 import org.eclipse.statet.ltk.ast.core.AstNode;
 import org.eclipse.statet.ltk.ast.core.StatusDetail;
-import org.eclipse.statet.r.core.rlang.RTerminal;
 import org.eclipse.statet.r.core.rsource.RLexer;
+import org.eclipse.statet.r.core.rsource.RSourceConstants;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 import org.eclipse.statet.r.core.rsource.ast.RAstNode.Assoc;
 
 
@@ -145,12 +147,37 @@
 		
 	}
 	
-	private final static RScannerPostExprVisitor POST_VISITOR= new RScannerPostExprVisitor();
+	private static final RScannerPostExprVisitor POST_VISITOR= new RScannerPostExprVisitor();
+	
+	
+	private static final Version DEFAULT_LANG_VERSION= RSourceConstants.LANG_VERSION_4_1;
+	private static final int LANG_VERSION_4_0= 0;
+	private static final int LANG_VERSION_4_1= 1;
+	
+	private static int toRLangVersionInt(final Version version) {
+		if (version.compareTo(RSourceConstants.LANG_VERSION_4_1) >= 0) {
+			return LANG_VERSION_4_1;
+		}
+		return LANG_VERSION_4_0;
+	}
+	
+	private static Version toRLangVersionObj(final int version) {
+		switch (version) {
+		case LANG_VERSION_4_0:
+			return RSourceConstants.LANG_VERSION_4_0;
+		case LANG_VERSION_4_1:
+			return RSourceConstants.LANG_VERSION_4_1;
+		default:
+			throw new IllegalArgumentException();
+		}
+	}
 	
 	
 	private final RLexer lexer;
 	private final int level;
 	
+	private int rLangVersion;
+	
 	private RTerminal nextType;
 	private boolean wasLinebreak;
 	
@@ -162,23 +189,25 @@
 	private final StringFactory symbolTextFactory;
 	
 	
-	public RParser(final int level) {
-		this(level, (StringFactory)null);
+	public RParser(final Version rLangVersion,
+			final int level, final RLexer lexer, final StringFactory symbolTextFactory) {
+		this.level= level;
+		this.lexer= nonNullAssert(lexer);
+		setRLangVersion(rLangVersion);
+		
+		this.createText= ((level & AstInfo.DEFAULT_LEVEL_MASK) > AstInfo.LEVEL_MINIMAL);
+		this.symbolTextFactory= (symbolTextFactory != null) ? symbolTextFactory : BasicStringFactory.INSTANCE;
 	}
 	
 	public RParser(final int level, final StringFactory symbolTextFactory) {
-		this(level, new RLexer((level == AstInfo.LEVEL_MINIMAL) ?
+		this(DEFAULT_LANG_VERSION, level, new RLexer((level == AstInfo.LEVEL_MINIMAL) ?
 						(RLexer.DEFAULT | LEXER_CONFIG | RLexer.ENABLE_QUICK_CHECK) :
 						(RLexer.DEFAULT | LEXER_CONFIG) ),
 				symbolTextFactory );
 	}
 	
-	public RParser(final int level, final RLexer lexer, final StringFactory symbolTextFactory) {
-		this.level= level;
-		this.lexer= nonNullAssert(lexer);
-		
-		this.createText= ((level & AstInfo.DEFAULT_LEVEL_MASK) > AstInfo.LEVEL_MINIMAL);
-		this.symbolTextFactory= (symbolTextFactory != null) ? symbolTextFactory : BasicStringFactory.INSTANCE;
+	public RParser(final int level) {
+		this(level, (StringFactory)null);
 	}
 	
 	
@@ -192,6 +221,14 @@
 		}
 	}
 	
+	public Version getRLangVersion() {
+		return toRLangVersionObj(this.rLangVersion);
+	}
+	
+	public void setRLangVersion(final Version langVersion) {
+		this.rLangVersion= toRLangVersionInt(langVersion);
+	}
+	
 	public int getAstLevel() {
 		return this.level;
 	}
@@ -335,7 +372,7 @@
 					}
 					switch (this.nextType) {
 					
-					case SEMI:
+					case SEMICOLON:
 						if (expr != null) {
 							node.setSeparator(this.lexer.getOffset());
 							consumeToken();
@@ -604,7 +641,7 @@
 				continue ITER_TOKEN;
 				
 			case COMMA:
-			case SEMI:
+			case SEMICOLON:
 			case SUB_INDEXED_CLOSE:
 			case BLOCK_CLOSE:
 			case GROUP_CLOSE:
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Relational.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Relational.java
index 2d64179..c8d0371 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Relational.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Relational.java
@@ -18,7 +18,7 @@
 
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 /**
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/RoxygenParser.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/RoxygenParser.java
index 89cf977..641a034 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/RoxygenParser.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/RoxygenParser.java
@@ -34,7 +34,7 @@
 import org.eclipse.statet.internal.r.core.rd.RdRCodeParserInput;
 import org.eclipse.statet.internal.r.core.sourcemodel.RoxygenTagType;
 import org.eclipse.statet.ltk.ast.core.AstInfo;
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 import org.eclipse.statet.r.core.rsource.ast.Symbol.G;
 
 
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Seq.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Seq.java
index 8716cc3..54e8fcf 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Seq.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Seq.java
@@ -18,7 +18,7 @@
 
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 /**
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Sign.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Sign.java
index 227a5ae..9beeb67 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Sign.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Sign.java
@@ -23,7 +23,7 @@
 
 import org.eclipse.statet.ltk.ast.core.AstNode;
 import org.eclipse.statet.ltk.ast.core.AstVisitor;
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 /**
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SourceComponent.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SourceComponent.java
index 21ab045..52b72f8 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SourceComponent.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SourceComponent.java
@@ -21,7 +21,7 @@
 import org.eclipse.statet.jcommons.lang.Nullable;
 
 import org.eclipse.statet.ltk.ast.core.AstNode;
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 @NonNullByDefault
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SpecItem.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SpecItem.java
index e171116..e6a0485 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SpecItem.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SpecItem.java
@@ -23,7 +23,7 @@
 
 import org.eclipse.statet.ltk.ast.core.AstNode;
 import org.eclipse.statet.ltk.ast.core.AstVisitor;
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 /**
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SpecList.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SpecList.java
index b6da997..6879a22 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SpecList.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SpecList.java
@@ -24,7 +24,7 @@
 
 import org.eclipse.statet.ltk.ast.core.AstNode;
 import org.eclipse.statet.ltk.ast.core.AstVisitor;
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 /**
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Special.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Special.java
index 792ca6e..4b4cfdf 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Special.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Special.java
@@ -20,7 +20,7 @@
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.lang.Nullable;
 
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 @NonNullByDefault
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/StringConst.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/StringConst.java
index af96aa2..7e9e4c8 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/StringConst.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/StringConst.java
@@ -20,7 +20,7 @@
 import org.eclipse.statet.jcommons.lang.Nullable;
 import org.eclipse.statet.jcommons.text.core.TextRegion;
 
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 /**
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SubIndexed.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SubIndexed.java
index 28fe70b..c4c478b 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SubIndexed.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SubIndexed.java
@@ -26,7 +26,7 @@
 
 import org.eclipse.statet.ltk.ast.core.AstNode;
 import org.eclipse.statet.ltk.ast.core.AstVisitor;
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 /**
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SubNamed.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SubNamed.java
index d0dcf50..e80fb59 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SubNamed.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/SubNamed.java
@@ -23,7 +23,7 @@
 
 import org.eclipse.statet.ltk.ast.core.AstNode;
 import org.eclipse.statet.ltk.ast.core.AstVisitor;
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 /**
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Symbol.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Symbol.java
index 89ca667..d9c87f5 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Symbol.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/r/core/rsource/ast/Symbol.java
@@ -21,7 +21,7 @@
 import org.eclipse.statet.jcommons.lang.Nullable;
 import org.eclipse.statet.jcommons.text.core.TextRegion;
 
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 /**
diff --git a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/preferences/RTextStylesPreferencePage.java b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/preferences/RTextStylesPreferencePage.java
index eb94ac2..906c4db 100644
--- a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/preferences/RTextStylesPreferencePage.java
+++ b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/preferences/RTextStylesPreferencePage.java
@@ -34,7 +34,7 @@
 import org.eclipse.statet.ltk.ui.sourceediting.SourceEditorViewerConfiguration;
 import org.eclipse.statet.ltk.ui.util.CombinedPreferenceStore;
 import org.eclipse.statet.r.core.RCore;
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 import org.eclipse.statet.r.core.source.RDocumentContentInfo;
 import org.eclipse.statet.r.core.source.RDocumentSetupParticipant;
 import org.eclipse.statet.r.ui.RUI;
diff --git a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/editors/templates/REditorContext.java b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/editors/templates/REditorContext.java
index 93675c5..b20fee1 100644
--- a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/editors/templates/REditorContext.java
+++ b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/editors/templates/REditorContext.java
@@ -39,9 +39,9 @@
 import org.eclipse.statet.r.core.RCodeStyleSettings;
 import org.eclipse.statet.r.core.RCore;
 import org.eclipse.statet.r.core.RCoreAccess;
-import org.eclipse.statet.r.core.rlang.RTerminal;
 import org.eclipse.statet.r.core.rlang.RTokens;
 import org.eclipse.statet.r.core.rsource.RLexer;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 import org.eclipse.statet.r.ui.editors.RSourceEditor;
 
 
diff --git a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/sourceediting/RPathCompletionComputer.java b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/sourceediting/RPathCompletionComputer.java
index f130fe9..503211a 100644
--- a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/sourceediting/RPathCompletionComputer.java
+++ b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/sourceediting/RPathCompletionComputer.java
@@ -51,8 +51,8 @@
 import org.eclipse.statet.nico.ui.console.ConsolePageEditor;
 import org.eclipse.statet.r.console.core.RProcess;
 import org.eclipse.statet.r.core.RUtil;
-import org.eclipse.statet.r.core.rlang.RTerminal;
 import org.eclipse.statet.r.core.rsource.RLexer;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 /**
diff --git a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/text/r/IRTextTokens.java b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/text/r/IRTextTokens.java
index 522fbb8..e653af1 100644
--- a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/text/r/IRTextTokens.java
+++ b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/text/r/IRTextTokens.java
@@ -14,7 +14,7 @@
 
 package org.eclipse.statet.r.ui.text.r;
 
-import org.eclipse.statet.r.core.rlang.RTerminal;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 /**
@@ -75,7 +75,7 @@
 	};
 	public static final RTerminal[] SEPARATOR = new RTerminal[] {
 		RTerminal.COMMA,
-		RTerminal.SEMI,
+		RTerminal.SEMICOLON,
 	};
 	public static final RTerminal[] NSGET = new RTerminal[] {
 		RTerminal.NS_GET,
diff --git a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/text/r/RDefaultTextStyleScanner.java b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/text/r/RDefaultTextStyleScanner.java
index 902b548..e3aeafa 100644
--- a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/text/r/RDefaultTextStyleScanner.java
+++ b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/r/ui/text/r/RDefaultTextStyleScanner.java
@@ -31,8 +31,8 @@
 
 import org.eclipse.statet.internal.r.ui.RIdentifierGroups;
 import org.eclipse.statet.internal.r.ui.RUIPlugin;
-import org.eclipse.statet.r.core.rlang.RTerminal;
 import org.eclipse.statet.r.core.rsource.RLexer;
+import org.eclipse.statet.r.core.rsource.RTerminal;
 
 
 /**