Class RegexLanguage

java.lang.Object
com.oracle.truffle.api.TruffleLanguage<RegexLanguage.RegexContext>
com.oracle.truffle.regex.RegexLanguage

public final class RegexLanguage extends com.oracle.truffle.api.TruffleLanguage<RegexLanguage.RegexContext>
Truffle Regular Expression Language

This language represents classic regular expressions. It accepts regular expressions in the following format: options/regex/flags, where options is a comma-separated list of key-value pairs which affect how the regex is interpreted (see RegexOptions), and /regex/flags is equivalent to the popular regular expression literal format found in e.g. JavaScript or Ruby.

When parsing a regular expression, TRegex will return a CallTarget, which, when called, will yield one of the following results:

  • a TruffleNull object, indicating that TRegex cannot handle the given regex
  • a RegexObject, which can be used to match the given regex
  • a RegexSyntaxException may be thrown to indicate a syntax error. This exception is an AbstractTruffleException with exception type ExceptionType.PARSE_ERROR.
An example of how to parse a regular expression:
 Object regex;
 try {
     regex = getContext().getEnv().parseInternal(Source.newBuilder("regex", "Flavor=ECMAScript/(a|(b))c/i", "myRegex").mimeType("application/tregex").internal(true).build()).call();
 } catch (AbstractTruffleException e) {
     if (InteropLibrary.getUncached().getExceptionType(e) == ExceptionType.PARSE_ERROR) {
         // handle parser error
     } else {
         // fatal error, this should never happen
     }
 }
 if (InteropLibrary.getUncached().isNull(regex)) {
     // regex is not supported by TRegex, fall back to a different regex engine
 }
 
Regex matcher usage example in pseudocode:
 
 regex = <matcher from previous example>
 assert(regex.pattern == "(a|(b))c")
 assert(regex.flags.ignoreCase == true)
 assert(regex.groupCount == 3)

 result = regex.exec("xacy", 0)
 assert(result.isMatch == true)
 assertEquals([result.getStart(0), result.getEnd(0)], [ 1,  3])
 assertEquals([result.getStart(1), result.getEnd(1)], [ 1,  2])
 assertEquals([result.getStart(2), result.getEnd(2)], [-1, -1])

 result2 = regex.exec("xxx", 0)
 assert(result2.isMatch == false)
 // result2.getStart(...) and result2.getEnd(...) are undefined
 
 
Debug loggers: Loggers.
See Also:
  • Nested Class Summary

    Nested Classes
    Modifier and Type
    Class
    Description
    static final class 
     

    Nested classes/interfaces inherited from class com.oracle.truffle.api.TruffleLanguage

    com.oracle.truffle.api.TruffleLanguage.ContextLocalFactory<C,T>, com.oracle.truffle.api.TruffleLanguage.ContextLocalProvider<C>, com.oracle.truffle.api.TruffleLanguage.ContextPolicy, com.oracle.truffle.api.TruffleLanguage.ContextReference<C>, com.oracle.truffle.api.TruffleLanguage.ContextThreadLocalFactory<C,T>, com.oracle.truffle.api.TruffleLanguage.Env, com.oracle.truffle.api.TruffleLanguage.ExitMode, com.oracle.truffle.api.TruffleLanguage.InlineParsingRequest, com.oracle.truffle.api.TruffleLanguage.LanguageReference<L extends com.oracle.truffle.api.TruffleLanguage>, com.oracle.truffle.api.TruffleLanguage.ParsingRequest, com.oracle.truffle.api.TruffleLanguage.Provider, com.oracle.truffle.api.TruffleLanguage.Registration
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    static final String
     
    static final String
     
    static final String
     
     

    Fields inherited from class com.oracle.truffle.api.TruffleLanguage

    locals
  • Constructor Summary

    Constructors
    Constructor
    Description
     
  • Method Summary

    Modifier and Type
    Method
    Description
    createContext(com.oracle.truffle.api.TruffleLanguage.Env env)
     
    createRegexSource(com.oracle.truffle.api.source.Source source)
     
     
    protected Object
     
    protected boolean
    isThreadAccessAllowed(Thread thread, boolean singleThreaded)
    RegexLanguage is thread-safe - it supports parallel parsing requests as well as parallel access to all AbstractRegexObjects.
    protected com.oracle.truffle.api.CallTarget
    parse(com.oracle.truffle.api.TruffleLanguage.ParsingRequest parsingRequest)
     
    protected boolean
    patchContext(RegexLanguage.RegexContext context, com.oracle.truffle.api.TruffleLanguage.Env newEnv)
     

    Methods inherited from class com.oracle.truffle.api.TruffleLanguage

    areOptionsCompatible, createContextLocal, createContextThreadLocal, disposeContext, disposeThread, exitContext, finalizeContext, finalizeThread, getAsynchronousStackDepth, getCurrentContext, getCurrentLanguage, getLanguageHome, getLanguageView, getOptionDescriptors, initializeContext, initializeMultipleContexts, initializeMultiThreading, initializeThread, isVisible, parse

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

  • Constructor Details

    • RegexLanguage

      public RegexLanguage()
  • Method Details

    • getCachedGroupBoundaries

      public GroupBoundaries[] getCachedGroupBoundaries()
    • parse

      protected com.oracle.truffle.api.CallTarget parse(com.oracle.truffle.api.TruffleLanguage.ParsingRequest parsingRequest)
      Overrides:
      parse in class com.oracle.truffle.api.TruffleLanguage<RegexLanguage.RegexContext>
    • createRegexSource

      public static RegexSource createRegexSource(com.oracle.truffle.api.source.Source source)
    • createContext

      protected RegexLanguage.RegexContext createContext(com.oracle.truffle.api.TruffleLanguage.Env env)
      Specified by:
      createContext in class com.oracle.truffle.api.TruffleLanguage<RegexLanguage.RegexContext>
    • patchContext

      protected boolean patchContext(RegexLanguage.RegexContext context, com.oracle.truffle.api.TruffleLanguage.Env newEnv)
      Overrides:
      patchContext in class com.oracle.truffle.api.TruffleLanguage<RegexLanguage.RegexContext>
    • getScope

      protected Object getScope(RegexLanguage.RegexContext context)
      Overrides:
      getScope in class com.oracle.truffle.api.TruffleLanguage<RegexLanguage.RegexContext>
    • isThreadAccessAllowed

      protected boolean isThreadAccessAllowed(Thread thread, boolean singleThreaded)
      RegexLanguage is thread-safe - it supports parallel parsing requests as well as parallel access to all AbstractRegexObjects. Parallel access to RegexResults objects may lead to duplicate execution of code, but no wrong results.
      Overrides:
      isThreadAccessAllowed in class com.oracle.truffle.api.TruffleLanguage<RegexLanguage.RegexContext>
      Parameters:
      thread - the thread that accesses the context for the first time.
      singleThreaded - true if the access is considered single-threaded, false if more than one thread is active at the same time.
      Returns:
      always true