4
A
回答
2
AFAIK另一種語言,存在一種用於R.
沒有解析器生成然而,用戶創建packages in R(又名 「擴展名」),可以用Java,C或Fortran的(和R,當然)。所以,你可以使用Lex/Yacc和Bison(在C的情況下)或者JavaCC或ANTLR(用於Java)來創建用於您的語言的詞法分析器和解析器和使用那些在你的R代碼裏面。
-1
AFAIK,有作爲R源代碼YACC語法文件。 查看這些文件,
R-2.15.2\src\main\gram.y
R-2.15.2\src\main\gramLatex.y
R-2.15.2\src\main\gramRd.y
但我不知道,如果這些文件是建立在官方版本......
2
見qmrparser包上CRAN 。
4
我開發RLY名爲蟒蛇簾布層的克隆。您可以在CRAN找到它:
library(rly)
TOKENS = c('NAME', 'NUMBER')
LITERALS = c('=','+','-','*','/', '(',')')
Lexer <- R6Class("Lexer",
public = list(
tokens = TOKENS,
literals = LITERALS,
t_NAME = '[a-zA-Z_][a-zA-Z0-9_]*',
t_NUMBER = function(re='\\d+', t) {
t$value <- strtoi(t$value)
return(t)
},
t_ignore = " \t",
t_newline = function(re='\\n+', t) {
t$lexer$lineno <- t$lexer$lineno + nchar(t$value)
return(NULL)
},
t_error = function(t) {
cat(sprintf("Illegal character '%s'", t$value[1]))
t$lexer$skip(1)
return(t)
}
)
)
Parser <- R6Class("Parser",
public = list(
tokens = TOKENS,
literals = LITERALS,
# Parsing rules
precedence = list(c('left','+','-'),
c('left','*','/'),
c('right','UMINUS')),
# dictionary of names
names = new.env(hash=TRUE),
p_statement_assign = function(doc='statement : NAME "=" expression', p) {
self$names[[as.character(p$get(2))]] <- p$get(4)
},
p_statement_expr = function(doc='statement : expression', p) {
cat(p$get(2))
cat('\n')
},
p_expression_binop = function(doc="expression : expression '+' expression
| expression '-' expression
| expression '*' expression
| expression '/' expression", p) {
if(p$get(3) == '+') p$set(1, p$get(2) + p$get(4))
else if(p$get(3) == '-') p$set(1, p$get(2) - p$get(4))
else if(p$get(3) == '*') p$set(1, p$get(2) * p$get(4))
else if(p$get(3) == '/') p$set(1, p$get(2)/p$get(4))
},
p_expression_uminus = function(doc="expression : '-' expression %prec UMINUS", p) {
p$set(1, -p$get(3))
},
p_expression_group = function(doc="expression : '(' expression ')'", p) {
p$set(1, p$get(3))
},
p_expression_number = function(doc='expression : NUMBER', p) {
p$set(1, p$get(2))
},
p_expression_name = function(doc='expression : NAME', p) {
p$set(1, self$names[[as.character(p$get(2))]])
},
p_error = function(p) {
if(is.null(p)) cat("Syntax error at EOF")
else cat(sprintf("Syntax error at '%s'", p$value))
}
)
)
lexer <- rly::lex(Lexer)
parser <- rly::yacc(Parser)
while(TRUE) {
cat('calc > ')
s = readLines(file("stdin"), n=1)
if(s == 'exit') break
parser$parse(s, lexer)
}
相關問題
- 1. 使用lex和yacc
- 2. jison中的%lex和/ lex行是什麼?
- 3. 執行使用lex和yacc工具開發的c文件時出錯
- 4. 用於table_schema和table_name關係的工具
- 5. 用於JavaScript和Python的構建工具
- 6. R中的內存分析 - 用於彙總的工具
- 7. 用於布爾計算的Lex/Yacc
- 8. 的R - 具有低於
- 9. 什麼工具用於C/C++和CI?
- 10. 工具用於混淆HTML和CSS
- 11. 用於UI的硒工具
- 12. 用於XCode的T4工具
- 13. 用於彈簧和休眠應用的逆向工程工具
- 14. 用於Linux命令行的語法與yacc和lex
- 15. 用於高效基於Web的開發的工具和技術
- 16. 類似於nodemon的工具,用於perl
- 17. Lex和Yacc和EBNF規範
- 18. 使用Lex和Alexa的區別
- 19. 無法使用Parse :: Lex解析:: Lex
- 20. R工具閃亮:: runApp()
- 21. O/R映射工具ASP
- 22. R工具兼容apache hadoop
- 23. 案例工具可用於
- 24. 將R和Ubuntu用於crontabs
- 25. 用R和選擇器小工具進行網絡抓取
- 26. 使用用於Java的構建工具
- 27. 用於擴展摺疊工具欄的透明工具欄
- 28. 用於.NET開發的命令行工具(或同等工具)
- 29. 用於執行Java Web服務的測試工具工具
- 30. 像iFinBox和iExplorer的實用工具X的實用工具
http://stackoverflow.com/questions/5705564/is-there-an-existing-antlr-or-irony:下面使用的
例-grammar-for-r – NickD
這是關於定義R語法的語法。我認爲海報想要在R中編寫一些其他語言的解析器。 – Spacedman
準確!如果我要使用R來實現另一個解釋器,解析工具是否存在? – adamo