Usando o C ++ 11 regex para capturar o conteúdo de um arquivo de gramática livre de contexto

Prefácio

Eu estou tentando escrever minha própria especificação de gramática livre de contexto, para associar com as regras do meu lexer / parser. Destina-se a ser semelhante ao deANTLR's, onde os identificadores de letras maiúsculas classificam como uma regra Lexer e os identificadores de letras minúsculas classificam como uma regra do Analisador. Destina-se a aceitar qualquer combinação de literais de cadeia e / ou expressões regulares para regras de léxico, e qualquer combinação de regras de lexer / regex e / ou outros identificadores de analisador para regras de analisador. Cada regra em é o formato de<identificador>: <expressão>;

Aqui está um exemplo da 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

O problema que estou tendo é a capacidade de combinar as strings de expressão, já que seu conteúdo tende a variar.
Eu escrevi originalmente:
([a-zA-Z0-9_]*)(?:\s*)(?:\:)(?:\s*)((?:\'?).*(?:\'?)(?:\;))
como a regra de correspondência, que faz tudo bem para uma expressão literal de cadeia única cercada por aspas simples, mas eu preciso expandir isso para permitir vários literais de cadeia não-vorazes e instruções combinadas separadas por qualquer número de espaço em branco. Eu não estou preocupado com a correspondência de regex em potencial dentro de uma expressão combinada, ou mesmo a captura de partes segregadas da expressão, pois isso é tratado mais tarde por uma operação de regex separada, então eu realmente precisovalidar identificadores e expressões ...

Contudo, Eu preciso da operação regex_search para examinar o conteúdo da gramática, usando a seguinte sintaxe para correspondências:

Um identificador válido, começando com uma ou mais letras maiúsculas ou minúsculas, opcionalmente seguido por qualquer número de caracteres alfanuméricos (que opcionalmente pode conter qualquer número de caracteres de sublinhado no meio, desde que o identificador não inicie ou termine com um).Qualquer número de caracteres em branco, guias, novas linhas etc, sem capturá-lo.Dois pontos sem capturá-lo.Qualquer número de caracteres em branco, guias, novas linhas etc, sem capturá-lo.Pelo menos um dos: (em qualquer ordem) qualquer número de literais de cadeia de caracteres (entre aspas simples, sem capturar as aspas), qualquer número de identificadores de lexers / analisadores, qualquer número de expressões regulares (entre colchetes). O resultado dessa regra de correspondência deve capturar a expressão inteira como uma única string, que depois passará por um estágio de pós-processamento.Qualquer número de caracteres em branco, guias, novas linhas etc, sem capturá-lo.Um ponto e vírgula opcionalmente seguido por qualquer espaço em branco não capturado.Opcionalmente, qualquer número de espaços não capturados seguidos por um único comentário de linha capturadoQualquer número de caracteres em branco, guias, novas linhas etc, sem capturá-lo.Questão

É possível colocar isso em uma única operação regex_search?
Eu mexi emExpresso e simplesmente não consigo acertar ...

Atualizar

Até agora, consegui apresentar o seguinte:

#/////////////////////
# 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 você pode ver, eu tenhoidentificadores, separadores eextremidades de linha funcionando perfeitamente. Mas as expressões são onde estou totalmente preso!

Como posso dizer a biblioteca regex que eu queroOU um literal de string não-ganancioso,OU qualquer conjunto de caracteres antes do fim da linha,E qualquer número deles em qualquer ordem?

Mesmo se eu permitisse apenas uma única string literal, como eu diria"A cota simples de fechamento NÃO é opcional se a primeira existir"?

questionAnswers(1)

yourAnswerToTheQuestion