如何从R中实现的R代码创建令牌

时间:2019-06-18 13:57:14

标签: r lexical-analysis

这是代码:

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

上面的代码是用R编写的。R中是否有可用的工具来提取令牌,因此上面的内容变为:

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

我尝试minilexer将一些简化的R代码拆分为令牌。但是规则真的很简单。我想知道是否有工具已经实现了所有规则,所以我不需要重新发明轮子。

1 个答案:

答案 0 :(得分:3)

您可以使用

从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 lexer。它使用的语法在源代码的gram.y文件中定义。您应该能够从中获得所需的所有信息。最好使用内置的词法分析器,而不是使用一个软件包尝试重新实现内部构建