tests/testthat/test.lex_variable.R

#! /usr/bin/env Rscript

library(testthat)
library(rly)

library(testthat)
library(rly)

context("re as variable")

re_PLUS <- '\\+'
re_MINUS <- '-'
re_TIMES <- '\\*'
re_DIVIDE <- '/'
re_EQUALS <- '='
re_LPAREN <- '\\('
re_RPAREN <- '\\)'
re_NAME <- '[a-zA-Z_][a-zA-Z0-9_]*'
re_NUMBER <- '\\d+'
re_ignore <- " \t"
re_newline <- '\\n+'

Lexer <- R6::R6Class("Lexer",
  public = list(
    msg = NA,

    tokens = c('NAME','NUMBER', 'PLUS','MINUS','TIMES','DIVIDE','EQUALS', 'LPAREN','RPAREN'),
    t_PLUS = re_PLUS,
    t_MINUS = re_MINUS,
    t_TIMES = re_TIMES,
    t_DIVIDE = re_DIVIDE,
    t_EQUALS = re_EQUALS,
    t_LPAREN = re_LPAREN,
    t_RPAREN = re_RPAREN,
    t_NAME = re_NAME,
    t_NUMBER = function(re = re_NUMBER, t) {
      t$value <- strtoi(t$value)
      return(t)
    },
    t_ignore = re_ignore,
    t_newline = function(re = re_newline, t) {
      t$lexer$lineno <- t$lexer$lineno + nchar(t$value)
      return(NULL)
    },
    t_error = function(t) {
      self$msg <- sprintf("Illegal character '%s'", t$value[1])
      t$lexer$skip(1)
      return(t)
    }
  )
)

test_that("calclex: +", {
  lexer <- rly::lex(Lexer)
  lexer$input("5 + 3")
  expect_equal(lexer$token()$value, 5)
  expect_equal(lexer$token()$value, "+")
  expect_equal(lexer$token()$value, 3)
})

test_that("calclex: *", {
  lexer <- rly::lex(Lexer)
  lexer$input("x * y")
  expect_equal(lexer$token()$value, "x")
  expect_equal(lexer$token()$value, "*")
  expect_equal(lexer$token()$value, "y")
})

test_that("calclex: without spaces", {
  lexer <- rly::lex(Lexer)
  lexer$input("(x+y)*4")
  expect_equal(lexer$token()$value, "(")
  expect_equal(lexer$token()$value, "x")
  expect_equal(lexer$token()$value, "+")
  expect_equal(lexer$token()$value, "y")
  expect_equal(lexer$token()$value, ")")
  expect_equal(lexer$token()$value, "*")
  expect_equal(lexer$token()$value, 4)
})

test_that("calclex: new lines", {
  lexer <- rly::lex(Lexer)

  lexer$input("x\n\ny")
  expect_equal(lexer$token()$value, "x")
  expect_equal(lexer$token()$lineno, 3)

  lexer$input("x

  y")
  expect_equal(lexer$token()$value, "x")
  expect_equal(lexer$token()$lineno, 5)
})

test_that("calclex: error", {
  lexer <- rly::lex(Lexer)

  lexer$input("x?y")
  expect_equal(lexer$token()$value, "x")
  lexer$token()
  expect_equal(lexer$instance$msg, "Illegal character '?'")
  expect_equal(lexer$token()$value, "y")
})

Try the rly package in your browser

Any scripts or data that you put into this service are public.

rly documentation built on May 8, 2022, 5:05 p.m.