Size: a a a

Compiler Development

2021 January 25

JT

James Tevision in Compiler Development
Но вроде в любом языке можно сделать
func()[i] = VALUE
источник

AT

Alexander Tchitchigi... in Compiler Development
James Tevision
Ну хотелось бы в результате получить что-то нормальное

Но неизвесно что выйдет
Начните с отказа от указателей и вменяемой семантики массивов. А там, глядишь, и синтаксических извращений не потребуется.
источник

БГ

Бензофуран Гетероцик... in Compiler Development
James Tevision
Но вроде в любом языке можно сделать
func()[i] = VALUE
А куда результат функции уйдёт?)
источник

JT

James Tevision in Compiler Development
Бензофуран Гетероцикл
А куда результат функции уйдёт?)
Сразу используется без сохранения
Как например
IDENT := func() * 2 + 5;
источник

JT

James Tevision in Compiler Development
Alexander Tchitchigin
Начните с отказа от указателей и вменяемой семантики массивов. А там, глядишь, и синтаксических извращений не потребуется.
А что значит
Вменяемой семантики массивов?
источник

AT

Alexander Tchitchigi... in Compiler Development
James Tevision
А что значит
Вменяемой семантики массивов?
Значит, как минимум, не как в C, где массивов нет вообще, а есть только указатели.
источник

JT

James Tevision in Compiler Development
Alexander Tchitchigin
Значит, как минимум, не как в C, где массивов нет вообще, а есть только указатели.
Ну вообще, я планирую линковаться с С кодом
Поэтому наверное нормальным язык не выйдет.......
источник

AT

Alexander Tchitchigi... in Compiler Development
Но можно же просто выражения синтаксически разделить на левые и правые так что assign ::= lexpr ':=' rexpr.
источник

AT

Alexander Tchitchigi... in Compiler Development
James Tevision
Ну вообще, я планирую линковаться с С кодом
Поэтому наверное нормальным язык не выйдет.......
Haskell умеет линковаться с C-кодом, так что не аргумент! 😃
источник

JT

James Tevision in Compiler Development
Alexander Tchitchigin
Но можно же просто выражения синтаксически разделить на левые и правые так что assign ::= lexpr ':=' rexpr.
Но тогда прийдется дублировать
Ибо arr[i] может быть как rvalue и lvalue
источник

AT

Alexander Tchitchigi... in Compiler Development
Alexander Tchitchigin
Но можно же просто выражения синтаксически разделить на левые и правые так что assign ::= lexpr ':=' rexpr.
При этом, lexpr вкладывается в rexpr.
источник

AT

Alexander Tchitchigi... in Compiler Development
James Tevision
Но тогда прийдется дублировать
Ибо arr[i] может быть как rvalue и lvalue
rexpr ::= lexpr | ... 😉
источник

JT

James Tevision in Compiler Development
Alexander Tchitchigin
Haskell умеет линковаться с C-кодом, так что не аргумент! 😃
Ну до создателей хаскеля(ghc) мне далеко........
источник

JT

James Tevision in Compiler Development
Alexander Tchitchigin
При этом, lexpr вкладывается в rexpr.
Хмм, тогда не прийдется делать дополнительных проверок......
источник

AK

Andrei Kurosh in Compiler Development
James Tevision
ASSIGN -> IDENT := EXPR
|   IDENT [ EXPR ] := EXPR

Но вопрос: что делать если массив возврашен функцией?
Я в своем языке делал примерно так:

assign = lvalue "=" expr
lvalue = lvalue_index | lvalue_member | lvalue_identifier
lvalue_index = expr "[" expr "]"
lvalue_member = expr "." identifier
lvalue_identifier = identifier
expr = ...
источник

AT

Alexander Tchitchigi... in Compiler Development
James Tevision
Хмм, тогда не прийдется делать дополнительных проверок......
На уровне проверки типов/статической семантики всё равно придётся.
источник

AK

Andrei Kurosh in Compiler Development
если у вас си-подобный язык, то для присваивания по адресу можно добавить lvalue_address = "*" "(" expr ")"
источник

JT

James Tevision in Compiler Development
Alexander Tchitchigin
rexpr ::= lexpr | ... 😉
А разве не наоборот?
Ведь func() это 100% lexpr
А func()[5] это можеь быть rexpr
И получается что
rexpr -> lexpr [ lexpr ]
источник

JT

James Tevision in Compiler Development
Ой, лево и право перепутал
источник

JT

James Tevision in Compiler Development
func() это rexpr
func()[5] это lexpr

Lexpr -> rexpr [ rexpr ]
Да, все работает)
источник