- Соорс коодноос утга олголтыг илрүүлж сурах
- Блок дотор буй блоктой ажиллах сурах
Тайлбар:
- Өмнөх лаб дээрээ нэмэх байдлаар коодоо бичнэ.
- Стэйтмэнт нь 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