Разбор Swift с ANTLR 4.7: необходимо разобрать фрагменты в строковых литералах

avatar
roywax
9 мая 2018 в 18:45
86
1
1

Я анализирую код swift с помощью парсера antlr 4.7. В g4 токен Interpolated_string_literal определяется следующим образом:

Interpolated_string_literal : '"' Interpolated_text_item* '"' ;
fragment
Interpolated_text_item
  : '\\(' (Interpolated_string_literal | Interpolated_text_item)+ ')' // nested strings allowed
  | Quoted_text_item
  ;

Моя проблема в том, что мне нужно, чтобы синтаксический анализатор знал о компонентах интерполированного текстового элемента. Я понимаю, что, поскольку он определяется как фрагмент, это не может работать. Поэтому я предположил, что если я удалю ключевое слово фрагмента, все будет в порядке. НО, после его удаления я начинаю получать много ошибок, таких как:

строка 9:6 посторонний ввод ' ' ожидание {'for', 'in', 'var', 'typealias', 'struct', 'class', 'enum', 'protocol', 'func ', 'get', 'set', 'willSet', 'didSet', 'мутирующий', 'немутирующий', 'косвенный', 'префикс', 'оператор', 'постфикс', 'инфикс', 'приоритет', 'ассоциативность', 'левая', 'правая', 'нет', 'удобство', 'динамический', 'конечный', 'ленивый', 'необязательный', 'переопределить', 'обязательный', 'непринадлежащий', 'слабый ', 'Протокол', 'Тип', Идентификатор, '.', '<', '>', '!', '?', '&', '-', '=', '|', '/ ', '+', '', '%', '^', '~', Operator_head_other} строка 11:5 нет подходящей альтернативы при вводе 'класс' строка 9:6 посторонний ввод ' ' ожидание {'for', 'in', 'var', 'typealias', 'struct', 'class', 'enum', 'protocol', 'func', 'get', 'set', 'willSet', 'didSet', 'мутирующий', 'немутирующий', 'косвенный', 'префикс', 'оператор', 'постфикс', 'инфикс', 'приоритет', 'ассоциативность', 'левый ', 'правильно', 'нет', 'удобство', 'динамический', 'конечный', 'ленивый', 'необязательный', 'переопределить', 'обязательный', 'не принадлежащий', 'слабый', 'протокол', 'Тип', Идентификатор, '.', '<', '>', '!', '?', '&', '-', '=', '|', '/', '+', '', '%', '^', '~', Operator_head_other}

Я не понимаю, почему изменение этого фрагмента на токен вызвало все эти ошибки. Есть ли зацепки?

Это код с первыми ошибками:

import UIKit
import CoreData
import CoreLocation
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, CLLocationManagerDelegate {
    var window: UIWindow?
    var locManager: CLLocationManager?

Спасибо,

Рой

Источник

Ответы (1)

avatar
Ajay Sant
10 мая 2018 в 05:40
0

Я вижу, ошибка говорит extraneous input ' ' есть ли правило для обработки пустых пространств? Если нет, можете ли вы попробовать добавить в грамматику следующее для обработки пустых пространств и проверить, имеет ли это какое-либо значение.

SPACE:    [ \t\r\n]+    -> channel(HIDDEN);
roywax
10 мая 2018 в 06:44
0

Привет @ajay-sant, я хочу уточнить, эти ошибки появились только тогда, когда я удалил ключевое слово «фрагмент» из Interpolated_text_item, когда я попытался сделать его токеном, который увидит парсер. Так что раньше проблем с местами не было.