Syntax error unexpected symbol expecting register

Код:

Форум РадиоКот :: Просмотр темы — Ассемблер (ASM) для AVR в вопросах и ответах


Автор:  FUZZY_ [ Ср мар 20, 2013 22:49:35 ]
Заголовок сообщения:  Re: Ассемблер (ASM) для AVR в вопросах и ответах

Вопрос снят ошибка в железе


Автор:  dr.doc [ Чт мар 21, 2013 11:43:43 ]
Заголовок сообщения:  Re: Ассемблер (ASM) для AVR в вопросах и ответах

Вопрос следующий. Начал изучать Атмел контроллеры (вроде даже успешно). Написал несколько пробных программ, проверил их работу на макетке и вот — Микроконтроллер ATtiny2313 выводит на индикатор 1602 (по заданию) следующее: сначала 5 цифр адреса от 00032 (0x20) до 00255 (0xFF) следом пробел, а затем символ зашитый в индикатор. Так вот сразу после прошивки все работает очень четко, а стоит передернуть питание — вместо цифр х.з. что. Вывожу на светодиоды значение единиц — выводит то, что показывает индикатор. Вдобавок ко всему — адрес отображаемого знака инкрементируется, а «числа» порой просто «тикают» (инкремент — декремент). Подпрограмма преобразования BIN — BCD в Атмел студио 6 и протеусе работает на ура. Алгоритм преобразования переписал из PIC (у Корабельникова расписан хорошо). Регистры РОН перед преобразованием сохраняю в ОЗУ а потом восстанавливаю. Участок кода преобразования BIN-BCD привожу. Заранее благодарю


Автор:  SmarTrunk [ Чт мар 21, 2013 17:30:54 ]
Заголовок сообщения:  Re: Ассемблер (ASM) для AVR в вопросах и ответах

Может, что-то с цепью сброса? При программировании вывод RESET используется и управляется программатором, а дальше уже МК сам… Или добавить конденсаторов по питанию, керамических и электролитических.


Автор:  dr.doc [ Чт мар 21, 2013 20:38:06 ]
Заголовок сообщения:  Re: Ассемблер (ASM) для AVR в вопросах и ответах

Нет, тут дело именно в косвенной адресации. Я заменил группы команд ST X,Rd на ячейку ОЗУ и все стало работать как надо.


Автор:  akkinak [ Чт мар 21, 2013 23:32:35 ]
Заголовок сообщения:  Re: Ассемблер (ASM) для AVR в вопросах и ответах

Приветствую!
изучаю работу с шаговым двигателем на примере из книги Кравченко А.В. «10 практических устройств на AVR-микроконтроллерах»
открываю проэкт в AVRStudio , собираю, выдает ошибку:

Код:

…..Step_40.asm(17): error: syntax error, unexpected REGISTER, expecting SYMBOL or FUNCTION or REGDEF

номер строки и исходный файл прилагаю. никак не пойму где там ошибка?


Автор:  Alexeyslav [ Пт мар 22, 2013 00:06:11 ]
Заголовок сообщения:  Re: Ассемблер (ASM) для AVR в вопросах и ответах

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

Вот он и пишет что «unexpected REGISTER, expecting SYMBOL» = «неожиданный РЕГИСТР, ожидается символ(в смысле неделимое понятие) или функция»


Автор:  akkinak [ Пт мар 22, 2013 00:14:52 ]
Заголовок сообщения:  Re: Ассемблер (ASM) для AVR в вопросах и ответах

понятно, а какие еще символы зарезервированы за компилятором тиа «Х»?


Автор:  Alexeyslav [ Пт мар 22, 2013 00:34:20 ]
Заголовок сообщения:  Re: Ассемблер (ASM) для AVR в вопросах и ответах

Это несложно проверить. Букв в алфавите всего лишь 26, и некоторые из них ты уже опробовал.

Можно сразу сказать что X,Y,Z уже заняты.


Автор:  BOB51 [ Пт мар 22, 2013 07:21:45 ]
Заголовок сообщения:  Re: Ассемблер (ASM) для AVR в вопросах и ответах

если пользоваться avrasm2 то для подобных ситуаций имеется директива undef
:tea:


Автор:  Alexeyslav [ Пт мар 22, 2013 07:37:52 ]
Заголовок сообщения:  Re: Ассемблер (ASM) для AVR в вопросах и ответах

Ей по силам отменить определение части команд? или например отменить R16 чтобы использовать его в качестве имени другой переменной или в качестве метки?


Автор:  BOB51 [ Пт мар 22, 2013 07:56:51 ]
Заголовок сообщения:  Re: Ассемблер (ASM) для AVR в вопросах и ответах

Переопределение того, что ранее определено директивами def.
А Z,X и Y как раз так и определены в *def.inc файле:
; ***** CPU REGISTER DEFINITIONS *****************************************
.def XH = r27
.def XL = r26
.def YH = r29
.def YL = r28
.def ZH = r31
.def ZL = r30
:beer:
Т.е. если мне хочется обозвать какой-либо из регистров r31-r26 собственным именем нужно предварительно отменить заранее заданное (речь не идет о специменах зарезервированных для компилятора) — просто по другому присвоить любое произвольное имя (даже правильное) для этих регистров не удастся.


Автор:  Alexeyslav [ Пт мар 22, 2013 08:14:06 ]
Заголовок сообщения:  Re: Ассемблер (ASM) для AVR в вопросах и ответах

вижу только XL и XH но не X.
X, Y, Z являются неотъемлемыми частями некоторых команд!!! и рассматриваются компилятором наравне с регистрами.

Если переопределить Z, как можно будет использовать команду LPM R16, Z+ или LD R16, Z


Автор:  Gudd-Head [ Пт мар 22, 2013 14:16:20 ]
Заголовок сообщения:  Re: Ассемблер (ASM) для AVR в вопросах и ответах

Храню во флэше шрифт, по 5 байт на цифру (букву).
Хотел писать по 5 байт в строке

Код:

numbers: .DB 0b00111110, 0b01010001, 0b01001001, 0b01000101, 0b00111110; 0
         .DB 0b00000000, 0b01000010, 0b01111111, 0b01000000, 0b00000000; 1

Но так из-за двухбайтной адресации занимает 12 байт, а не 10. И идёт не подряд.
А на такое

Код:

numbers: .DB 0b00111110, 0b01010001, 0b01001001, 0b01000101, 0b00111110,;0
             0b00000000, 0b01000010, 0b01111111, 0b01000000, 0b00000000; 1

Студия ругается. Не хочется писать по 10 байт в одной строке — очень длинно и нечитабельно получается.
Есть ли какое-то решение проблемы?


Автор:  ibiza11 [ Пт мар 22, 2013 14:35:00 ]
Заголовок сообщения:  Re: Ассемблер (ASM) для AVR в вопросах и ответах

прошу прощения. неправильно ответил. есть решение.

Цитата:

Line continuation
Like in C, source lines can be continued by means of having a backslash () as the last character of a line. This is particularly useful when defining long preprocessor macros, and for long .db directives.

Example

Код:

.db 0, 1, «This is a long string», ‘n’, 0, 2,
    «Here is another one», ‘n’, 0, 3, 0


Автор:  Gudd-Head [ Пт мар 22, 2013 14:42:57 ]
Заголовок сообщения:  Re: Ассемблер (ASM) для AVR в вопросах и ответах

ibiza11 писал(а):

есть решение

Ты ж ёбт :shock:
Правда, придётся немного похимичить с комментами :)))

Код:

numbers: .DB 0b00111110, 0b01010001, 0b01001001, 0b01000101, 0b00111110,/*0*/
             0b00000000, 0b01000010, 0b01111111, 0b01000000, 0b00000000,/*1*/


Автор:  ibiza11 [ Пт мар 22, 2013 14:46:53 ]
Заголовок сообщения:  Re: Ассемблер (ASM) для AVR в вопросах и ответах

комментарий можно и после бэкслеша поставить


Автор:  Gudd-Head [ Пт мар 22, 2013 14:50:43 ]
Заголовок сообщения:  Re: Ассемблер (ASM) для AVR в вопросах и ответах

Не-не-не, Дэвид Блейн

Цитата:

backslash () as the last character of a line

Студия ругается, бэкслэш должен быть реально последним в строке.



Автор:  Мikа [ Чт апр 04, 2013 10:16:35 ]
Заголовок сообщения:  Re: Мелкие вопросы по теории

Парни, подскажите, плз, в строчке, выделенной жирным, add — это опечатка, или это так надо?

Цитата:

ldi Temp,0 ;инициализация регистра
;внутренней адресации массива

ReadArray:
ldi ZH,High(MyArray*2) ;загрузка адреса 0-го
ldi ZL,Low(MyArray*2) ;элемента в рег. пару Z

ldi Temp1,0
add ZL,Temp ;прибавление
adc ZH,Temp1 ;внутр. адреса

lpm ;загрузка из ПЗУ

mov Temp1,R0 ;копирование
out PortB,Temp1 ;вывод в порт
inc Temp ;увелич. внутр. адреса
rjmp ReadArray ;в начало цикла

MyArray:
.db 12,16,3,4,10,17,255,37,158,14,13,98
.db 14,85,30,9,145,52,64,49,119,72,209,46

Взято здесь


Автор:  Gudd-Head [ Чт апр 04, 2013 10:26:04 ]
Заголовок сообщения:  Re: Мелкие вопросы по теории

Так надо. Младший байт прибавляется без учёта переноса (add), старший (после младшего!) — с учётом переноса (adc).


Страница 183 из 371 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/

За последние 24 часа нас посетили 11584 программиста и 1164 робота. Сейчас ищут 309 программистов …


  1. nevidomo

    С нами с:
    23 окт 2020
    Сообщения:
    14
    Симпатии:
    0

    Подскажите как исправить

    <?php

    require_once ‘db.php’;

    $Login = $_POST[‘login’];
    $Group = $_POST[‘Group’];
    $FIO = $_POST[‘FIO’];

    mysqli_query($connect, query: «INSERT INTO `users` (`Login`, `Group`, `FIO`) VALUES (‘$Login’, ‘$Group’, ‘$FIO’)»);
    ?>

    Parse error: syntax error, unexpected ‘:’, expecting ‘,’ or ‘)’ in W:domainsPhptestcsscreate.php on line 9


  2. mkramer

    Команда форума
    Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.493
    Симпатии:
    1.732

    А откуда такой синтаксис взялся, с query:? То, что новые штормы так автоматом показывают бледным шрифтом, не означает, что это так писать надо.
    — Добавлено —
    Так можно, вроде, будет писать в 8 версии php, но она пока только RC, выйдет через месяц


  3. ADSoft

    перевести трудно? гугл транслейт хотя бы?
    посмотреть описание функции?

    : — замените на ,


  4. nevidomo

    С нами с:
    23 окт 2020
    Сообщения:
    14
    Симпатии:
    0

    заменил и и вот опять ошибка «Warning: mysqli_query() expects parameter 1 to be mysqli, null given in W:domainsPhptestcsscreate.php on line 9»


  5. nevidomo

    С нами с:
    23 окт 2020
    Сообщения:
    14
    Симпатии:
    0


  6. mkramer

    Команда форума
    Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.493
    Симпатии:
    1.732

    Ошибка изменилась, значит проблема другая. Скорее всего, подключения к базе не произошло, судя по тексту. Или переменная не так называется. Всё написано нормальным английским языком.Не понятен вопрос. Напишите в соответствии с синтаксисом php. Если не знаете синтаксис — какого фига лезете программировать?


  7. Dimon2x

    С нами с:
    26 фев 2012
    Сообщения:
    2.176
    Симпатии:
    180

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

    PHP тащит за собой сервер, сервер тащит за собой линукс, линукс тащит за собой английский, php ничего не знает про mysql.

    PHP это язык программирования, программирование это инженерия, инжеру надо знать очень много.


    Taktreba и mkramer нравится это.


  8. mkramer

    Команда форума
    Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.493
    Симпатии:
    1.732

    @Dimon2x Только я бы сказал, php — это программирование, программирование тащит за собой английский


  9. nevidomo

    С нами с:
    23 окт 2020
    Сообщения:
    14
    Симпатии:
    0

    я не понимаю почему не произошло подключения
    этот код мне выводит дание из бд
    <? include_once(‘db.php’) ?>
    <? $sql = $db->query(«SELECT * FROM `Users`»); /* запрос сам*/
    $db-> close;
    while ($result = $sql ->fetch_assoc()):?>
    <div class=»login»><h3><?=$result[‘login’] ?></h3> </div>
    <div class=»FIO»> <?=$result[‘FIO’] ?> </div>
    <? endwhile ?>

    а вот:
    не хочет вносить но подключаю к db.php
    <?php

    require_once ‘db.php’;

    $Login = $_POST[‘login’];
    $Group = $_POST[‘Group’];
    $FIO = $_POST[‘FIO’];

    mysqli_query($connect, query, «INSERT INTO `users` (`Login`, `Group`, `FIO`) VALUES (‘$Login’, ‘$Group’, ‘$FIO’)»);
    ?>


  10. mkramer

    Команда форума
    Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.493
    Симпатии:
    1.732

    А что в db.php? И прочитайте в подписи, как оформлять код

    Это бред сивой кобылы, прочитайте документацию по mysqli.

    И судя по коду, вы в основах путаетесь, что такое переменная, что такое параметры.


  11. nevidomo

    С нами с:
    23 окт 2020
    Сообщения:
    14
    Симпатии:
    0

    В db.php:
    <?php
    $db = new mysqli(‘localhost’,’root’,’root’,’Users’);

    ?>


  12. acho

    acho
    Активный пользователь

    И не надо смешивать процедурный и ООП стили.


  13. mkramer

    Команда форума
    Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.493
    Симпатии:
    1.732

    @nevidomo, ну я же говорю, переменные не понимаете. В одном месте она у вас $db называется, а в другом месте должна как-то преобразоваться в $connect сама собой?


  14. Dimon2x

    С нами с:
    26 фев 2012
    Сообщения:
    2.176
    Симпатии:
    180

    ‘Users’ — это строка
    $users — это переменная


  15. nevidomo

    С нами с:
    23 окт 2020
    Сообщения:
    14
    Симпатии:
    0

    зделал
    db.php:
    <?php
    $connect = new mysqli(‘localhost’,’root’,’root’,’Users’); /* connect db */

    ?>
    create.php:

    <?php

    require_once ‘db.php’;

    $Login = $_POST[‘Login’];
    $Group = $_POST[‘Group’];
    $FIO = $_POST[‘FIO’];

    mysqli_query($connect, query, «INSERT INTO `users` (`Login`, `Group`, `FIO`) VALUES (‘$Login’, ‘$Group’, ‘$FIO’)»);
    ?>
    но ошибка: Warning: mysqli_query() expects parameter 3 to be integer, string given in W:domainsPhptestcsscreate.php on line 9


  16. mkramer

    Команда форума
    Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.493
    Симпатии:
    1.732

    Ну уже изменилось. Но документацию по mysqli_query так и не поискал. И код оформляешь как попало. Как правильно — у меня в подписи.

    https://www.php.net/manual/ru/mysqli.query.php — читаем здесь, как правильно. Вообще не понимаю, откуда у тебя слово query в параметрах. Это неосознанное программирование, бич молодых программистов, судя по тем, что к нам на собеседования приходят. Код через сознание не проходит, спрашиваешь: «с какой целью написал именно так, а не иначе» — ответить не могут. Не приучайте себя к такому. Правило очень простое, чтоб программирование было осознанным — читать про каждую функцию, которая вызывается, документацию. Читать, как работает язык на котором пишешь. Читать, читать и ещё раз читать.


  17. nevidomo

    С нами с:
    23 окт 2020
    Сообщения:
    14
    Симпатии:
    0

    большое спасибо
    уже понял где проблема


  18. MouseZver

    С нами с:
    1 апр 2013
    Сообщения:
    7.562
    Симпатии:
    1.284
    Адрес:
    Лень

    @nevidomo, самое начало, от чего нужно начинать отталкиваться, это

    russkij_jazyk_uchebniki_3_4_kl_1979_80_g_g.jpg

    Пи3дец — даже подсветку текстаАрены нахрен продуплить o_O какое б… программирование ??

    Читаем Parse error — что за херня ? Транслятор нельзя было врубить и перевести ??? «Ошибка синтаксического анализа»

    Что такое СИНТАКСИС ? Снова гуглим — узнаем.. Это тоже 6лядь как русский язык ГРА МА ТИ КА
    С таким же успехом дальше переводим, думаем, покурим и снова думаем, можешь даже поужинать если до такого дошло.
    Line ? строка
    Что — то в строке 9 Синтаксис долбаный сломан в PHP o_O Ведь пхп интерпретатор ругается
    Смотрим и дуплим, что там за 9 строка

    1. mysqli_query($connect, query: «INSERT INTO `users` (`Login`, `Group`, `FIO`) VALUES (‘$Login‘, ‘$Group‘, ‘$FIO‘)»);

    Идем, смотрим ОФФ документацию — гуглим mysqli_query
    Читаем и просвещаемся. Cмотрим на ПРИМЕРЫ ЗАПОЛНЕНИЯ АТРИБУТОВ, у данной функции.

    Оказывается, какого }{Yя у тебя бичь в виде «query: » скопирована из помойной документации в интернете.

    На будущее, юзай редактор с ПОДСВЕТКОЙ PHP
    — Добавлено —
    Даже тут херня эта подсвечивается

Приветствую всех.У меня на сайте http://www.riper.kz/ при регистрации выходит вот такая ошибка

Код: Выделить всё

Parse error: syntax error, unexpected ';', expecting T_FUNCTION in /home/riperkz/public_html/engine/modules/register.php on line 594

Код: Выделить всё

<?php
/*
=====================================================
 DataLife Engine - by SoftNews Media Group 
-----------------------------------------------------
 http://dle-news.ru/
-----------------------------------------------------
 Copyright (c) 2004,2011 SoftNews Media Group
=====================================================
 Данный код защищен авторскими правами
=====================================================
 Файл: register.php
-----------------------------------------------------
 Назначение: регистрация посетителя
=====================================================
*/

if( ! defined( 'DATALIFEENGINE' ) ) {
	die( "Hacking attempt!" );
}

require_once ENGINE_DIR . '/classes/parse.class.php';
$ipb_dle_lan[0] = "Данное имя уже используется на форуме.";
    $db_ipb_user = "пользователь";
    $db_ipb_password = "пароль";
    $db_ipb_namedb = "имя_базы";
    $db_ipb_local = "localhost";
    $db_ipb_error = 1; // 1 - показывать ошибки в соединении с бд форума, 0 - нет
    $db_prefix_ipb = "префикс_если_его_нету_оставить_пустым";
$ipb = new db;
$ipb->connect($db_ipb_user, $db_ipb_password, $db_ipb_namedb, $db_ipb_local, $db_ipb_error);

$parse = new ParseFilter( );
$parse->safe_mode = true;
$parse->allow_url = false;
$parse->allow_image = false;
$stopregistration = FALSE;

if( isset( $_REQUEST['doaction'] ) ) $doaction = $_REQUEST['doaction']; else $doaction = "";
$config['reg_group'] = intval( $config['reg_group'] ) ? intval( $config['reg_group'] ) : 4;

function check_reg($name, $email, $password1, $password2, $sec_code = 1, $sec_code_session = 1) {
	global $lang, $db, $banned_info, $relates_word, $ipb, $ipb_dle_lan, $db_prefix_ipb;
	$stop = "";
	
	if( $sec_code != $sec_code_session OR !$sec_code_session ) $stop .= $lang['reg_err_19'];
	if( $password1 != $password2 ) $stop .= $lang['reg_err_1'];
	if( strlen( $password1 ) < 6 ) $stop .= $lang['reg_err_2'];
	if( strlen( $name ) > 20 ) $stop .= $lang['reg_err_3'];
	if( preg_match( "/[||'|<|>|[|]|"|!|?|$|@|/|\|&~*{+]/", $name ) ) $stop .= $lang['reg_err_4'];
	if( empty( $email ) OR strlen( $email ) > 50 OR @count(explode("@", $email)) != 2) $stop .= $lang['reg_err_6'];
	if( $name == "" ) $stop .= $lang['reg_err_7'];
	if (strpos( strtolower ($name) , '.php' ) !== false) $stop .= $lang['reg_err_4'];

	
	if( count( $banned_info['name'] ) ) foreach ( $banned_info['name'] as $banned ) {
		
		$banned['name'] = str_replace( '*', '.*', preg_quote( $banned['name'], "#" ) );
		
		if( $banned['name'] and preg_match( "#^{$banned['name']}$#i", $name ) ) {
			
			if( $banned['descr'] ) {
				$lang['reg_err_21'] = str_replace( "{descr}", $lang['reg_err_22'], $lang['reg_err_21'] );
				$lang['reg_err_21'] = str_replace( "{descr}", $banned['descr'], $lang['reg_err_21'] );
			} else
				$lang['reg_err_21'] = str_replace( "{descr}", "", $lang['reg_err_21'] );
			
			$stop .= $lang['reg_err_21'];
		}
	}
	
	if( count( $banned_info['email'] ) ) foreach ( $banned_info['email'] as $banned ) {
		
		$banned['email'] = str_replace( '*', '.*', preg_quote( $banned['email'], "#" ) );
		
		if( $banned['email'] and preg_match( "#^{$banned['email']}$#i", $email ) ) {
			
			if( $banned['descr'] ) {
				$lang['reg_err_23'] = str_replace( "{descr}", $lang['reg_err_22'], $lang['reg_err_23'] );
				$lang['reg_err_23'] = str_replace( "{descr}", $banned['descr'], $lang['reg_err_23'] );
			} else
				$lang['reg_err_23'] = str_replace( "{descr}", "", $lang['reg_err_23'] );
			
			$stop .= $lang['reg_err_23'];
		}
	}
	
	if( $stop == "" ) {
		$name = strtolower( $name );
		$search_name = strtr( $name, $relates_word );
		
		$row = $db->super_query( "SELECT COUNT(*) as count FROM " . USERPREFIX . "_users WHERE email = '$email' OR LOWER(name) REGEXP '[[:<:]]{$search_name}[[:>:]]' OR name = '$name'" );
		$ipb_test_name = $ipb->super_query ("SELECT COUNT(*) as count FROM {$db_prefix_ipb}members where name = '".strtolower($name)."'");
        if ($ipb_test_name ['count'] > 0) $stop .= $ipb_dle_lan[0];
		
		if( $row['count'] ) $stop .= $lang['reg_err_8'];
	}
	
	return $stop;

}

if( $config['allow_registration'] != "yes" ) {
	
	msgbox( $lang['all_info'], $lang['reg_err_9'] );
	$stopregistration = TRUE;

} elseif( $config['max_users'] > 0 ) {

	$row = $db->super_query( "SELECT COUNT(*) as count FROM " . USERPREFIX . "_users" );

	if ( $row['count'] >= $config['max_users'] ) {	
		msgbox( $lang['all_info'], $lang['reg_err_10'] );
		$stopregistration = TRUE;
	}

}

if( isset( $_POST['submit_reg'] ) ) {
	
	if( $config['allow_sec_code'] == "yes" ) {

		if ($config['allow_recaptcha']) {

			require_once ENGINE_DIR . '/classes/recaptcha.php';
			$sec_code = 1;
			$sec_code_session = false;

			if ($_POST['recaptcha_response_field'] AND $_POST['recaptcha_challenge_field']) {
			
				$resp = recaptcha_check_answer ($config['recaptcha_private_key'],
			                                     $_SERVER["REMOTE_ADDR"],
			                                     $_POST['recaptcha_challenge_field'],
			                                     $_POST['recaptcha_response_field']);
			
			        if ($resp->is_valid) {

						$sec_code = 1;
						$sec_code_session = 1;

			        }
			}

		} else {
			$sec_code = $_POST['sec_code'];
			$sec_code_session = ($_SESSION['sec_code_session'] != '') ? $_SESSION['sec_code_session'] : false;
		}

	} else {
		$sec_code = 1;
		$sec_code_session = 1;
	}
	
	$password1 = $_POST['password1'];
	$password2 = $_POST['password2'];
	$name = $db->safesql( $parse->process( htmlspecialchars( trim( $_POST['name'] ) ) ) );
	$name = preg_replace('#s+#i', ' ', $name);

	$not_allow_symbol = array ("x22", "x60", "t", 'n', 'r', "n", "r", '\', ",", "/", "¬", "#", ";", ":", "~", "[", "]", "{", "}", ")", "(", "*", "^", "%", "$", "<", ">", "?", "!", '"', "'" );
	$email = $db->safesql(trim( str_replace( $not_allow_symbol, '', strip_tags( stripslashes( $_POST['email'] ) ) ) ) );

	$reg_error = check_reg( $name, $email, $password1, $password2, $sec_code, $sec_code_session );
	
	if( ! $reg_error ) {
		
		if( $config['registration_type'] ) {
			
			include_once ENGINE_DIR . '/classes/mail.class.php';
			$mail = new dle_mail( $config );
			
			$row = $db->super_query( "SELECT template FROM " . PREFIX . "_email where name='reg_mail' LIMIT 0,1" );
			
			$row['template'] = stripslashes( $row['template'] );
			
			$idlink = rawurlencode( base64_encode( $name . "||" . $email . "||" . md5( $password1 ) . "||" . md5( sha1( $name . $email . DBHOST . DBNAME . $config['key'] ) ) ) );
			
			$row['template'] = str_replace( "{%username%}", $name, $row['template'] );
			$row['template'] = str_replace( "{%validationlink%}", $config['http_home_url'] . "index.php?do=register&doaction=validating&id=" . $idlink, $row['template'] );
			$row['template'] = str_replace( "{%password%}", $password1, $row['template'] );
			
			$mail->send( $email, $lang['reg_subj'], $row['template'] );
			
			if( $mail->send_error ) msgbox( $lang['all_info'], $mail->smtp_msg );
			else msgbox( $lang['reg_vhead'], $lang['reg_vtext'] );
			
			$_SESSION['sec_code_session'] = false;
			
			$stopregistration = TRUE;
		
		} else {
			
			$doaction = "validating";
			$_REQUEST['id'] = rawurlencode( base64_encode( $name . "||" . $email . "||" . md5( $password1 ) . "||" . md5( sha1( $name . $email . DBHOST . DBNAME . $config['key'] ) ) ) );
		}
	
	} else {
		msgbox( $lang['reg_err_11'], "<ul>" . $reg_error . "</ul>" );
	}

}

if( $doaction != "validating" AND !$stopregistration ) {
	
	if( $_POST['dle_rules_accept'] == "yes" ) {
		
		$_SESSION['dle_rules_accept'] = "1";
	
	}
	
	if( $config['registration_rules'] and ! $_SESSION['dle_rules_accept'] ) {
		
		$_GET['page'] = "dle-rules-page";
		include ENGINE_DIR . '/modules/static.php';
	
	} else {
		
		$tpl->load_template( 'registration.tpl' );
		
		$tpl->set( '[registration]', "" );
		$tpl->set( '[/registration]', "" );
		$tpl->set_block( "'\[validation\](.*?)\[/validation\]'si", "" );
		$path = parse_url( $config['http_home_url'] );
		
		if( $config['allow_sec_code'] == "yes" ) {

			if ( $config['allow_recaptcha'] ) {

				$tpl->set( '[recaptcha]', "" );
				$tpl->set( '[/recaptcha]', "" );

				$tpl->set( '{recaptcha}', '
<script language="javascript" type="text/javascript">
<!--
	var RecaptchaOptions = {
        theme: ''.$config['recaptcha_theme'].'',
        lang: ''.$lang['wysiwyg_language'].''
	};

//-->
</script>
<script type="text/javascript" src="http://www.google.com/recaptcha/api/challenge?k='.$config['recaptcha_public_key'].'"></script>' );

				$tpl->set_block( "'\[sec_code\](.*?)\[/sec_code\]'si", "" );
				$tpl->set( '{reg_code}', "" );

			} else {

				$tpl->set( '[sec_code]', "" );
				$tpl->set( '[/sec_code]', "" );
				$tpl->set( '{reg_code}', "<span id="dle-captcha"><img src="" . $path['path'] . "engine/modules/antibot.php" alt="{$lang['sec_image']}" border="0" /><br /><a onclick="reload(); return false;" href="#">{$lang['reload_code']}</a></span>" );
				$tpl->set_block( "'\[recaptcha\](.*?)\[/recaptcha\]'si", "" );
				$tpl->set( '{recaptcha}', "" );
			}

		} else {

			$tpl->set( '{reg_code}', "" );
			$tpl->set( '{recaptcha}', "" );
			$tpl->set_block( "'\[sec_code\](.*?)\[/sec_code\]'si", "" );
			$tpl->set_block( "'\[recaptcha\](.*?)\[/recaptcha\]'si", "" );
		}
		
		$tpl->copy_template = "<form  method="post" name="registration" onsubmit="if (!check_reg_daten()) {return false;};" id="registration" action="" . $config['http_home_url'] . "index.php?do=register">n" . $tpl->copy_template . "
<input name="submit_reg" type="hidden" id="submit_reg" value="submit_reg" />
</form>";
		
		$tpl->copy_template .= <<<HTML
<script language='javascript' type="text/javascript">
<!--
function reload () {

	var rndval = new Date().getTime(); 

	document.getElementById('dle-captcha').innerHTML = '<img src="{$path['path']}engine/modules/antibot.php?rndval=' + rndval + '" border="0" width="120" height="50" alt="" /><br /><a onclick="reload(); return false;" href="#">{$lang['reload_code']}</a>';

};
function check_reg_daten () {

	if(document.forms.registration.name.value == '') {

		DLEalert('{$lang['reg_err_30']}', dle_info);return false;

	}

	if(document.forms.registration.password1.value.length < 6) {

		DLEalert('{$lang['reg_err_31']}', dle_info);return false;

	}

	if(document.forms.registration.password1.value != document.forms.registration.password2.value) {

		DLEalert('{$lang['reg_err_32']}', dle_info);return false;

	}

	if(document.forms.registration.email.value == '') {

		DLEalert('{$lang['reg_err_33']}', dle_info);return false;

	}

return true;

};
//-->
</script>
HTML;
		$tpl->compile( 'content' );
		$tpl->clear();
	
	}

}

if( isset( $_POST['submit_val'] ) ) {
	
	$fullname = $db->safesql( $parse->process( $_POST['fullname'] ) );
	$land = $db->safesql( $parse->process( $_POST['land'] ) );
	$icq = intval( str_replace("-", "", $_POST['icq'] ) );
	if( $icq < 1 ) $icq = "";
	$info = $db->safesql( $parse->BB_Parse( $parse->process( $_POST['info'] ), false ) );
	
	$image = $_FILES['image']['tmp_name'];
	$image_name = $_FILES['image']['name'];
	$image_size = $_FILES['image']['size'];
	$image_name = str_replace( " ", "_", $image_name );
	$img_name_arr = explode( ".", $image_name );
	$type = totranslit( end( $img_name_arr ) );

	if( stripos ( $image_name, "php" ) !== false ) die("Hacking attempt!");	

	$user_arr = explode( "||", base64_decode( @rawurldecode( $_POST['id'] ) ) );

	if( $user_arr[0] == "" OR  $user_arr[2]== "" ) die("Hacking attempt!");

	$user = $db->safesql( trim( $user_arr[0] ) );
	$email = $db->safesql( trim( $user_arr[1] ) );
	$pass = md5( $user_arr[2] );

	if( md5( sha1( $user . $email . DBHOST . DBNAME . $config['key'] ) ) != $user_arr[3] ) die( 'ID not valid!' );

	if( preg_match( "/[||'|<|>|[|]|"|!|?|$|@|/|\|&~*{+]/", $user ) ) die( 'USER not valid!' );

	$row = $db->super_query( "SELECT * FROM " . USERPREFIX . "_users WHERE name = '$user' AND password='$pass'" );
	
	if( !$row['user_id'] ) die("Access Denied!");
	
	$db->free();
	
	if( is_uploaded_file( $image ) and ! $stop ) {

		if( intval( $user_group[$member_id['user_group']]['max_foto'] ) > 0 ) {
		
			if( $image_size < 100000 ) {
				
				$allowed_extensions = array ("jpg", "png", "jpe", "jpeg", "gif" );
				
				if( in_array( $type, $allowed_extensions ) AND $image_name ) {
					
					include_once ENGINE_DIR . '/classes/thumb.class.php';
					
					$res = @move_uploaded_file( $image, ROOT_DIR . "/uploads/fotos/" . $row['user_id'] . "." . $type );
					
					if( $res ) {

						@chmod( ROOT_DIR . "/uploads/fotos/" . $row['user_id'] . "." . $type, 0666 );
						$thumb = new thumbnail( ROOT_DIR . "/uploads/fotos/" . $row['user_id'] . "." . $type );
						$thumb->size_auto( $user_group[$config['reg_group']]['max_foto'] );
						$thumb->jpeg_quality( $config['jpeg_quality'] );
						$thumb->save( ROOT_DIR . "/uploads/fotos/foto_" . $row['user_id'] . "." . $type );
						
						@unlink( ROOT_DIR . "/uploads/fotos/" . $row['user_id'] . "." . $type );
						$foto_name = "foto_" . $row['user_id'] . "." . $type;
						
						$db->query( "UPDATE " . USERPREFIX . "_users SET foto='$foto_name' WHERE user_id='{$row['user_id']}'" );
					
					} else
						$stop = $lang['reg_err_12'];
				} else
					$stop = $lang['reg_err_13'];
			} else
				$stop = $lang['news_err_16'];
		} else
			$stop .= $lang['news_err_32'];

	}
	
	if( intval( $user_group[$member_id['user_group']]['max_info'] ) > 0 and dle_strlen( $info, $config['charset'] ) > $user_group[$member_id['user_group']]['max_info'] ) $stop .= $lang['reg_err_14'];
	if( dle_strlen( $fullname, $config['charset'] ) > 100 ) $stop .= $lang['reg_err_15'];
	if( dle_strlen( $land, $config['charset'] ) > 100 ) $stop .= $lang['reg_err_16'];
	if( strlen( $icq ) > 20 ) $stop .= $lang['reg_err_17'];
	if( $parse->not_allowed_tags ) $stop .= $lang['news_err_34'];

	if ( preg_match( "/[||'|<|>|"|!|]|?|$|@|/|\|&~*+]/", $fullname ) ) {

		$stop .= $lang['news_err_35'];
	}

	if ( preg_match( "/[||'|<|>|"|!|]|?|$|@|/|\|&~*+]/", $land ) ) {

		$stop .= $lang['news_err_36'];
	}
	
	if( $stop ) {
		msgbox( $lang['reg_err_18'], $stop );
	} else {
		
		$xfieldsaction = "init";
		$xfieldsadd = true;
		$xfieldsid = "";
		include (ENGINE_DIR . '/inc/userfields.php');
		$filecontents = array ();
		
		if( ! empty( $postedxfields ) ) {
			foreach ( $postedxfields as $xfielddataname => $xfielddatavalue ) {
				if( ! $xfielddatavalue ) {
					continue;
				}
				
				$xfielddatavalue = $db->safesql( $parse->BB_Parse( $parse->process( $xfielddatavalue ), false ) );
				
				$xfielddataname = $db->safesql( $xfielddataname );
				
				$xfielddataname = str_replace( "|", "|", $xfielddataname );
				$xfielddatavalue = str_replace( "|", "|", $xfielddatavalue );
				$filecontents[] = "$xfielddataname|$xfielddatavalue";
			}
			
			$filecontents = implode( "||", $filecontents );
		} else
			$filecontents = '';
		
		$db->query( "UPDATE " . USERPREFIX . "_users SET fullname='$fullname', info='$info', land='$land', icq='$icq', xfields='$filecontents' WHERE user_id='{$row['user_id']}'" );
		
		msgbox( $lang['reg_ok'], $lang['reg_ok_1'] );
		
		$stopregistration = TRUE;
	}
}

if( $doaction == "validating" AND !$stopregistration AND !$_POST['submit_val'] ) {
	
	$user_arr = explode( "||", base64_decode( @rawurldecode( $_REQUEST['id'] ) ) );
	
	$regpassword = md5( $user_arr[2] );
	$name = trim( $db->safesql( htmlspecialchars( $parse->process( $user_arr[0] ) ) ) );

	$not_allow_symbol = array ("x22", "x60", "t", 'n', 'r', "n", "r", '\', ",", "/", "¬", "#", ";", ":", "~", "[", "]", "{", "}", ")", "(", "*", "^", "%", "$", "<", ">", "?", "!", '"', "'" );
	$email = $db->safesql(trim( str_replace( $not_allow_symbol, '', strip_tags( stripslashes( $user_arr[1] ) ) ) ) );
	
	if( md5( sha1( $name . $email . DBHOST . DBNAME . $config['key'] ) ) != $user_arr[3] ) die( 'ID not valid!' );

	$name = preg_replace('#s+#i', ' ', $name);	
	$reg_error = check_reg( $name, $email, $regpassword, $regpassword );
	
	if( $reg_error != "" ) {
		msgbox( $lang['reg_err_11'], $reg_error );
		$stopregistration = TRUE;
	} else {
		
		if( ($_REQUEST['step'] != 2) and $config['registration_type'] ) {
			$stopregistration = TRUE;
			$lang['confirm_ok'] = str_replace( '{email}', $email, $lang['confirm_ok'] );
			$lang['confirm_ok'] = str_replace( '{login}', $name, $lang['confirm_ok'] );
			msgbox( $lang['all_info'], $lang['confirm_ok'] . "<br /><br /><a href="" . $config['http_home_url'] . "index.php?do=register&doaction=validating&step=2&id=" . rawurlencode( $_REQUEST['id'] ) . "">" . $lang['reg_next'] . "</a>" );
		} else {
			
			$add_time = time() + ($config['date_adjust'] * 60);
			$_IP = $db->safesql( $_SERVER['REMOTE_ADDR'] );
			if( intval( $config['reg_group'] ) < 3 ) $config['reg_group'] = 4;
			
			$db->query( "INSERT INTO " . USERPREFIX . "_users (name, password, email, reg_date, lastdate, user_group, info, signature, favorites, xfields, logged_ip) VALUES ('$name', '$regpassword', '$email', '$add_time', '$add_time', '" . $config['reg_group'] . "', '', '', '', '', '" . $_IP . "')" );
			$ipb_dle = new ipb_dle;
            $salt = $ipb_dle->generate_password_salt(5);
            $salt = addslashes($salt);
            $ph = $ipb_dle->generate_compiled_passhash($salt, md5($_POST['password1']) );
            $insert_ipb = $ipb->insert_id(); //ид вставки
            $member_key = $ipb_dle->generate_auto_log_in_key();
            $key_expire = $member_key * 60 * 60 * 24;
            $ipb->query("INSERT INTO `{$db_prefix_ipb}members` (
            member_id,
            name,
            members_l_username,
            members_display_name,
            members_l_display_name,
            members_seo_name,
            member_login_key,
            member_login_key_expire,
            email,
            member_group_id,
            joined,
            ip_address,
            time_offset,
            allow_admin_mails,
            language,
            msg_show_notification,
            members_auto_dst,
            members_pass_hash,
            members_pass_salt
            )
            VALUES (
            0,
            '$name',
            '".strtolower($name)."',
            '$name',
            '".strtolower($name)."',
            '".strtolower($name)."',
            '".$ipb_dle->generate_auto_log_in_key()."',
            '$key_expire',
            '$email',
            '3',
            '".time()."',
            '$_IP',
            '3',
            '1',
            '1',
            '1',
            '0',
            '$ph',
            '$salt'
            )");
            $ipb_st = $ipb->super_query("select * from {$db_prefix_ipb}cache_store where cs_key = 'stats'");
            $st_arr  = unserialize($ipb_st['cs_value']);
            $st_arr['mem_count']++;
            $st_arr['last_mem_name'] = $name;
            $st_arr['last_mem_id'] = $insert_ipb;
            $st_arr2 = serialize($st_arr);
            $ipb->query("UPDATE {$db_prefix_ipb}cache_store set cs_value = '$st_arr2' where cs_key = 'stats'");
			$id = $db->insert_id();
			
			set_cookie( "dle_user_id", $id, 365 );
			set_cookie( "dle_password", $user_arr[2], 365 );
			
			$_SESSION['dle_user_id'] = $id;
			$_SESSION['dle_password'] = $user_arr[2];
		
		}
	
	}

}

if( $doaction == "validating" and ! $stopregistration ) {
	
	$tpl->load_template( 'registration.tpl' );
	
	$tpl->set( '[validation]', "" );
	$tpl->set( '[/validation]', "" );
	$tpl->set_block( "'\[registration\].*?\[/registration\]'si", "" );
	
	$xfieldsaction = "list";
	$xfieldsadd = true;
	include (ENGINE_DIR . '/inc/userfields.php');
	$tpl->set( '{xfields}', $output );

	$_REQUEST['id'] = htmlspecialchars( $_REQUEST['id'], ENT_QUOTES );

	$tpl->copy_template = "<form  method="post" name="registration" enctype="multipart/form-data" action="" . $PHP_SELF . "">n" . $tpl->copy_template . "
<input name="submit_val" type="hidden" id="submit_val" value="submit_val" />
<input name="do" type="hidden" id="do" value="register" />
<input name="doaction" type="hidden" id="doaction" value="validating" />
<input name="id" type="hidden" id="id" value="{$_REQUEST['id']}" />
</form>";
	
	$tpl->compile( 'content' );
	$tpl->clear();
}
class ipb_dle
{
    function generate_password_salt($len=5)
    {
        $salt = '';

        for ( $i = 0; $i < $len; $i++ )
        {
            $num   = rand(33, 126);

            if ( $num == '92' )
            {
                $num = 93;
            }

            $salt .= chr( $num );
        }

        return $salt;
    }

    function generate_compiled_passhash($salt, $md5_once_password)
    {
        return md5( md5( $salt ) . $md5_once_password );
    }
?>

Примерно вот так нужно было показать схему БД. Чтобы понимать как у тебя связаны таблицы между собой.
Изображение

А то, что у тебя во всех таблицах есть user_id это не беда. Беда в простом понимании связей между таблицами.
Легче же соображать, когда у тебя связь между HistoryBalance и (Person / User) прописана вот так.
Модель HistoryBalance и две примерные связи

Код: Выделить всё

public function getUser() {
        return $this->hasOne(User::className(), ['user_id' => 'user_id']);
}
public function getPerson() {
        return $this->hasOne(Person::className(), ['person_id' => 'person_id']);
}

Т.е. у тебя в модели HistoryBalance сохраняется user_id или person_id для связи с пользователем/человеком.

Внутри модели User связь с HistoryBalance

Код: Выделить всё

public function getHistoryBalance() {
        return $this->hasMany(HistoryBalance::className(), ['user_id' => 'user_id']);
}

Внутри модели Person связь с HistoryBalance

Код: Выделить всё

public function getHistoryBalance() {
        return $this->hasMany(HistoryBalance::className(), ['person_id' => 'person_id']);
}

Для того, чтобы можно было выбрать всю историю баланса Person или User.

Тебе бы переделать БД по хорошему. Переделать первичные ключи в соответствии с названием таблицы, т.е. таблица User PK (primary key — первичный ключ) — user_id, таблица Person PK — person_id, таблица HistoryBalance PK — historybalance_id. Переделать связи в моделях.
А то в скором времени у тебя будут не очень приятные запросы в твоих search.

Твоя первоначальная задача решается несколькими путями, первый и самый простой чтобы проверить будет ли у тебя выводить информацию сделали через findHistoryBalanceByUser($id) в модели HistoryBalance.
1. делается find() из HistoryBalance
2. указывается joinWith(‘person’, false, ‘LEFT JOIN’) с таблицей пользователя (ты ведь открыл Person — View, а там в $model->id указан id пользователя из модели Person)
3. указывается условие where([‘person_id’ => $id]), говорит о том, что нужно выбрать все записи с конкретным пользователем.
4. указывается сортировка orderBy
5. устанавливается лимит limit(30)
6. т.к. возврат записей, то прописываем all(), если бы возвращался запрос то ничего не прописывали бы.

Более долгий, но всё равно нужно правильная база данных.
Берем HistoryBalanceSearch в search дописываем дополнительный параметр $id.
Примерно вот так в PersonController

Код: Выделить всё

public function actionView($id)
    {
        $model = $this->findModel($id)// поиск твоей модели
        $searchModel  = new  HistoryBalanceSearch;
	$dataProvider = $searchModel->search(Yii::$app->getRequest()->get(), $id);

        return $this->render('view', [
            'model' => $model,
            'dataProvider' => $dataProvider,
            'searchModel' => $searchModel,
        ]);
    }

Внутри модели HistoryBalanceSearch было бы

Код: Выделить всё

public function search($params, $id = 0)
    {
        $query = HistoryBalance::find();

	if(0 < $id){
	$query
	->joinWith('person', false, 'LEFT JOIN')
	->where(['person_id' => $id])
	->orderBy(['historybalance_id' => SORT_DESC])
	->limit(30);
	}
	
        // add conditions that should always apply here

        $dataProvider = new ActiveDataProvider([
            'query' => $query,
        ]);

        $this->load($params);

        if (!$this->validate()) {
            // uncomment the following line if you do not want to return any records when validation fails
            // $query->where('0=1');
            return $dataProvider;
        }

        // grid filtering conditions
        $query->andFilterWhere([
            'user_id' => $this->user_id,
            'balance' => $this->balance,
            'credit' => $this->credit,
            'balance_up' => $this->balance_up,
            'credit_up' => $this->credit_up,
            'created_at' => $this->created_at,
        ]);

        $query->andFilterWhere(['ilike', 'type', $this->type])
            ->andFilterWhere(['ilike', 'comment', $this->comment]);

        return $dataProvider;
    }

А дальше как я говорил с ListView

Код: Выделить всё

<?= ListView::widget([
	'dataProvider' => $dataProvider,
	'pager' => [
		'hideOnSinglePage' => true,
		'firstPageLabel' => Yii::t('main', 'First'),
		'lastPageLabel'  => Yii::t('main', 'Last'),
	],
	'itemView' => '_history_balance',
	'layout' => '<div class="box box-solid"><div class="box-header"><div class="pull-right">{summary}</div></div></div><div class="row">{items}</div>{pager}',
])?>

Создаешь своё представление (файл view со своими примерным именем _history_balance.php) в котором у тебя будет отрисовка информации, которая будет приходить по от контроллера $dataProvider.
Вроде бы понятно объяснил. Спрашивай конкретные вопросы, что не понял.

SyntaxError — это ошибка, которая легко может ввести в ступор начинающего программиста. Стоит забыть одну запятую или не там поставить кавычку и Python наотрез откажется запускать программу. Что ещё хуже, по выводу в консоль сложно сообразить в чём дело. Выглядят сообщения страшно и непонятно. Что с этим делать — не ясно. Вот неполный список того, что можно встретить:

  • SyntaxError: invalid syntax
  • SyntaxError: EOL while scanning string literal
  • SyntaxError: unexpected EOF while parsing

Эта статья о том, как справиться с синтаксической ошибкой SyntaxError. Дочитайте её до конца и получите безотказный простой алгоритм действий, что поможет вам в трудную минуту — ваш спасательный круг.

Работать будем с программой, которая выводит на экран список учеников. Её код выглядит немного громоздко и, возможно, непривычно. Если не всё написанное вам понятно, то не отчаивайтесь, чтению статьи это не помешает.


students = [
    ['Егор', 'Кузьмин'],
    ['Денис', 'Давыдов'],
]

for first_name, last_name in students:
    label = 'Имя ученика: {first_name} {last_name}'.format(
        first_name = first_name
        last_name = last_name
    )

    print(label)

Ожидается примерно такой результат в консоли:

$ python script.py
Имя ученика: Егор Кузьмин
Имя ученика: Денис Давыдов

Но запуск программы приводит к совсем другому результату. Скрипт сломан:

$ python script.py
  File "script.py", line 9
    last_name = last_name
            ^
SyntaxError: invalid syntax

Ошибки в программе бывают разные и каждой нужен свой особый подход. Первым делом внимательно посмотрите на вывод программы в консоль. На последней строчке написано SyntaxError: invalid syntax. Если эти слова вам не знакомы, то обратитесь за переводом к Яндекс.Переводчику:

SyntaxError: недопустимый синтаксис
SyntaxError: неверный синтаксис

Первое слово SyntaxError Яндекс не понял. Помогите ему и разделите слова пробелом:

Syntax Error: invalid syntax
Синтаксическая ошибка: неверный синтаксис

Теория. Синтаксические ошибки

Программирование — это не магия, а Python — не волшебный шар. Он не умеет предсказывать будущее, у него нет доступа к секретным знаниями, это просто автомат, это программа. Узнайте как она работает, как ищет ошибки в коде, и тогда легко найдете эффективный способ отладки. Вся необходимая теория собрана в этом разделе, дочитайте до конца.

SyntaxError — это синтаксическая ошибка. Она случается очень рано, еще до того, как Python запустит программу. Вот что делает компьютер, когда вы запускаете скрипт командой python script.py:

  1. запускает программу python
  2. python считывает текст из файла script.py
  3. python превращает текст программы в инструкции
  4. python исполняет инструкции

Синтаксическая ошибка SyntaxError возникает на четвёртом этапе в момент, когда Python разбирает текст программы на понятные ему компоненты. Сложные выражения в коде он разбирает на простейшие инструкции. Вот пример кода и инструкции для него:

person = {'name': 'Евгений'}

Инструкции:

  1. создать строку 'Евгений'
  2. создать словарь
  3. в словарь добавить ключ 'name' со значением 'Евгений'
  4. присвоить результат переменной person

SyntaxError случается когда Python не смог разбить сложный код на простые инструкции. Зная это, вы можете вручную разбить код на инструкции, чтобы затем проверить каждую из них по отдельности. Ошибка прячется в одной из инструкций.

1. Найдите поломанное выражение

Этот шаг сэкономит вам кучу сил. Найдите в программе сломанный участок кода. Его вам предстоит разобрать на отдельные инструкции. Посмотрите на вывод программы в консоль:

$ python script.py
  File "script.py", line 9
    last_name = last_name
            ^
SyntaxError: invalid syntax

Вторая строчка сообщает: File "script.py", line 9 — ошибка в файле script.py на девятой строчке. Но эта строка является частью более сложного выражения, посмотрите на него целиком:

label = 'Имя ученика: {first_name} {last_name}'.format(
    first_name = first_name
    last_name = last_name
)

2. Разбейте выражение на инструкции

В прошлых шагах вы узнали что сломан этот фрагмент кода:

label = 'Имя ученика: {first_name} {last_name}'.format(
    first_name = first_name
    last_name = last_name
)

Разберите его на инструкции:

  1. создать строку 'Имя ученика: {first_name} {last_name}'
  2. получить у строки метод format
  3. вызвать функцию с двумя аргументами
  4. результат присвоить переменной label

Так выделил бы инструкции программист, но вот Python сделать так не смог и сломался. Пора выяснить на какой инструкции нашла коса на камень.

Теперь ваша задача переписать код так, чтобы в каждой строке программы исполнялось не более одной инструкции из списка выше. Так вы сможете тестировать их по отдельности и облегчите себе задачу. Так выглядит отделение инструкции по созданию строки:

# 1. создать строку
template = 'Имя ученика: {first_name} {last_name}'

label = template.format(
    first_name = first_name
    last_name = last_name
)

Сразу запустите код, проверьте что ошибка осталась на прежнему месте. Приступайте ко второй инструкции:

# 1. создать строку
template = 'Имя ученика: {first_name} {last_name}'

# 2. получить у строки метод
format = template.format

label = format(
    first_name = first_name
    last_name = last_name
)

Строка format = template.format создает новую переменную format и кладёт в неё функцию. Да, да, это не ошибка! Python разрешает класть в переменные всё что угодно, в том числе и функции. Новая переменная переменная format теперь работает как обычная функция, и её можно вызвать: format(...).

Снова запустите код. Ошибка появится внутри format. Под сомнением остались две инструкции:

  1. вызвать функцию с двумя аргументами
  2. результат присвоить переменной label

Скорее всего, Python не распознал вызов функции. Проверьте это, избавьтесь от последней инструкции — от создания переменной label:

# 1. создать строку
template = 'Имя ученика: {first_name} {last_name}'

# 2. получить у строки метод
format = template.format

# 3. вызвать функцию
format(
    first_name = first_name
    last_name = last_name
)

Запустите код. Ошибка снова там же — внутри format. Выходит, код вызова функции написан с ошибкой, Python не смог его превратить в инструкцию.

3. Проверьте синтаксис вызова функции

Теперь вы знаете что проблема в коде, вызывающем функцию. Можно помедитировать еще немного над кодом программы, пройтись по нему зорким взглядом еще разок в надежде на лучшее. А можно поискать в сети примеры кода для сравнения.

Запросите у Яндекса статьи по фразе “Python синтаксис функции”, а в них поищите код, похожий на вызов format и сравните. Вот одна из первых статей в поисковой выдаче:

  • Функции в Python

Уверен, теперь вы нашли ошибку. Победа!

Понравилась статья? Поделить с друзьями:
  • Syntax error unexpected parseop zero
  • Syntax error unexpected main expecting
  • Syntax error unexpected integer number
  • Syntax error unexpected expecting как исправить
  • Syntax error unexpected expecting yii