В существующей реализации кодогенератора были введены два основных, четко разделяемых типа данных - код и строка (с точностью до нескольких оговорок числа так же можно считать строками). При написание кода на внутреннем языке генератора пользователь получает возможность явно указывать, где у него код, а где строки используя соответствующие кавычки:
"это строка"
'а это уже код'
Для чего нужно такое разделение? tsdima, уже частично ответил на вопрос - имя св-ва может быть заменено кодогенератором на один из трех вариантов:
1) На непосредственное значение св-ва
2) На данные с верхней точки
3) На данные из потока
все как в пакете Delphi и ничего нового тут нет. Если рассматривать первый случай, то там все просто - замена всегда будет содержать строковое значение. А вот в случаях 2 и 3 пришедшее значение может быть как строкой, так и кодом. Вот для автоматического отслеживания таких ситуаций и были введены явные типы данных и операторы для работы с ними. Так в вашем примере правильнее будет записать так:
print( 'case "4": ', drv, ' = "odbc_mssql"; ', strConn, ' = ', "Driver={SQL Server};Server=" & Connection & ";Database=" & DBname & ";", '; break;' )[/code]
тогда кодогенератор сумеет правильно сцепить строки, где это необходимо и расставить кавычки в нужных местах. В вашей же записи кодогенератор видит следующую последовательность аргументов:
' = "Driver={SQL Server};Server="' - код
Connection - строка
'";Database="' - код
DBname - строка
'";"' - и сново код
и поэтому пытается применить оператор конкатенации строк, хотя на самом деле это в данном случае не нужно. В итоге получим:
case "4": $drv2 = "odbc_mssql"; $strconn2 = "Driver={SQL Server};Server=proof;Database=Test;"; break;[/code]