1

Тема: признавайтесь хто майстер лексерів та регулярок

признавайтесь хто майстер регулярок та працював з лексерами?

уже декілька днів пробую написати лексера для побудови ast щоб перетворювати bbcodes -> html

користуюсь leex, erlang
зажовується частина тегів, точніше - смайлики

на скільки я розумію - проблема в жадності регулярок

Прихований текст

зміна

[^\[]+

на

[^\[]+?

нічого не принесла

код і "кривий результат" --
https://gist.github.com/221V/ddc9ba7175 … 7b095a6c15

підкажіть будь-ласка де я туплю і як цей код виправити?
регулярки ніколи не були моєю сильною стороною)

дякую

Подякували: 0xDADA11C71

2 Востаннє редагувалося 221VOLT (09.01.2018 18:52:31)

Re: признавайтесь хто майстер лексерів та регулярок

мені відповіли таке

Robert Virding
Creator of Erlang

When multiple rules match leex is defined to return the longest matching pattern. If there is more than one pattern with the same length it will return the first one. This is the same as in lex, on which leex is based.

і ще таке

In your definitions you have

%L = [A-za-zА-Яа-я0-9.]

which is a very loose regex. When leex processes your text it looks for the longest match as Robert indicated. It turns out that this regex will match the entire string you submitted since the rule

%{L}+ : {token, {any_text, TokenLen, TokenChars}}.

will match the entire string. As the longest match it will return that. You can test it in iex with:

iex(1)> r = ~r/[A-za-zА-Яа-я0-9.]+/
~r/[A-za-zА-Яа-я0-9.]+/
iex(2)> Regex.match? r, "test:ninja::Otest:alien:"
true

Test against your regex's you'll see that

[^\[]+

also matches the entire string.

If I can make a suggestion - separate tokenising (leex) from parsing (yecc), You are trying to do too much I think, which makes it more complicated.

A simple (but incomplete) tokeniser which can process your test string follows. T

Definitions.

Tag        = [a-z]
OpenTag    = \[
CloseTag   = \]
Emoticon   = :

Rules.

:\)      : {token, {smile, 1}}.
8-\)     : {token, {smile, 4}}.
:'\( : {token, {smile, 5}}.
:ermm:   : {token, {smile, 6}}.
:D       : {token, {smile, 7}}.
<3    : {token, {smile, 8}}.
:\(      : {token, {smile, 9}}.
:O       : {token, {smile, 10}}.
:P       : {token, {smile, 11}}.
;\)      : {token, {smile, 12}}.

{OpenTag} : {token, {open_tag, TokenLine, TokenChars}}.
{Tag}+ : {token, {tag, TokenLine, TokenChars}}.
{CloseTag} : {token, {close_tag, TokenLine, TokenChars}}.
{Emoticon}{Tag}+{Emoticon} : {token, {emoticon, TokenLine, TokenChars}}.

Erlang code.

Robert Virding
Creator of Erlang

Note one thing: the regular expressions in leex and Regex are not the same. Regex supports the full perl regexs, it implemented internal in :re module which uses the PCRE library, while leex only allows a more limited set. A major benefit of the leex regexs, which are the same as in lex, is that they never need to backtrack which the perl ones do. With PCRE you can easily define a simple regex which will take a long long time to match, for example check here The :re module gets around this by putting a limit on how long the match is allowed to take before giving up.

------

допоможіть роздуплитися? *SCRATCH*

3 Востаннє редагувалося Altair8800 (09.01.2018 14:02:45)

Re: признавайтесь хто майстер лексерів та регулярок

221VOLT написав:

уже декілька днів пробую написати лексера для побудови ast щоб перетворювати bbcodes -> html

Не знаю що таке лексери і з ерглантом не знайомий, але раз ви намагаєтесь замінити [] на <>, то на джаваскрипті це буде так:

str.replace(/\[/g/, '<');

Що у вас:

[^\[]+?

^ - може позначати початок рядка або всі крім наступного символу ( [^a] - будь-який символ, крім "а"). У вашій регулярці це другий випадок, тому виносьте ^ за квадратні дужки, якщо він позначає початок рядку.
Ще спробуйте помістити регулярку в круглі дужки (), бо зазвичай шукає тільки те, що в дужках.

4

Re: признавайтесь хто майстер лексерів та регулярок

Якщо не впевнені в регулярках, перевіряйте себе на онлайн-сервісах, таких як цей https://regexr.com/

5

Re: признавайтесь хто майстер лексерів та регулярок

Altair8800 написав:
str.replace(/\[/g/, '<');

І привіт експлойти в коментах. І добре, якщо усе завершиться безневинним дефейсом.
Якщо уже робити bb-коди, то робити стійкий до кулхацкерів парсинг.

Подякували: 0xDADA11C7, cheappi386, /KIT\, 221VOLT, leofun015

6 Востаннє редагувалося 221VOLT (09.01.2018 18:30:11)

Re: признавайтесь хто майстер лексерів та регулярок

Altair8800 написав:
221VOLT написав:

уже декілька днів пробую написати лексера для побудови ast щоб перетворювати bbcodes -> html

Не знаю що таке лексери і з ерглантом не знайомий, але раз ви намагаєтесь замінити [] на <>, то на джаваскрипті це буде так:

str.replace(/\[/g/, '<');

Що у вас:

[^\[]+?

^ - може позначати початок рядка або всі крім наступного символу ( [^a] - будь-який символ, крім "а"). У вашій регулярці це другий випадок, тому виносьте ^ за квадратні дужки, якщо він позначає початок рядку.
Ще спробуйте помістити регулярку в круглі дужки (), бо зазвичай шукає тільки те, що в дужках.

лексер будує ast - абстрактне синтаксичне дерево

ні, я не намагаюсь замінити [] на <>
я намагаюсь побудувати ast,
і що і як потім робитиму з отриманим списком - то уже окреме питання


[^\[]+?

все, окрім символу відкриваючої квадратної дужки


і ні, ця частина добре працює,
ви помиляєтесь

-----

Altair8800 написав:

Якщо не впевнені в регулярках, перевіряйте себе на онлайн-сервісах, таких як цей https://regexr.com/

приїхали) я на таких сервісах живу, коли хоть якусь регулярку пишу))


-----

моє останнє прохання було - допоможіть поради правильно на українську перекласти :[

7

Re: признавайтесь хто майстер лексерів та регулярок

загалом трохи з іншої опери,
та також про лексери, тому просто залишу тут:

https://github.com/DoctorWkt/acwj

http://www.stephendiehl.com/llvm/

http://releases.llvm.org/9.0.0/docs/tut … Impl1.html

http://releases.llvm.org/9.0.0/docs/tut … mpl01.html

Подякували: leofun011

8

Re: признавайтесь хто майстер лексерів та регулярок

%L = [A-za-zА-Яа-я0-9.]

Як воно поводить себе з кирилицею та що воно важає кирилицею я не знаю, але гадаю що в латиниці помилка - треба A-Z

Подякували: 221VOLT, leofun012

9

Re: признавайтесь хто майстер лексерів та регулярок

221VOLT написав:

признавайтесь хто майстер регулярок та працював з лексерами?

уже декілька днів пробую написати лексера для побудови ast щоб перетворювати bbcodes -> html

користуюсь leex, erlang
зажовується частина тегів, точніше - смайлики

на скільки я розумію - проблема в жадності регулярок

Прихований текст

зміна

[^\[]+

на

[^\[]+?

нічого не принесла

код і "кривий результат" --
https://gist.github.com/221V/ddc9ba7175 … 7b095a6c15

підкажіть будь-ласка де я туплю і як цей код виправити?
регулярки ніколи не були моєю сильною стороною)

дякую

А що ви хочете саме зробити напишіть конкретно може можна то за допомогою пітончика зробити?

Подякували: 221VOLT1

10 Востаннє редагувалося koala (08.01.2020 18:40:07)

Re: признавайтесь хто майстер лексерів та регулярок

pluszz написав:
221VOLT написав:

пробую написати лексера для побудови ast щоб перетворювати bbcodes -> html
користуюсь leex, erlang

А що ви хочете саме зробити напишіть конкретно

А що тут неконкретного? Ви якихось слів не розумієте? То погугліть.

pluszz написав:

може можна то за допомогою пітончика зробити?

Очевидно, що можна, але в умові названа інша мова. Ви колись бачили вираз "повнота за Тюрінгом"?

Подякували: 221VOLT1

11 Востаннє редагувалося 221VOLT (08.01.2020 18:38:50)

Re: признавайтесь хто майстер лексерів та регулярок

0xDADA11C7 написав:

%L = [A-za-zА-Яа-я0-9.]

Як воно поводить себе з кирилицею та що воно важає кирилицею я не знаю, але гадаю що в латиниці помилка - треба A-Z

1 -- все після знаку % в ерлангу -- коментар
2 -- ця описка-очепятка не обов'язково є помилкою --
я точно не пригадую, чи діапазон A-z є A-Z + a-z, чи навпаки -- a-z + A-Z = a-Z

здається, перше все ж таки вірно,
відповідно, у такому записі просто є зайвим інструкція-конструкція a-z після A-z

upd. думаю, згідно діапазону таблиць ansi/utf8, в залежності від вказаного кодування:
(коди символів)

$ erl
Erlang/OTP 22 [erts-10.4] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]

Eshell V10.4  (abort with ^G)
1> $a.
97
2> $A.
65
3> $z.
122
4> $Z.
90
5> $а.
1072
6> $А.
1040
7> $я.
1103
8> $Я.
1071
9> io:format("~w~n",[<<"аАяЯ"/utf8>>]).
<<208,176,208,144,209,143,208,175>>

pluszz написав:

А що ви хочете саме зробити напишіть конкретно може можна то за допомогою пітончика зробити?

звичайно, дякую вам за увагу)
але ви не звернули увагу на дату створення цієї теми)

3 -- я давно уже забив на лексери в рішенні тої задачі,
і давно переписав на паттернг матчинг

(і пайтон мені не потрібен для такої задачі, коли у мене є ерланг)

дивіться:
версія з лексерами, січень 2018
https://github.com/221V/bbcodes_to_html_1

версія на паттерн матчингу, серпень 2018
https://github.com/221V/bbcodes_to_html_2

зараз у нас січень 2020 :)

посилання я сюди запостив вчора не тому,
що тема лексера в контексті першої задачі для мене є актуальною,
а тому, що по посиланнях -- написання лексера-парсера з нуля, при написанні власної мови програмування
погодьтесь, семантично ця тема підходить для того, щоб тут поділитись такими посиланнями :)


upd.

Прихований текст

mr. koala знову приписує mr. 221V слова, які він не говорив, не писав  :D
https://i.imgur.com/2fRvDS4.png
я не писав ні про якого пітончика  :D

Прихований текст

жартую - сміюсь, не нервуйтесь))

Подякували: pluszz1

12 Востаннє редагувалося koala (08.01.2020 18:42:16)

Re: признавайтесь хто майстер лексерів та регулярок

Між A та z також є символи на кшталт [_].

Прихований текст

Дякую, виправив. Не той quote скопіював.

Подякували: 221VOLT1

13 Востаннє редагувалося pluszz (08.01.2020 18:43:06)

Re: признавайтесь хто майстер лексерів та регулярок

koala написав:
pluszz написав:
221VOLT написав:

пробую написати лексера для побудови ast щоб перетворювати bbcodes -> html
користуюсь leex, erlang

А що ви хочете саме зробити напишіть конкретно

А що тут неконкретного? Ви якихось слів не розумієте? То погугліть.

221VOLT написав:

може можна то за допомогою пітончика зробити?

Очевидно, що можна, але в умові названа інша мова. Ви колись бачили вираз "повнота за Тюрінгом"?

Ні мені все зрозуміло. Просто на мою думку можавзяти зробити словничок на пiтонi{ bbcodes:html  } .

Подякували: 221VOLT1

14

Re: признавайтесь хто майстер лексерів та регулярок

pluszz написав:

Ні мені все зрозуміло. Просто на мою думку можавзяти зробити словничок на пiтонi{ bbcodes:html  } .

та все ок)
просто у мене сайт на ерланг,
+ написати велосипед з нуля мені в радість,
а тягнути іншу мову заради дрібниці -- це таке собі.. тут мені не підходить))

15

Re: признавайтесь хто майстер лексерів та регулярок

221VOLT написав:
pluszz написав:

Ні мені все зрозуміло. Просто на мою думку можавзяти зробити словничок на пiтонi{ bbcodes:html  } .

та все ок)
просто у мене сайт на ерланг,
+ написати велосипед з нуля мені в радість,
а тягнути іншу мову заради дрібниці -- це таке собі.. тут мені не підходить))

Ні просто я подумав що то для одноразової перегонки даних з якоїсь дошки оголошень в html.

Подякували: 221VOLT1

16

Re: признавайтесь хто майстер лексерів та регулярок

знайшов дещо цікаве, де в тому числі є про erlang leex yeec
https://groupoid.github.io/languages/Cubical.htm

справжнім математикам форуму може бути цікавим цей матеріал :)

Подякували: leofun011