Throw exceptions (not errors) from lexer

+ Add more data to the exception message
This commit is contained in:
Andrey Breslav
2014-05-27 18:17:18 +04:00
parent 453fdb0dbe
commit e50eb73fb1
5 changed files with 42 additions and 9 deletions
+6
View File
@@ -36,6 +36,12 @@
<target name="lexer">
<flex flexfile="${home}/src/org/jetbrains/jet/lexer/Jet.flex"
destdir="${home}/src/org/jetbrains/jet/lexer/"/>
<!-- This is a hack, but we don't want to alter the skeleton we are using now, because being in sync with IDEA is more important-->
<replaceregexp file="${home}/src/org/jetbrains/jet/lexer/_JetLexer.java"
match="throw new KotlinLexerException\(message\);"
replace="throw new KotlinLexerException(message + &quot;\\\\n at '&quot; + yytext() + &quot;'\\\\n&quot; + zzBuffer);"/>
<flex flexfile="${home}/src/org/jetbrains/jet/kdoc/lexer/KDoc.flex"
destdir="${home}/src/org/jetbrains/jet/kdoc/lexer/"/>
</target>
@@ -1,4 +1,4 @@
/* The following code was generated by JFlex 1.4.3 on 3/6/14 2:29 PM */
/* The following code was generated by JFlex 1.4.3 on 5/27/14 6:17 PM */
package org.jetbrains.jet.kdoc.lexer;
@@ -12,7 +12,7 @@ import java.lang.Character;
/**
* This class is a scanner generated by
* <a href="http://www.jflex.de/">JFlex</a> 1.4.3
* on 3/6/14 2:29 PM from the specification file
* on 5/27/14 6:17 PM from the specification file
* <tt>/Users/abreslav/work/kotlin/compiler/frontend/src/org/jetbrains/jet/kdoc/lexer/KDoc.flex</tt>
*/
class _KDocLexer implements FlexLexer {
@@ -5,6 +5,7 @@ import com.intellij.lexer.*;
import com.intellij.psi.*;
import com.intellij.psi.tree.IElementType;
import com.intellij.util.containers.Stack;
import org.jetbrains.jet.lexer.KotlinLexerException;
import org.jetbrains.jet.lexer.JetTokens;
@@ -60,6 +61,8 @@ import org.jetbrains.jet.lexer.JetTokens;
}
%}
%scanerror KotlinLexerException
%function advance
%type IElementType
%eof{
@@ -0,0 +1,23 @@
/*
* Copyright 2010-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.jet.lexer;
public class KotlinLexerException extends RuntimeException {
public KotlinLexerException(String message) {
super(message);
}
}
@@ -1,4 +1,4 @@
/* The following code was generated by JFlex 1.4.3 on 5/14/14 2:02 PM */
/* The following code was generated by JFlex 1.4.3 on 5/27/14 6:17 PM */
package org.jetbrains.jet.lexer;
@@ -7,6 +7,7 @@ import com.intellij.lexer.*;
import com.intellij.psi.*;
import com.intellij.psi.tree.IElementType;
import com.intellij.util.containers.Stack;
import org.jetbrains.jet.lexer.KotlinLexerException;
import org.jetbrains.jet.lexer.JetTokens;
@@ -14,8 +15,8 @@ import org.jetbrains.jet.lexer.JetTokens;
/**
* This class is a scanner generated by
* <a href="http://www.jflex.de/">JFlex</a> 1.4.3
* on 5/14/14 2:02 PM from the specification file
* <tt>/Users/svtk/Kotlin/kotlin/compiler/frontend/src/org/jetbrains/jet/lexer/Jet.flex</tt>
* on 5/27/14 6:17 PM from the specification file
* <tt>/Users/abreslav/work/kotlin/compiler/frontend/src/org/jetbrains/jet/lexer/Jet.flex</tt>
*/
class _JetLexer implements FlexLexer {
/** initial size of the lookahead buffer */
@@ -769,7 +770,7 @@ class _JetLexer implements FlexLexer {
*
* @param errorCode the code of the errormessage to display
*/
private void zzScanError(int errorCode) {
private void zzScanError(int errorCode) throws KotlinLexerException {
String message;
try {
message = ZZ_ERROR_MSG[errorCode];
@@ -778,7 +779,7 @@ class _JetLexer implements FlexLexer {
message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
}
throw new Error(message);
throw new KotlinLexerException(message + "\n at '" + yytext() + "'\n" + zzBuffer);
}
@@ -790,7 +791,7 @@ class _JetLexer implements FlexLexer {
* @param number the number of characters to be read again.
* This number must not be greater than yylength()!
*/
public void yypushback(int number) {
public void yypushback(int number) throws KotlinLexerException {
if ( number > yylength() )
zzScanError(ZZ_PUSHBACK_2BIG);
@@ -818,7 +819,7 @@ class _JetLexer implements FlexLexer {
* @return the next token
* @exception java.io.IOException if any I/O-Error occurs
*/
public IElementType advance() throws java.io.IOException {
public IElementType advance() throws java.io.IOException, KotlinLexerException {
int zzInput;
int zzAction;