Снегопат
https://snegopat.ru/forum/

lexer - я чего-то недопонял?
https://snegopat.ru/forum/viewtopic.php?f=5&t=560
Страница 1 из 1

Автор:  quest [ 28 окт 2013, 23:37 ]
Заголовок сообщения:  lexer - я чего-то недопонял?

простая функция -

function macrosTestLexer(){
var tw = GetTextWindow();
//debugger;
if (!tw) return;

var prgText = tw.text();
var parser = snegopat.parseSources(prgText)
for(var i = 0, c = parser.lexemCount; i < c; i++)
{
var lex = parser.lexem(i)
Message("type = "+lex.type+" text = "+lex.text+" ");
}
}

еще более простой текст на входе
x = "strin1
|strin2";

и неожиданный вывод

type = 27 text = x
type = 12 text = =
type = 2 text = "strin1
type = 2 text = |strin2"
type = 14 text = ;


вопрос - почему строка разбилась на 2?

второе
ввод такой
//@version: Версия 3 (28 октября 2013 г. 23:26:29)
х = новый Структура("Возврат","");
х.Возврат = 1;
Сообщить("х.Возврат = "+х.Возврат);

вывод
type = 1 text = //@version: Версия 3 (28 октября 2013 г. 23:26:29)
type = 27 text = х
type = 12 text = =
type = 56 text = новый
type = 27 text = Структура
type = 8 text = (
type = 2 text = "Возврат"
type = 13 text = ,
type = 2 text = ""
type = 9 text = )
type = 14 text = ;
type = 27 text = х
type = 21 text = .
type = 46 text = Возврат
type = 12 text = =
type = 4 text = 1
type = 14 text = ;
type = 27 text = Сообщить
type = 8 text = (
type = 2 text = "х.Возврат = "
type = 15 text = +
type = 27 text = х
type = 21 text = .
type = 46 text = Возврат
type = 9 text = )
type = 14 text = ;

почему имя поля имеет тип 46? должно же быть 27, ведь после точки не может идти ключевоое слово?

Это можно исправить? если да - то попутно просьба - сделай деление коментов на два - начинающийся с начала строки (любая последовательностей пробелов и табов за которыми идет //) и простой комент который после кода пишеться

И в документации можно поправиь - кроме абревеатууры написать еще и числовое значение типа

а еще небольшой, но неприятный баг. при попытке забобрать код где есть лексема
&УбитьЛексер!
просиходит падение

Автор:  quest [ 28 окт 2013, 23:38 ]
Заголовок сообщения:  Re: lexer - я чего-то недопонял?

забобрать читать как разобрать

Автор:  artbear [ 29 окт 2013, 09:44 ]
Заголовок сообщения:  Re: lexer - я чего-то недопонял?

Полуофф. использование УбитьЛексер убивает лексер, все верно :)

Автор:  orefkov [ 29 окт 2013, 15:09 ]
Заголовок сообщения:  Re: lexer - я чего-то недопонял?

Сразу хочу сказать - лексер это не синтакический анализатор.
Его цель - разбить текст на поток лексем. Он просто не должен помнить, что было до текущей лексемы, тупо выдает все что встретит.
То, что ключевые слова после точки (а если точнее, в качестве имен методов и свойств объекта) допустимы - это уже задача синтакс-анализатора, а не лексера.
Отсюда и по поводу многострочных строк.
В лексере как и в 1С принята парадигма - лексема может размещаться на одной строке.
Поэтому лексером что открытый строковый литерал (не завершающийся кавычкой), что начинающийся с "|" - определяется как обычный строковый литерал.
Дальнейшая их склейка и анализ правильности делается синтакс-анализатором.
Как повод задуматься - в "середине" многострочных литералов вполне возможны комментарии.

Автор:  quest [ 29 окт 2013, 16:13 ]
Заголовок сообщения:  Re: lexer - я чего-то недопонял?

Факт. не учел что могут быть комменты так расположны.
За ответ спасибо,

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/