Preg при подсказке следующей лексемы языка Си показывает имя и следующий символ

Issue #186 closed
Oleg Sychev repo owner created an issue

Originally reported on Google Code with ID 186

res=
или
strcat(

Ищем источник проблемы, он может быть в лексере или коде подсказки, поэтому главный
- я, но помощь в трассировке проблемы до источника приветствуется.

Reported by oasychev on 2013-03-24 21:32:48

Comments (6)

  1. Former user Account Deleted
    Можно, пожалуйста, полный пример того, где это встретилось и название языка (C или C++)?
    Я могу прогнать это через лексер и глянуть, разбилось ли это на две лексемы или склеилось.
    Хотя, скорее всего, дело не в лексере, но лишний раз убедиться не помешает.
    

    Reported by mamontov.dp on 2013-03-25 12:25:35

  2. Oleg Sychev reporter
    Проблема, похоже, в блоке - но она очень странная.
    Если мы посмотрим на return_pos() в лексере, в английском языке для однострочной лексемы,
    то строка выглядит так
    $end_col = $begin_col + strlen($this->yytext()) - 1;
    а для языка Си
    $end_col = $begin_col + strlen($this->yytext());
    
    Очевидно, проблема возникает из этой разницы - тестировал я эту подсказку на английском
    при разработке.
    
    Но вот что странно - почему в CorrectWriting при этом оба языка нормально работают?!
    Поэтому пока не понятен точный источник проблемы и влияние на другой вопрос, я код
    трогать не стал.
    
    Дмитрий, проблема похоже у вас - разберитесь пожалуйста, в чем там дело и почему на
    мой код это влияет, а на ваш - нет. Я бы также подумал о написании родительского класса
    для встроенных лексеров с описанием общего кода, чтобы не было вот таких вот штучек.
    

    Reported by oasychev on 2013-04-04 11:10:07

  3. Former user Account Deleted
    Давайте определимся тогда с вещью, которая не была точно определена при разработке.
    А именно - где находится end_pos() для лексемы. Чтобы она отображалась правильно для
    ошибки в форме, у вас по коду надо было чтобы она указывала на символ следующий за
    последним символом в лексеме. Теперь есть два варианта - оставить также и исправлять
    логику в Preg или сделать, чтобы она указывала на последний символ лексемы и переделывать
    форму.
    P.S. Я не уверен что баг действительно в этом. Все таки все отлично разбирается CorrectWriting
    - юнит-тесты это показывают. Возможно preg игнорирует это.
    

    Reported by mamontov.dp on 2013-04-04 17:19:53

  4. Oleg Sychev reporter
    Так вот я и не понимаю, как так разбирается CorrectWriting, когда смысл end_pos() в
    разных языках - разный... Такого быть не должно в любом случае! И поэтому предлагаю
    вынести соответствующий код в общий базовый класс для встроенных лексеров, чтобы правки
    его не надо было копировать из языка в язык.
    
    Я думаю, что colend должен указывать на последний символ в лексеме - следующего может
    и не быть вообще. И закомментировать надо уже класс позиции тщательно, чтобы разночтений
    в этом смысле не было. Если код в форме CorrectWriting это нарушает - можете его поправить.
    

    Reported by oasychev on 2013-04-06 06:33:30

  5. Oleg Sychev reporter
    Проблема была вызвана разницей в простановке завершающей позиции в разных языках.
    Проблема решена, но вот комментариев в классе позиции не появилось, чтобы больше таких
    проблем не было.
    
    И возможно return_pos() следует все же вынести в базовый класс хардкодового лексера?
    

    Reported by oasychev on 2013-04-13 17:02:17 - Status changed: Fixed

  6. Log in to comment