mirror of
https://github.com/enso-org/enso.git
synced 2025-01-03 16:44:05 +03:00
Initial commit
This commit is contained in:
commit
815deda92b
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
project/
|
||||||
|
target/
|
78
build.sbt
Normal file
78
build.sbt
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
// The simplest possible sbt build file is just one line:
|
||||||
|
|
||||||
|
scalaVersion := "2.12.8"
|
||||||
|
// That is, to create a valid sbt build, all you've got to do is define the
|
||||||
|
// version of Scala you'd like your project to use.
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
// Lines like the above defining `scalaVersion` are called "settings" Settings
|
||||||
|
// are key/value pairs. In the case of `scalaVersion`, the key is "scalaVersion"
|
||||||
|
// and the value is "2.12.8"
|
||||||
|
|
||||||
|
// It's possible to define many kinds of settings, such as:
|
||||||
|
|
||||||
|
name := "hello-world"
|
||||||
|
organization := "ch.epfl.scala"
|
||||||
|
version := "1.0"
|
||||||
|
|
||||||
|
// Note, it's not required for you to define these three settings. These are
|
||||||
|
// mostly only necessary if you intend to publish your library's binaries on a
|
||||||
|
// place like Sonatype or Bintray.
|
||||||
|
|
||||||
|
|
||||||
|
// Want to use a published library in your project?
|
||||||
|
// You can define other libraries as dependencies in your build like this:
|
||||||
|
libraryDependencies += "org.typelevel" %% "cats-core" % "1.6.0"
|
||||||
|
// Here, `libraryDependencies` is a set of dependencies, and by using `+=`,
|
||||||
|
// we're adding the cats dependency to the set of dependencies that sbt will go
|
||||||
|
// and fetch when it starts up.
|
||||||
|
// Now, in any Scala file, you can import classes, objects, etc, from cats with
|
||||||
|
// a regular import.
|
||||||
|
|
||||||
|
// TIP: To find the "dependency" that you need to add to the
|
||||||
|
// `libraryDependencies` set, which in the above example looks like this:
|
||||||
|
|
||||||
|
// "org.typelevel" %% "cats-core" % "1.6.0"
|
||||||
|
|
||||||
|
// You can use Scaladex, an index of all known published Scala libraries. There,
|
||||||
|
// after you find the library you want, you can just copy/paste the dependency
|
||||||
|
// information that you need into your build file. For example, on the
|
||||||
|
// typelevel/cats Scaladex page,
|
||||||
|
// https://index.scala-lang.org/typelevel/cats, you can copy/paste the sbt
|
||||||
|
// dependency from the sbt box on the right-hand side of the screen.
|
||||||
|
|
||||||
|
// IMPORTANT NOTE: while build files look _kind of_ like regular Scala, it's
|
||||||
|
// important to note that syntax in *.sbt files doesn't always behave like
|
||||||
|
// regular Scala. For example, notice in this build file that it's not required
|
||||||
|
// to put our settings into an enclosing object or class. Always remember that
|
||||||
|
// sbt is a bit different, semantically, than vanilla Scala.
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
// Most moderately interesting Scala projects don't make use of the very simple
|
||||||
|
// build file style (called "bare style") used in this build.sbt file. Most
|
||||||
|
// intermediate Scala projects make use of so-called "multi-project" builds. A
|
||||||
|
// multi-project build makes it possible to have different folders which sbt can
|
||||||
|
// be configured differently for. That is, you may wish to have different
|
||||||
|
// dependencies or different testing frameworks defined for different parts of
|
||||||
|
// your codebase. Multi-project builds make this possible.
|
||||||
|
|
||||||
|
// Here's a quick glimpse of what a multi-project build looks like for this
|
||||||
|
// build, with only one "subproject" defined, called `root`:
|
||||||
|
|
||||||
|
// lazy val root = (project in file(".")).
|
||||||
|
// settings(
|
||||||
|
// inThisBuild(List(
|
||||||
|
// organization := "ch.epfl.scala",
|
||||||
|
// scalaVersion := "2.12.8"
|
||||||
|
// )),
|
||||||
|
// name := "hello-world"
|
||||||
|
// )
|
||||||
|
|
||||||
|
// To learn more about multi-project builds, head over to the official sbt
|
||||||
|
// documentation at http://www.scala-sbt.org/documentation.html
|
||||||
|
|
||||||
|
SbtJFlexPlugin.jflexSettings
|
||||||
|
|
||||||
|
mainClass in (Compile, run) := Some("org.enso.syntax.text.lexer.Main")
|
23
src/main/java/Utility.java
Normal file
23
src/main/java/Utility.java
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
/** A small utility class. */
|
||||||
|
// TODO: use resource bundle
|
||||||
|
|
||||||
|
package org.enso.syntax.text.lexer;
|
||||||
|
|
||||||
|
class Utility {
|
||||||
|
|
||||||
|
private static final String errorMsg[] = {
|
||||||
|
"Error: Unmatched end-of-comment punctuation.",
|
||||||
|
"Error: Unmatched start-of-comment punctuation.",
|
||||||
|
"Error: Unclosed string.",
|
||||||
|
"Error: Illegal character."
|
||||||
|
};
|
||||||
|
|
||||||
|
public static final int E_ENDCOMMENT = 0;
|
||||||
|
public static final int E_STARTCOMMENT = 1;
|
||||||
|
public static final int E_UNCLOSEDSTR = 2;
|
||||||
|
public static final int E_UNMATCHED = 3;
|
||||||
|
|
||||||
|
public static void error(int code) {
|
||||||
|
System.err.println(errorMsg[code]);
|
||||||
|
}
|
||||||
|
}
|
36
src/main/java/Yytoken.java
Normal file
36
src/main/java/Yytoken.java
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
/** The tokens returned by the scanner. */
|
||||||
|
|
||||||
|
package org.enso.syntax.text.lexer;
|
||||||
|
|
||||||
|
|
||||||
|
class Yytoken {
|
||||||
|
public int m_index;
|
||||||
|
public String m_text;
|
||||||
|
public int m_line;
|
||||||
|
public int m_charBegin;
|
||||||
|
public int m_charEnd;
|
||||||
|
|
||||||
|
Yytoken(int index, String text, int line, int charBegin, int charEnd) {
|
||||||
|
m_index = index;
|
||||||
|
m_text = text;
|
||||||
|
m_line = line;
|
||||||
|
m_charBegin = charBegin;
|
||||||
|
m_charEnd = charEnd;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString() {
|
||||||
|
return "Text : "
|
||||||
|
+ m_text
|
||||||
|
+ "\nindex : "
|
||||||
|
+ m_index
|
||||||
|
+ "\nline : "
|
||||||
|
+ m_line
|
||||||
|
+ "\ncBeg. : "
|
||||||
|
+ m_charBegin
|
||||||
|
+ "\ncEnd. : "
|
||||||
|
+ m_charEnd;
|
||||||
|
}
|
||||||
|
Token test(int i) {
|
||||||
|
return new Var("foo");
|
||||||
|
}
|
||||||
|
}
|
93
src/main/jflex/test.flex
Normal file
93
src/main/jflex/test.flex
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
/* this is the scanner example from the JLex website
|
||||||
|
(with small modifications to make it more readable) */
|
||||||
|
|
||||||
|
package org.enso.syntax.text.lexer;
|
||||||
|
|
||||||
|
%%
|
||||||
|
|
||||||
|
%{
|
||||||
|
private int comment_count = 0;
|
||||||
|
|
||||||
|
public boolean done(){
|
||||||
|
return zzAtEOF;
|
||||||
|
}
|
||||||
|
%}
|
||||||
|
|
||||||
|
%class Lexer
|
||||||
|
%line
|
||||||
|
%column
|
||||||
|
%char
|
||||||
|
%state COMMENT
|
||||||
|
%unicode
|
||||||
|
|
||||||
|
%debug
|
||||||
|
|
||||||
|
ALPHA=[A-Za-z]
|
||||||
|
DIGIT=[0-9]
|
||||||
|
NONNEWLINE_WHITE_SPACE_CHAR=[\ \t\b\012]
|
||||||
|
NEWLINE=\r|\n|\r\n
|
||||||
|
WHITE_SPACE_CHAR=[\n\r\ \t\b\012]
|
||||||
|
STRING_TEXT=(\\\"|[^\n\r\"]|\\{WHITE_SPACE_CHAR}+\\)*
|
||||||
|
COMMENT_TEXT=([^*/\n]|[^*\n]"/"[^*\n]|[^/\n]"*"[^/\n]|"*"[^/\n]|"/"[^*\n])+
|
||||||
|
Ident = {ALPHA}({ALPHA}|{DIGIT}|_)*
|
||||||
|
|
||||||
|
%%
|
||||||
|
|
||||||
|
<YYINITIAL> {
|
||||||
|
"," { return (new Yytoken(0,yytext(),yyline,yychar,yychar+1)); }
|
||||||
|
":" { return (new Yytoken(1,yytext(),yyline,yychar,yychar+1)); }
|
||||||
|
";" { return (new Yytoken(2,yytext(),yyline,yychar,yychar+1)); }
|
||||||
|
"(" { return (new Yytoken(3,yytext(),yyline,yychar,yychar+1)); }
|
||||||
|
")" { return (new Yytoken(4,yytext(),yyline,yychar,yychar+1)); }
|
||||||
|
"[" { return (new Yytoken(5,yytext(),yyline,yychar,yychar+1)); }
|
||||||
|
"]" { return (new Yytoken(6,yytext(),yyline,yychar,yychar+1)); }
|
||||||
|
"{" { return (new Yytoken(7,yytext(),yyline,yychar,yychar+1)); }
|
||||||
|
"}" { return (new Yytoken(8,yytext(),yyline,yychar,yychar+1)); }
|
||||||
|
"." { return (new Yytoken(9,yytext(),yyline,yychar,yychar+1)); }
|
||||||
|
"+" { return (new Yytoken(10,yytext(),yyline,yychar,yychar+1)); }
|
||||||
|
"-" { return (new Yytoken(11,yytext(),yyline,yychar,yychar+1)); }
|
||||||
|
"*" { return (new Yytoken(12,yytext(),yyline,yychar,yychar+1)); }
|
||||||
|
"/" { return (new Yytoken(13,yytext(),yyline,yychar,yychar+1)); }
|
||||||
|
"=" { return (new Yytoken(14,yytext(),yyline,yychar,yychar+1)); }
|
||||||
|
"<>" { return (new Yytoken(15,yytext(),yyline,yychar,yychar+2)); }
|
||||||
|
"<" { return (new Yytoken(16,yytext(),yyline,yychar,yychar+1)); }
|
||||||
|
"<=" { return (new Yytoken(17,yytext(),yyline,yychar,yychar+2)); }
|
||||||
|
">" { return (new Yytoken(18,yytext(),yyline,yychar,yychar+1)); }
|
||||||
|
">=" { return (new Yytoken(19,yytext(),yyline,yychar,yychar+2)); }
|
||||||
|
"&" { return (new Yytoken(20,yytext(),yyline,yychar,yychar+1)); }
|
||||||
|
"|" { return (new Yytoken(21,yytext(),yyline,yychar,yychar+1)); }
|
||||||
|
":=" { return (new Yytoken(22,yytext(),yyline,yychar,yychar+2)); }
|
||||||
|
|
||||||
|
{NONNEWLINE_WHITE_SPACE_CHAR}+ { }
|
||||||
|
|
||||||
|
"/*" { yybegin(COMMENT); comment_count++; }
|
||||||
|
|
||||||
|
\"{STRING_TEXT}\" {
|
||||||
|
String str = yytext().substring(1,yylength()-1);
|
||||||
|
return (new Yytoken(40,str,yyline,yychar,yychar+yylength()));
|
||||||
|
}
|
||||||
|
|
||||||
|
\"{STRING_TEXT} {
|
||||||
|
String str = yytext().substring(1,yytext().length());
|
||||||
|
Utility.error(Utility.E_UNCLOSEDSTR);
|
||||||
|
return (new Yytoken(41,str,yyline,yychar,yychar + str.length()));
|
||||||
|
}
|
||||||
|
|
||||||
|
{DIGIT}+ { return (new Yytoken(42,yytext(),yyline,yychar,yychar+yylength())); }
|
||||||
|
|
||||||
|
{Ident} { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
|
||||||
|
}
|
||||||
|
|
||||||
|
<COMMENT> {
|
||||||
|
"/*" { comment_count++; }
|
||||||
|
"*/" { if (--comment_count == 0) yybegin(YYINITIAL); }
|
||||||
|
{COMMENT_TEXT} { }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
{NEWLINE} { }
|
||||||
|
|
||||||
|
. {
|
||||||
|
System.out.println("Illegal character: <" + yytext() + ">");
|
||||||
|
Utility.error(Utility.E_UNMATCHED);
|
||||||
|
}
|
46
src/main/scala/Main.scala
Normal file
46
src/main/scala/Main.scala
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
|
||||||
|
// import org.enso.Yylex
|
||||||
|
|
||||||
|
package org.enso.syntax.text.lexer
|
||||||
|
import java.io.{StringReader, StringWriter}
|
||||||
|
// import org.enso.syntax.text.lexer.{Token}
|
||||||
|
|
||||||
|
object Main extends App {
|
||||||
|
println("Hello, World!!")
|
||||||
|
val firstFilePos = 0
|
||||||
|
val encodingName = "UTF-8"
|
||||||
|
// if (argv[0].equals("--encoding")) {
|
||||||
|
// firstFilePos = 2
|
||||||
|
// encodingName = argv[1]
|
||||||
|
// try {
|
||||||
|
// java.nio.charset.Charset.forName(encodingName) // Side-effect: is encodingName valid?
|
||||||
|
// } catch (Exception e) {
|
||||||
|
// System.out.println("Invalid encoding '" + encodingName + "'")
|
||||||
|
// return
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// for (int i = firstFilePos i < argv.length i++) {
|
||||||
|
// Yylex scanner = null
|
||||||
|
// // try {
|
||||||
|
// // java.io.FileInputStream stream = new java.io.FileInputStream(argv[i])
|
||||||
|
// // java.io.Reader reader = new java.io.InputStreamReader(stream, encodingName)
|
||||||
|
val reader = new StringReader("15 17")
|
||||||
|
val scanner = new Lexer(reader)
|
||||||
|
do {
|
||||||
|
System.out.println(scanner.yylex())
|
||||||
|
} while (!scanner.done())
|
||||||
|
|
||||||
|
// }
|
||||||
|
// catch (java.io.FileNotFoundException e) {
|
||||||
|
// System.out.println("File not found : \""+argv[i]+"\"")
|
||||||
|
// }
|
||||||
|
// catch (java.io.IOException e) {
|
||||||
|
// System.out.println("IO error scanning file \""+argv[i]+"\"")
|
||||||
|
// System.out.println(e)
|
||||||
|
// }
|
||||||
|
// catch (Exception e) {
|
||||||
|
// System.out.println("Unexpected exception:")
|
||||||
|
// e.printStackTrace()
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
}
|
97
src/main/scala/org/enso/syntax/text/lexer/Token.scala
Normal file
97
src/main/scala/org/enso/syntax/text/lexer/Token.scala
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
/** The tokens returned by the scanner. */
|
||||||
|
|
||||||
|
package org.enso.syntax.text.lexer
|
||||||
|
|
||||||
|
// class Token (index:Int, text:String, line:Int, charBegin:Int, charEnd:Int) {
|
||||||
|
|
||||||
|
// override def toString() : String = {
|
||||||
|
// return "Text : " + text + "\nindex : " + index + "\nline : " + line + "\ncBeg. : " + charBegin + "\ncEnd. : " + charEnd;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// sealed trait Tree[+A]
|
||||||
|
// case object Leaf extends Node[Nothing]
|
||||||
|
// case class Node[A](data: A, left: Tree[A], right: Tree[A]) extends Tree[A]
|
||||||
|
|
||||||
|
abstract class Bound
|
||||||
|
case object Begin extends Bound
|
||||||
|
case object End extends Bound
|
||||||
|
|
||||||
|
abstract class Token
|
||||||
|
case class Var (name:String) extends Token
|
||||||
|
case class Cons (name:String) extends Token
|
||||||
|
case object Wildcard extends Token
|
||||||
|
|
||||||
|
// data Symbol
|
||||||
|
// // Layout
|
||||||
|
// case class STX
|
||||||
|
// case class ETX
|
||||||
|
// case class EOL
|
||||||
|
// case class Terminator
|
||||||
|
// case class BlockStart
|
||||||
|
// case class Block !Bound
|
||||||
|
// case class Group !Bound
|
||||||
|
// case class Marker !Word64
|
||||||
|
|
||||||
|
// -- Ident
|
||||||
|
// | Var !Text32
|
||||||
|
// | Cons !Text32
|
||||||
|
// | Wildcard
|
||||||
|
|
||||||
|
// -- Keyword
|
||||||
|
// | KwCase
|
||||||
|
// | KwClass
|
||||||
|
// | KwDef
|
||||||
|
// | KwForeign
|
||||||
|
// | KwImport
|
||||||
|
// | KwNative
|
||||||
|
// | KwOf
|
||||||
|
|
||||||
|
// -- Operator
|
||||||
|
// | Operator !Text32
|
||||||
|
// | Modifier !Text32
|
||||||
|
// | Accessor
|
||||||
|
|
||||||
|
// -- | Arrow
|
||||||
|
// | Assignment
|
||||||
|
// | Typed
|
||||||
|
// | TypeApp
|
||||||
|
// | Merge
|
||||||
|
// | Range
|
||||||
|
// | Anything
|
||||||
|
|
||||||
|
// -- Literal
|
||||||
|
// | Number !Number
|
||||||
|
// | Quote !StrType !Bound
|
||||||
|
// | Str !Text32
|
||||||
|
// | StrEsc !StrEscType
|
||||||
|
// | List !Bound
|
||||||
|
|
||||||
|
// -- Comment
|
||||||
|
// | Disable
|
||||||
|
// | Doc !Text32
|
||||||
|
|
||||||
|
// -- Config
|
||||||
|
// | Metadata !Text32
|
||||||
|
// -- | Pragma ...
|
||||||
|
|
||||||
|
// -- Other
|
||||||
|
// | Unknown !Text32 -- DEPRECATED
|
||||||
|
// | Incorrect !Text32 -- DEPRECATED
|
||||||
|
// | Invalid !Invalid.Symbol
|
||||||
|
// deriving (Eq, Generic, Ord, Show)
|
||||||
|
|
||||||
|
// data StrEscType
|
||||||
|
// = CharStrEsc !Int
|
||||||
|
// | NumStrEsc !Int
|
||||||
|
// | QuoteEscape !StrType
|
||||||
|
// | SlashEsc
|
||||||
|
// deriving (Eq, Generic, Ord, Show)
|
||||||
|
|
||||||
|
// data Bound = Begin | End deriving (Eq, Generic, Ord, Show)
|
||||||
|
// data StrType = RawStr | FmtStr | NatStr deriving (Eq, Generic, Ord, Show)
|
||||||
|
// data Number = NumRep
|
||||||
|
// { _base :: Word8
|
||||||
|
// , _intPart :: [Word8]
|
||||||
|
// , _fracPart :: [Word8]
|
||||||
|
// } deriving (Eq, Generic, Ord, Show)
|
Loading…
Reference in New Issue
Block a user