Uso de C ++ 11 regex para capturar el contenido de un archivo de gramática libre de contexto

Prefacio

Estoy tratando de escribir mi propia especificación de gramática libre de contexto, para asociarme con las reglas de mi lexer / parser. Está destinado a ser similar al deANTLR's, donde los identificadores en mayúsculas se clasifican como una regla de Lexer y los identificadores en minúsculas se clasifican como una regla de analizador. Está destinado a aceptar cualquier combinación de literales de cadena y / o expresiones regulares para las reglas de lexer, y cualquier combinación de reglas de lexer / regex y / u otros identificadores de analizador para las reglas del analizador. Cada regla en es el formato de<identificador>: <expresión>;

Aquí hay un ejemplo de la gramática:

integer      : DIGIT+;        //parser rule containing at least one lexer rule
twodigits    : DIGIT DIGIT;   //parser rule containing two consecutive lexer rules
DIGIT        : [0-9];         //lexer rule containing regex
string       : '"' CHAR* '"'; //parser rule containing zero or more 
                              //  lexer rules, wrapped in two string literals
CHAR         : (LCHAR|UCHAR); //lexer rule containing two lexer rules which
                              //  will later evaluate to one of two tokens
LCHAR        : [a-z];         //lexer rule containing regex
UCHAR        : [A-Z];         //lexer rule containing regex
SPACE        : ' ';           //lexer rule containing string literal


Problema

El problema que tengo es la capacidad de unir las cadenas de expresión, ya que sus contenidos tienden a variar.
Originalmente he escrito:
([a-zA-Z0-9_]*)(?:\s*)(?:\:)(?:\s*)((?:\'?).*(?:\'?)(?:\;))
como la regla de coincidencia, que funciona bien para una expresión literal de una sola cadena rodeada de comillas simples, pero necesito expandirla para permitir múltiples literales de cadenas no codiciosas, y declaraciones combinadas separadas por cualquier número de espacios en blanco. No me interesa la coincidencia de expresiones regulares de expresiones regulares dentro de una expresión coincidente, ni siquiera la captura de partes segregadas de la expresión, ya que esto se maneja más adelante mediante una operación de expresiones regulares separada, así que realmente solo necesitovalidar identificadores y expresiones ...

Considerándolo todo, Necesito la operación regex_search para ver los contenidos de la gramática, usando la siguiente sintaxis para las coincidencias:

Un identificador valido, comenzando con una o más letras minúsculas o mayúsculas, opcionalmente seguidas por cualquier número de caracteres alfanuméricos (que opcionalmente pueden contener cualquier número de caracteres de subrayado intermedio, siempre que el identificador no comience ni termine con uno).Cualquier numero de Caracteres en blanco, tabulaciones, nuevas líneas, etc., sin capturarlos.Un colon Sin capturarlo.Cualquier numero de Caracteres en blanco, tabulaciones, nuevas líneas, etc., sin capturarlos.Al menos uno de: (en cualquier orden) cualquier número de literales de cadena (encerrados entre comillas simples, sin capturar las comillas), cualquier número de identificadores lexer / parser, cualquier número de expresiones regulares (encerrado entre corchetes). El resultado de esta regla de coincidencia debe capturar la expresión completa como una sola cadena, que luego pasará por una etapa de procesamiento posterior.Cualquier numero de Caracteres en blanco, tabulaciones, nuevas líneas, etc., sin capturarlos.Un punto y coma Opcionalmente seguido de cualquier espacio en blanco sin capturar.Opcionalmente, cualquier número de espacios sin capturar seguidos de un solo comentario de línea capturadoCualquier numero de Caracteres en blanco, tabulaciones, nuevas líneas, etc., sin capturarlos.Pregunta

¿Es posible colocar esto en una sola operación regex_search?
Me he metido enExpresso y simplemente parece que no puede hacerlo bien ...

Actualizar

Hasta ahora, he podido llegar a lo siguiente:

#/////////////////////
# Identifier
#/////////////////////
(
    (?:[a-zA-Z]+)           # At least one lower/uppercase letter
    (?:
        (?:[a-zA-Z0-9_]*)   # Zero or more alphanumeric/underscore characters,
        (?:\w+)             # explicitly followed by one or more alphanumeric
    )?                      #   characters
)

#/////////////////////
# Separator
#/////////////////////
(?:\s*)                     # Any amount of uncaptured whitespace
(?:\:)                      # An uncaptured colon
(?:\s*)                     # Any amount of uncaptured whitespace

#///////////////////////
# Expression
#///////////////////////
(
    # String Literals:
    (?:\'?)                 # An optional single quote,
    (?:                     #   which is meant to start and end a string
        (?:[^'\\] | \\.)*   #   literal, but issues several problems for
    )                       #   me (see comments below, after this code block)
    (?:\'?)
    # Other expressions
    # ????????????
)

#/////////////////////
# Line End
#/////////////////////
(?:\s*)                     # Any amount of uncaptured whitespace
(?:\;)                      # An uncaptured colon
(?:\s*)                     # Any amount of uncaptured whitespace

Como puedes ver, tengoidentificadores, separadores yfinales de línea funcionando perfectamente Pero las expresiones son donde estoy totalmente atascado!

¿Cómo puedo decirle a la biblioteca de expresiones regulares que quiero?YA SEA un literal de cuerda no codicioso,O cualquier conjunto de caracteres antes del final de línea,Y ¿Algún número de ellos en cualquier orden?

Incluso si solo permitiera una única cadena literal, ¿cómo diría"La comilla simple de cierre NO es opcional si la primera existe"?

Respuestas a la pregunta(1)

Su respuesta a la pregunta