Monday, November 3, 2014

CS205 Лаб 5: Утга олголт болон блоктой ажиллах нь

Зорилго:

  • Соорс коодноос утга олголтыг илрүүлж сурах
  • Блок дотор буй блоктой ажиллах сурах

Тайлбар:
  • Өмнөх лаб дээрээ нэмэх байдлаар коодоо бичнэ.
  • Стэйтмэнт нь 5 янз (Statement = Skip | Block | Assignment | Conditional | Loop) байна. Гэвч энэхүү лабад зөвхөн Skip, Block, Assignment зэрэг нь л ашиглагдана. Иймд холбогдох эцэг, хүү классуудыг үүсгэх хэрэгтэй.
  • Экспрешн нь хувьсагч, утга, бинар, унар гээд олон янз бий. Ойлгомжтой, энгийн байлгах үүднээс экспрешн гэдгийг хувьсагч, утга гэж л ойлгон эцэг, хүү классуудыг нь үүсгээрэй. 
  • Лабын ажлын гол зорилго нь блок дотроос утга олголтыг таних явдал юм.
  • Блок класс дотор буй members гэдэг гишүүн өгөгдөл нь жагсаалт агуулж болдог жагсаалт гээд ойлгож болно. Пайтон хэлэнд жагсаалтын нэг элемент нь бүхэл тоо, нөгөө элемент нь стринг, гуравдах элемент нь жагсаалт байж болдог. Жишээ нь: jagsaad = [12, "arvangurav", [1, 2, 3] ]. Энэхүү жагсаад гэдэг жагсаалтын гуравдах буюу 2 дугаар индекстэй элемент нь бас нэг жагсаалт юм. 
  • Жава хэлэнд бол жагсаалтыг агуулдаг жагсаалтыг хэрэгжүүлэх нэг арга зам нь Object төрөлтэй ArrayList зарлах явдал юм. Жишээ нь, ArrayList<Object>
  • Код ажиллаж дуусангуут нэг блок буцаагдана. Түүний members гишүүн нь Statement төрлийн объект авдаг жагсаалт гээд ойлгож болно. Пайтон хэлэнд бол асуудалгүй өөрөө шийдэгдэнэ. Жаватангууд ArrayList<Statement> members гэж зарлаарай.
  • Үндсэн код нь тэрхүү буцаагдсан блокын гишүүдийг нэг бүрчлэн хэвлэнэ. Гэхдээ тааб эсвэл хоосон зай авах замаар утга учиртай хэвлээрэй. Аль нь алиндаа агуулагдаж байгааг нь харуулах үүднээс. Жишээ нь:
    • Утга олголт олдлоо
    • Блок олдлоо
      • Утга олголт олдлоо
  • Ер нь асуудлыг ингэж шийдэж болох юм гээд псевдо код бичиж өгч байгаа юм. Тэрнээс яг энэ шиг хийгээрэй гэж албадахгүй. Псевдо коодыг уншиж ойлгоод санааг нь аваад өөрийнхөөрөө хэрэгжүүлж болно. 
  • Ойлгомжгүй зүйл гарвал лабын цаг дээр багшаасаа чөлөөтэй асуугаарай. Юм хийж байгаа хүнд асуух асуулт заавал олддог. Энэ ямар аймаар лаб вэ гээд суугаад л байвал байрнаасаа хөдлөхгүй шүү дээ. 


Псевдо код:

class Statement:
  # хов хоосон класс. Абстракт класс гээд ойлгож болно.

class Skip extends Statement:
  function to_string():
    print "Хов хоосон стэйтмэнт"

class Block extends Statement:
  #members нь Statement* бүхий жагсаалт юм.
  members = list() 
  function to_string():
    for member in members:
      print member

class Expression:
  # Хов хоосон класс

class Variable extends Expression:
  # Variable = String id
  id
  function Variable(s):
    this.id = s
  function to_string():
    return str(this.id)
  
class Assignment extends Statement:
  Variable target
  Expression source
  function Assignment(t, e):
    this.target = t
    this.source = e
  function to_string():
    print "Target: ", this.target, ", Source: ", this.source

class Value extends Expression:
  #Value = IntValue|BoolValue|CharValue|FloatValue
  type
  undefined=true

class IntValue extends Value:
  value = 0
  function IntValue():
    this.type = INT
  function IntValue(v):
    this.value = v
    this.undefined = false

class Parser:
  ...
  function statements():
    block = new Block()
    while this.current_token is not RightBrace 
            and this.current_token is not EOF:
      block.members.append(this.statement())
      this.current_token = this.lexer.next_token()
    return block

  function statement():
    # Statement --> ; | Block | Assignment
    s = new Skip()
    if this.current_token is ";":
      this.current_token = this.lexer.next_token()
      return s
    else if this.current_token is LeftBrace:
      this.current_token = this.lexer.next_token()
      s = this.statements()
      this.match(RightBrace)
    else if this.current_token is float|int|char|bool:
      process_declaration() //өмнөх лабтай адил
    else if this.current_token is Identifier:
      s = this.assignment()  
    else:
      print "Statement error"
      system.exit(1)
    return s

  function assignment():
    # Assignment --> Identifier = Expression;
    # i = 77;
    if this.current_token.type is Identifier:
      target = Variable(this.current_token.value)
      this.current_token = this.lexer.next_token()
      this.match(Assign)
      source = this.expression()
      this.match(Semicolon)
      return Assignment(target, source)
    else:
      mortal_combat.fatality("Identifier")
      system.exit(1)
    return None

  function expression():
    if this.current_token is INT:
      value = this.match(int_token)
      return IntValue(int(value))
       

main():
  ...
  parser.lexer.set_file("cs205lab5.cpp")
  ...
  block = parser.statements()
  ...
  for member in block.members:
    print member
  print "Осолдохгүй ажиллаж байна даг"
  print "5 дугаар анги төгсөв"


Боловсруулах соорс код, cs205lab5.cpp:
int main()
{
  x = 5;
  {
    y = 6;
  }
}

Хугацаа:
  • X долоо хоног
  • 1 долоо хоног хоцорвол оноо хасахгүй үзнэ. 
Багш: Ч. Эрдэнэбат
2014/11/03

No comments:

Post a Comment