Правила ANTLR для сопоставления многострочной строки без кавычек или кавычек - PullRequest
0 голосов
/ 16 июня 2020

Я бы хотел, чтобы моя грамматика соответствовала либо назначению однострочной строки, завершающемуся символом новой строки (\ r \ n или \ n), возможно, с комментарием в конце, либо многострочному назначению, обозначенному двойными кавычками . Так, например:

key = value
key = spaces are allowed
key = until a new line or a comment # this is a comment
key = "you can use quotes as well" # this is a comment
key = "and
with quotes 
you can also do 
multiline"

Это выполнимо? Я бился об этом, и все заработало, кроме многострочного. Это кажется таким простым, но правила просто не соответствуют должным образом.

Дополнение: это всего лишь часть большой грамматики.

1 Ответ

0 голосов
/ 16 июня 2020

Глядя на ваш пример ввода:

# This is the most simple configuration
title = "FML rulez"

# We use ISO notations only, so no local styles
releaseDateTime = 2020-09-12T06:34

# Multiline strings
description = "So,
I'm curious 
where this will end."

# Shorcut string; no quotes are needed in a simple property style assignment
# Or if a string is just one word. These strings are trimmed.
protocol = http

# Conditions allow for overriding, best match wins (most conditions)
# If multiple condition sets equally match, the first one will win.
title[env=production] = "One config file to rule them all"
title[env=production & os=osx] = "Even on Mac"

# Lists
hosts = [alpha, beta]

# Hierarchy is implemented using groups denoted by curly brackets
database {

    # indenting is allowed and encouraged, but has no semantic meaning
    url = jdbc://...
    user = "admin"

    # Strings support default encryption with a external key file, like maven
    password = "FGFGGHDRG#$BRTHT%G%GFGHFH%twercgfg"

    # groups can nest
    dialect {
        database = postgres
    }
}

servers {
    # This is a table:
    # - the first row is a header, containing the id's
    # - the remaining rows are values
    | name     | datacenter | maxSessions | settings                    |
    | alpha    | A          | 12          |                             |
    | beta     | XYZ        | 24          |                             |
    | "sys 2"  | B          | 6           |                             |
    # you can have sub blocks, which are id-less groups (id is the column)
    | gamma    | C          | 12          | {breaker:true, timeout: 15} |
    # or you reference to another block
    | tango    | D          | 24          | $environment                |
}

# environments can be easily done using conditions
environment[env=development] {
    datasource = tst
}
environment[env=production] {
    datesource = prd
}

Я бы go для чего-то вроде этого:

grammar TECL;

input_file
 : configs EOF
 ;

configs
 : NL* ( config ( NL+ config )* NL* )?
 ;

config
 : property
 | group
 | table
 ;

property
 : WORD conditions? ASSIGN value
 ;

group
 : WORD conditions? NL* OBRACE configs CBRACE
 ;

conditions
 : OBRACK property ( AMP property )* CBRACK
 ;

table
 : row ( NL+ row )*
 ;

row
 : PIPE ( col_value PIPE )+
 ;

col_value
 : ~( PIPE | NL )*
 ;

value
 : WORD
 | VARIABLE
 | string
 | list
 ;

string
 : STRING
 | WORD+
 ;

list
 : OBRACK ( value ( COMMA value )* )? CBRACK
 ;

ASSIGN : '=';
OBRACK : '[';
CBRACK : ']';
OBRACE : '{';
CBRACE : '}';
COMMA  : ',';
PIPE   : '|';
AMP    : '&';

VARIABLE
 : '$' WORD
 ;

NL
 : [\r\n]+
 ;

STRING
 : '"' ( ~[\\"] | '\\' . )* '"'
 ;

WORD
 : ~[ \t\r\n[\]{}=,|&]+
 ;

COMMENT
 : '#' ~[\r\n]* -> skip
 ;

SPACES
 : [ \t]+ -> skip
 ;

, который проанализирует пример в следующем дереве синтаксического анализа:

enter image description here

И введите:

key = value
key = spaces are allowed
key = until a new line or a comment # this is a comment
key = "you can use quotes as well" # this is a comment
key = "and
with quotes 
you can also do 
multiline"

в следующее:

enter image description here

На данный момент: многострочные кавычки работают, пробелы в строке без кавычек - нет.

Как вы можете видеть в дереве выше, это работает. Я подозреваю, что вы использовали часть грамматики в существующей, и это не работает.

[...] и я процесс, вставляющий действия.

Я бы не стал встраивать действия (целевой код) в вашу грамматику: это затрудняет чтение, и вносить изменения в грамматику будет труднее. И, конечно же, ваша грамматика будет работать только для 1 языка. Лучше использовать listener или visitor вместо этих действий.

Удачи!

...