Как создать токены из кода R, реализованного в R - PullRequest
2 голосов
/ 18 июня 2019

Это код:

aggregate(results ~ school, FUN = table, data = df)

Вышеприведенный код написан на R. Есть ли какой-либо инструмент, доступный в R, для извлечения токенов, так что выше становится:

FUNC_NAME(DATA ~ DATA, PARA_FUN = DATA, PARA_DATA = DATA)

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

1 Ответ

3 голосов
/ 18 июня 2019

Вы можете получить результаты от лексера R, используя

getParseData(parse(text="aggregate(results ~ school, FUN = table, data = df)"))

#    line1 col1 line2 col2 id parent                token terminal      text
# 27     1    1     1   51 27      0                 expr    FALSE          
# 1      1    1     1    9  1      3 SYMBOL_FUNCTION_CALL     TRUE aggregate
# 3      1    1     1    9  3     27                 expr    FALSE          
# 2      1   10     1   10  2     27                  '('     TRUE         (
# 10     1   11     1   26 10     27                 expr    FALSE          
# 4      1   11     1   17  4      6               SYMBOL     TRUE   results
# 6      1   11     1   17  6     10                 expr    FALSE          
# 5      1   19     1   19  5     10                  '~'     TRUE         ~
# 7      1   21     1   26  7      9               SYMBOL     TRUE    school
# 9      1   21     1   26  9     10                 expr    FALSE          
# 8      1   27     1   27  8     27                  ','     TRUE         ,
# 13     1   29     1   31 13     27           SYMBOL_SUB     TRUE       FUN
# 14     1   33     1   33 14     27               EQ_SUB     TRUE         =
# 15     1   35     1   39 15     17               SYMBOL     TRUE     table
# 17     1   35     1   39 17     27                 expr    FALSE          
# 16     1   40     1   40 16     27                  ','     TRUE         ,
# 20     1   42     1   45 20     27           SYMBOL_SUB     TRUE      data
# 21     1   47     1   47 21     27               EQ_SUB     TRUE         =
# 22     1   49     1   50 22     24               SYMBOL     TRUE        df
# 24     1   49     1   50 24     27                 expr    FALSE          
# 23     1   51     1   51 23     27                  ')'     TRUE         )

Внутренне похоже, что R использует лексер Bison .Используемая грамматика определяется в файле gram.y исходного кода.Вы должны быть в состоянии получить всю необходимую информацию из этого.Лучше полагаться на встроенный лексер, а не пытаться повторно реализовать сборку в одном

пакете
...