Можа выклікі функцый экстрагаваць рэгулярны выраз

У пэўным прыкладзе, я хачу, каб атрымаць выклікі функцый у уваходнай радка (рубінавы скрыпт), каб зрабіць некаторыя статыстычныя дадзеныя (у Java). Для прыкладу уводу:

Math.sqrt(2-Math.hypot((3),4))-factorial(5)

Я хачу, каб атрымаць спіс <магчымых кодавых /> функцый, якія выкарыстоўваюцца (праверка не павінна быць 100% дакладным, і ён можа ўключаць у сябе некаторыя дадатковыя дэфектныя здагадкі):

{ Math.sqrt, Math.hypot, factorial }

Спіс не павінен быць адчувальны да рэгістра, але ён павінен ўключаць у сябе шлях класа функцыі, калі ён існуе.

Я паспрабаваў наіўнасці спрошчаным "* \\ ((. *) \\)" , але я не мог прымусіць яго працаваць. Здаецца, што мне трэба выкарыстоўваць lookaheads або зваротную спасылку, але я трохі збянтэжаны. Маё пытанне, я магу нават зрабіць гэта?

1
Там павінен быць Рубі парсер ног аб
дададзена аўтар David Heffernan, крыніца

4 адказы

No. You cannot should not (see edit below) do this.

Рэгулярныя выразы могуць адпавядаць толькі рэгулярныя мовы, але дужка () ўзгадненне патрабуецца ў адпаведнасці выклікаў функцый, так як могуць быць укладзеныя такія выразы, як ((1+ 2) * 3) у функцыя выкліку. Рэгулярныя выразы не могуць мець справу з укладзенымі дужкамі.

To learn more about regular languages and the limits of regular expressions, see Regular Expressions (wikipedia)

To solve your particular problem, you might be interested in the following resources, which recommend importing the ruby script and using reflection (wikipedia)


Edit: If all you want is the function name it is possible that you might get regex to work. However:

  • ёсць і іншыя праблемныя выпадкі. Напрыклад, што б вы зрабілі, калі функцыя выклікана? канструктар?
  • , калі вы хочаце, каб ачысціць больш інфармацыі (напрыклад, аргументы, перададзеныя ў) вам прыйдзецца адмовіцца ад праекту і пачаць усё спачатку.
3
дададзена

Для прыкладу, мадэль:

(?:\\w+\\.)?\\w+(?=\\()

дае вынік, які вы хочаце, але гэта не будзе дасканалым, я ўпэўнены. Калі хуткі, але грубы вынік таго, што вы пасля гэтага, гэта можа быць!

2
дададзена
Дзякуй за прыклад.
дададзена аўтар Margus, крыніца

Вы можаце паспрабаваць, але вы сутыкнецеся з многімі пытаннямі ў спробе разабраць складаную граматыку з дапамогай інструмента, які не павінен быў зрабіць гэта. колькасці выпадкаў вам трэба будзе пакрыць абочыны на бясконцым, так як стан і папярэднія маркеры заўсёды імпартаваць у мове праграмавання.

0
дададзена

Так, законна рашэнне гэтай праблемы было б цяжка, калі вы ўжо мелі досвед працы з граматык і іншым. Тым не менш, хуткі і брудны (і, магчыма, недасканалы) рашэнне можа быць здзяйсняльна.

Вось мае думкі ... Я не ведаю, Ruby, так што я не ўпэўнены, калі я нешта адсутнічае. Там няма неабходнасці, каб адпавядаць дужку ... якая адкрывае дужкай «(» ёсць толькі адзін, што сапраўды мае значэнне, пры ўмове, што праграма не мае ніякіх сінтаксічных памылак. Вы можаце знайсці наступны радок

"[A-Za-z_][.A-Za-z_0-9+]*("

У большасці моў, функцыі пачынаюцца з літарай або сімвалам падкрэслення і вынікаюць нуль ці больш некосмического без адмысловых знакаў знака. Менавіта гэты выраз захоплівае. Яна будзе працаваць на вашым прыкладзе. Вядома, было б вяртаць дублікаты (якія могуць быць uniqued) і знайшлі б рэчы ўнутры каментароў, але як хуткі і брудны раствор яно павінна быць у парадку.

0
дададзена