diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 0063fe4..c2d127e 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -1,7 +1,49 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -15,65 +57,23 @@
main.*
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+ tmp
+
+
+
+
+
@@ -88,10 +88,12 @@
-
+
+
+
@@ -115,6 +117,7 @@
+
@@ -122,35 +125,20 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
+
@@ -299,35 +287,34 @@
-
-
-
+
-
-
+
+
-
-
+
-
+
+
+
@@ -338,257 +325,15 @@
-
-
- file://$PROJECT_DIR$/src/main/LexAnalizer.scala
- 23
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
diff --git a/out/production/courseScala/main/Helper$.class b/out/production/courseScala/main/Helper$.class
index 4a4d0de..ba09006 100644
Binary files a/out/production/courseScala/main/Helper$.class and b/out/production/courseScala/main/Helper$.class differ
diff --git a/out/production/courseScala/main/Helper$BaseLexem.class b/out/production/courseScala/main/Helper$BaseLexem.class
new file mode 100644
index 0000000..44b7ce2
Binary files /dev/null and b/out/production/courseScala/main/Helper$BaseLexem.class differ
diff --git a/out/production/courseScala/main/Helper$ErrorT$.class b/out/production/courseScala/main/Helper$ErrorT$.class
new file mode 100644
index 0000000..e8ee5b6
Binary files /dev/null and b/out/production/courseScala/main/Helper$ErrorT$.class differ
diff --git a/out/production/courseScala/main/Helper$ErrorT.class b/out/production/courseScala/main/Helper$ErrorT.class
new file mode 100644
index 0000000..b039faf
Binary files /dev/null and b/out/production/courseScala/main/Helper$ErrorT.class differ
diff --git a/out/production/courseScala/main/Helper$baseCopReg$.class b/out/production/courseScala/main/Helper$baseCopReg$.class
new file mode 100644
index 0000000..eb8bce2
Binary files /dev/null and b/out/production/courseScala/main/Helper$baseCopReg$.class differ
diff --git a/out/production/courseScala/main/Helper$baseCopReg.class b/out/production/courseScala/main/Helper$baseCopReg.class
new file mode 100644
index 0000000..d1d7aed
Binary files /dev/null and b/out/production/courseScala/main/Helper$baseCopReg.class differ
diff --git a/out/production/courseScala/main/Helper$baseDec$.class b/out/production/courseScala/main/Helper$baseDec$.class
new file mode 100644
index 0000000..6b8e3e5
Binary files /dev/null and b/out/production/courseScala/main/Helper$baseDec$.class differ
diff --git a/out/production/courseScala/main/Helper$baseDec.class b/out/production/courseScala/main/Helper$baseDec.class
new file mode 100644
index 0000000..f31a3e2
Binary files /dev/null and b/out/production/courseScala/main/Helper$baseDec.class differ
diff --git a/out/production/courseScala/main/Helper$baseDelim$.class b/out/production/courseScala/main/Helper$baseDelim$.class
new file mode 100644
index 0000000..eff013a
Binary files /dev/null and b/out/production/courseScala/main/Helper$baseDelim$.class differ
diff --git a/out/production/courseScala/main/Helper$baseDelim.class b/out/production/courseScala/main/Helper$baseDelim.class
new file mode 100644
index 0000000..2cf0f3c
Binary files /dev/null and b/out/production/courseScala/main/Helper$baseDelim.class differ
diff --git a/out/production/courseScala/main/Helper$baseDirect$.class b/out/production/courseScala/main/Helper$baseDirect$.class
new file mode 100644
index 0000000..fcac9ea
Binary files /dev/null and b/out/production/courseScala/main/Helper$baseDirect$.class differ
diff --git a/out/production/courseScala/main/Helper$baseDirect.class b/out/production/courseScala/main/Helper$baseDirect.class
new file mode 100644
index 0000000..ae6978b
Binary files /dev/null and b/out/production/courseScala/main/Helper$baseDirect.class differ
diff --git a/out/production/courseScala/main/Helper$baseMachineCom$.class b/out/production/courseScala/main/Helper$baseMachineCom$.class
new file mode 100644
index 0000000..0638639
Binary files /dev/null and b/out/production/courseScala/main/Helper$baseMachineCom$.class differ
diff --git a/out/production/courseScala/main/Helper$baseMachineCom.class b/out/production/courseScala/main/Helper$baseMachineCom.class
new file mode 100644
index 0000000..85331b8
Binary files /dev/null and b/out/production/courseScala/main/Helper$baseMachineCom.class differ
diff --git a/out/production/courseScala/main/Helper$baseOperofDef$.class b/out/production/courseScala/main/Helper$baseOperofDef$.class
new file mode 100644
index 0000000..648a0fa
Binary files /dev/null and b/out/production/courseScala/main/Helper$baseOperofDef$.class differ
diff --git a/out/production/courseScala/main/Helper$baseOperofDef.class b/out/production/courseScala/main/Helper$baseOperofDef.class
new file mode 100644
index 0000000..c665b27
Binary files /dev/null and b/out/production/courseScala/main/Helper$baseOperofDef.class differ
diff --git a/out/production/courseScala/main/Helper$baseReg32$.class b/out/production/courseScala/main/Helper$baseReg32$.class
new file mode 100644
index 0000000..4f72dfe
Binary files /dev/null and b/out/production/courseScala/main/Helper$baseReg32$.class differ
diff --git a/out/production/courseScala/main/Helper$baseReg32.class b/out/production/courseScala/main/Helper$baseReg32.class
new file mode 100644
index 0000000..8688fda
Binary files /dev/null and b/out/production/courseScala/main/Helper$baseReg32.class differ
diff --git a/out/production/courseScala/main/Helper$baseRegSegment$.class b/out/production/courseScala/main/Helper$baseRegSegment$.class
new file mode 100644
index 0000000..0b7c7a5
Binary files /dev/null and b/out/production/courseScala/main/Helper$baseRegSegment$.class differ
diff --git a/out/production/courseScala/main/Helper$baseRegSegment.class b/out/production/courseScala/main/Helper$baseRegSegment.class
new file mode 100644
index 0000000..3129025
Binary files /dev/null and b/out/production/courseScala/main/Helper$baseRegSegment.class differ
diff --git a/out/production/courseScala/main/Helper$baseTypeofIdent$.class b/out/production/courseScala/main/Helper$baseTypeofIdent$.class
new file mode 100644
index 0000000..da2aa53
Binary files /dev/null and b/out/production/courseScala/main/Helper$baseTypeofIdent$.class differ
diff --git a/out/production/courseScala/main/Helper$baseTypeofIdent.class b/out/production/courseScala/main/Helper$baseTypeofIdent.class
new file mode 100644
index 0000000..7e1ed2b
Binary files /dev/null and b/out/production/courseScala/main/Helper$baseTypeofIdent.class differ
diff --git a/out/production/courseScala/main/Helper$baseUserId$.class b/out/production/courseScala/main/Helper$baseUserId$.class
new file mode 100644
index 0000000..1e1b784
Binary files /dev/null and b/out/production/courseScala/main/Helper$baseUserId$.class differ
diff --git a/out/production/courseScala/main/Helper$baseUserId.class b/out/production/courseScala/main/Helper$baseUserId.class
new file mode 100644
index 0000000..d702d20
Binary files /dev/null and b/out/production/courseScala/main/Helper$baseUserId.class differ
diff --git a/out/production/courseScala/main/Helper$mainToken$.class b/out/production/courseScala/main/Helper$mainToken$.class
new file mode 100644
index 0000000..8f9759d
Binary files /dev/null and b/out/production/courseScala/main/Helper$mainToken$.class differ
diff --git a/out/production/courseScala/main/Helper$mainToken.class b/out/production/courseScala/main/Helper$mainToken.class
new file mode 100644
index 0000000..f656e58
Binary files /dev/null and b/out/production/courseScala/main/Helper$mainToken.class differ
diff --git a/out/production/courseScala/main/Helper$rowToken$.class b/out/production/courseScala/main/Helper$rowToken$.class
deleted file mode 100644
index e05569b..0000000
Binary files a/out/production/courseScala/main/Helper$rowToken$.class and /dev/null differ
diff --git a/out/production/courseScala/main/Helper$rowToken.class b/out/production/courseScala/main/Helper$rowToken.class
deleted file mode 100644
index 378ae97..0000000
Binary files a/out/production/courseScala/main/Helper$rowToken.class and /dev/null differ
diff --git a/out/production/courseScala/main/Helper.class b/out/production/courseScala/main/Helper.class
index 55ac091..f900810 100644
Binary files a/out/production/courseScala/main/Helper.class and b/out/production/courseScala/main/Helper.class differ
diff --git a/out/production/courseScala/main/LexAnalizer$$anonfun$initMap$1$$anonfun$apply$1.class b/out/production/courseScala/main/LexAnalizer$$anonfun$initMap$1$$anonfun$apply$1.class
index b66c1ce..e0b18c3 100644
Binary files a/out/production/courseScala/main/LexAnalizer$$anonfun$initMap$1$$anonfun$apply$1.class and b/out/production/courseScala/main/LexAnalizer$$anonfun$initMap$1$$anonfun$apply$1.class differ
diff --git a/out/production/courseScala/main/LexAnalizer$$anonfun$initMap$1.class b/out/production/courseScala/main/LexAnalizer$$anonfun$initMap$1.class
index 982d04d..b77d276 100644
Binary files a/out/production/courseScala/main/LexAnalizer$$anonfun$initMap$1.class and b/out/production/courseScala/main/LexAnalizer$$anonfun$initMap$1.class differ
diff --git a/out/production/courseScala/main/LexAnalizer$$anonfun$printLexic$1$$anonfun$apply$2.class b/out/production/courseScala/main/LexAnalizer$$anonfun$printLexic$1$$anonfun$apply$2.class
new file mode 100644
index 0000000..ff1d6c3
Binary files /dev/null and b/out/production/courseScala/main/LexAnalizer$$anonfun$printLexic$1$$anonfun$apply$2.class differ
diff --git a/out/production/courseScala/main/LexAnalizer$$anonfun$printLexic$1.class b/out/production/courseScala/main/LexAnalizer$$anonfun$printLexic$1.class
new file mode 100644
index 0000000..d24921d
Binary files /dev/null and b/out/production/courseScala/main/LexAnalizer$$anonfun$printLexic$1.class differ
diff --git a/out/production/courseScala/main/LexAnalizer.class b/out/production/courseScala/main/LexAnalizer.class
index 378d741..970be90 100644
Binary files a/out/production/courseScala/main/LexAnalizer.class and b/out/production/courseScala/main/LexAnalizer.class differ
diff --git a/out/production/courseScala/main/Main$delayedInit$body.class b/out/production/courseScala/main/Main$delayedInit$body.class
index 7119813..e7d3657 100644
Binary files a/out/production/courseScala/main/Main$delayedInit$body.class and b/out/production/courseScala/main/Main$delayedInit$body.class differ
diff --git a/qwer.asm b/qwer.asm
index d6e27e5..5f14f2c 100644
--- a/qwer.asm
+++ b/qwer.asm
@@ -1,4 +1,4 @@
-DATA SEGMENT
+77DATA SEGMENT
decem1 DD .028
decem2 DQ 0.025
decem4 DQ -0.025
@@ -8,8 +8,6 @@ DATA SEGMENT
des2 DQ 12345678
des3 DQ -12345678
DATA ENDS
-
-
CODE SEGMENT
finit
fadd dword ptr decem2[eax]
@@ -32,7 +30,5 @@ CODE SEGMENT
Fcom st(7)
Fadd dword ptr fs:decem1[esi]
Faddp st(2), st(0)
-
-
CODE ENDS
END
\ No newline at end of file
diff --git a/src/main/Helper.scala b/src/main/Helper.scala
index c3857e6..e7ddf3c 100644
--- a/src/main/Helper.scala
+++ b/src/main/Helper.scala
@@ -1,5 +1,7 @@
package main
+import java.io.FileNotFoundException
+
import scala.collection.mutable
import scala.collection.mutable.ListBuffer
@@ -13,33 +15,74 @@ object Helper {
def isDiv(ch:Char):Boolean = dividers.contains(ch)
val machineComm = List("finit","fcom","fadd","faddp")
- val directives = List("END", "SEGMENT", "ENDS", "DQ", "DD")
+ val directives = List("end", "segment", "ends", "dq", "dd")
val regGeneral32 = List("eax", "ebx", "ecx", "edx", "esi", "edi", "ebp", "esp")
val typeOfIdent = List("dword","qword")
val ptr = "ptr"
+ val st = "st"
val regSegment = List("fs"," gs", "cs", "ss", "ds", "es")
- val lexemType = List( "Machine command","Directive","User identif","Dec const",
- "32b register","Type of ident","Operator of type def",
- "Segment reg","Single lexem","Dec const")
- def checkWhat(map:mutable.Map[Int,ListBuffer[String]]):Unit ={
+ case class ErrorT(str:String,row:Int, fl:Boolean)
+ def checkWhat(tempTok:String):String ={
+ tempTok match {
+ case tempTok if dividers.contains(tempTok.toLowerCase) => baseDelim().setName()
+ case tempTok if regSegment.contains(tempTok.toLowerCase) => baseRegSegment().setName()
+ case tempTok if typeOfIdent.contains(tempTok.toLowerCase) => baseTypeofIdent().setName()
+ case tempTok if regGeneral32.contains(tempTok.toLowerCase) => baseReg32().setName()
+ case tempTok if directives.contains(tempTok.toLowerCase) => baseDirect().setName()
+ case tempTok if machineComm.contains(tempTok.toLowerCase) => baseMachineCom().setName()
+ case tempTok if ptr.contains(tempTok.toLowerCase) => baseOperofDef().setName()
+ case tempTok if st.contains(tempTok.toLowerCase) => baseCopReg().setName()
+ case tempTok if checkInt(tempTok)=> baseDec().setName()
+ case _ => baseUserId().setName()
+ }
}
- def printTable(k:Int):Unit={
- }
+
+ def checkInt(t:String):Boolean = t.matches(floatPat)
//val intPat = """0|(\+|-)?[1-9][0-9]*[a-z]?"""
- val floatPat = """((-)?[0-9]*[a-z]?\.[0-9]*)|0|(\+|-)?[1-9][0-9]*[a-z]?"""
+ val floatPat = """([^[a-zA-Z]]*(-)?[0-9]*[dD]?\.[0-9]*)|0|(-)?[1-9][0-9]*[dD]?"""
val operatorPat = """\[|]|\(|\)|\,|:|!="""
- val idPat = """[a-zA-Z][0-9a-zA-Z]*"""
- val tokenPat = (floatPat + "|" + idPat + "|" + operatorPat).r
- var Error = false
+ val idPat = """[0-9]*?[a-zA-Z][0-9a-zA-Z]*"""
+ val tokenPat = (idPat + "|" +floatPat+ "|" + operatorPat).r
+ var Error = false
+ var LexicalList = new ListBuffer[List[mainToken]]
+ var SyntaxList = new ListBuffer[tokenSyntax]
+ case class mainToken(row:Int, rowIndex:Int, token:String)
+ case class tokenSyntax(name:mainToken,function:String)
+ trait BaseLexem
+ case class baseDelim() extends BaseLexem {
+ def setName():String = "Single lexem"
+ }
+ case class baseRegSegment() extends BaseLexem {
+ def setName():String = "Segment reg"
+ }
+ case class baseTypeofIdent() extends BaseLexem {
+ def setName():String = "Type of ident"
+ }
+ case class baseReg32() extends BaseLexem {
+ def setName():String = "32b register"
+ }
+ case class baseDirect() extends BaseLexem {
+ def setName():String = "Directive"
+ }
+ case class baseMachineCom() extends BaseLexem {
+ def setName():String = "Machine command"
+ }
+ case class baseOperofDef() extends BaseLexem {
+ def setName():String ="Operator of type def"
+ }
+ case class baseDec() extends BaseLexem {
+ def setName():String ="Dec constant"
+ }
+ case class baseCopReg() extends BaseLexem {
+ def setName():String ="Coproces reg"
+ }
+ case class baseUserId() extends BaseLexem {
+ def setName():String ="User ident"
+ }
- case class rowToken(row:Int,rowIndex:Int,token:String)
- trait BaseLexem{
- def print()
- def len()
- }
}
diff --git a/src/main/LexAnalizer.scala b/src/main/LexAnalizer.scala
index f0272a9..72ff328 100644
--- a/src/main/LexAnalizer.scala
+++ b/src/main/LexAnalizer.scala
@@ -4,34 +4,70 @@ import java.io.FileNotFoundException
import main.Helper._
-import scala.collection.mutable._
+import scala.collection.mutable
+import scala.collection.mutable.ListBuffer
import scala.io.Source
class LexAnalizer {
- def initMap(namefile: String):Unit = {
+ def initMap(namefile: String): Unit = {
try {
- var tempList = new ListBuffer[rowToken]
- var lst = new ListBuffer[List[rowToken]]
+ var tempList = new ListBuffer[mainToken]
- var row =1
- var rowInd =1
+ var row = 1
+ var rowInd = 1
for (line <- Source.fromFile(namefile).getLines) {
-
+ tempList.clear()
var tokens = tokenPat.findAllIn(line)
- rowInd=1
- for(next <- tokens){
- tempList += rowToken(row,rowInd,next)
- rowInd+=1
+ rowInd = 1
+ for (next <- tokens) {
+ tempList += mainToken(row, rowInd, next)
+ rowInd += 1
}
- row+=1
- lst += tempList.toList
-
+ row += 1
+ LexicalList += tempList.toList
}
+ // for(listBuf<- lst){println(listBuf)}
} catch {
- case ex: FileNotFoundException => Error = true
- println("Missing file exception")
- }
+ case ex: FileNotFoundException => Error = true
+ println("Missing file exception")
+ }
+ }
+
+ def printLexic(): Unit = {
+ var si = 0
+ var forIdent = new ErrorT("",0,false)
+ var flag = false
+ for(listBuf<- LexicalList){
+ si = 0
+ for(go<-listBuf) {
+ if (si==0){
+ printf(" ------------------------ROW#%s#------------------------\n", go.row)
+ print("\tLEXEM\t\t\t\tLENGTH\t\t\tTYPE\n")
+ }
+
+ var tmp1 = go.token
+
+ if(tmp1.length<4)printf("\t%s\t\t\t\t\t", tmp1)
+ else if(tmp1.length>7) printf("\t%s\t\t\t", tmp1)
+ else printf("\t%s\t\t\t\t", tmp1)
+
+ print(tmp1.length)
+
+ var base = checkWhat(tmp1)
+ if(base.equals("User ident")&&((tmp1.length>8)|| isNum(tmp1.charAt(0)))) {
+ flag = true
+ forIdent = new ErrorT(tmp1,go.row, true)
+ }
+ printf("\t\t\t%s\n", base)
+ si+=1
+ SyntaxList+=tokenSyntax(go,base)
+ }
+ if (flag==true) {
+ Console.out.println( Console.RED + "bad identification in " +forIdent.row+" row name " +forIdent.str+ Console.RESET )
+ flag = false
+ }
}
+ }
}
diff --git a/src/main/Main.scala b/src/main/Main.scala
index fd8f885..bf9edc9 100644
--- a/src/main/Main.scala
+++ b/src/main/Main.scala
@@ -7,5 +7,5 @@ object Main extends App {
val an = new LexAnalizer()
an.initMap(Console.readLine()+".asm")
- // an.analize()
+ //an.printLexic()
}
diff --git a/src/main/SyntaxAnalizer.scala b/src/main/SyntaxAnalizer.scala
new file mode 100644
index 0000000..d45298a
--- /dev/null
+++ b/src/main/SyntaxAnalizer.scala
@@ -0,0 +1,13 @@
+package main
+
+import scala.collection.mutable
+import scala.collection.mutable._
+
+class SyntaxAnalizer {
+ trait SynTable
+
+ val Table = new ListBuffer[ListBuffer[String]](
+ ("User ident","Directive"),
+ ("User ident","Directive","Directive"))
+
+}