Парсинг Swift с ANTLR 4.7: нужно разбирать фрагменты в строковых литералах - PullRequest
0 голосов
/ 09 мая 2018

Я анализирую быстрый код с помощью анализатора 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 посторонних входных данных '' ожидающий {'для', 'in', 'var', 'typealias', 'struct', 'class', 'enum', 'protocol', 'func ',' get ',' set ',' willSet ',' didSet ',' mutating ',' nonmutating ',' косвенный ',' prefix ',' operator ',' postfix ',' infix ',' priority ', «ассоциативность», «левый», «правый», «нет», «удобство», «динамический», «окончательный», «ленивый», «необязательный», «переопределить», «обязательный», «неизвестный», «слабый» ',' Protocol ',' Type ', Identifier,'. ',' <','> ','! ','? ',' & ',' - ',' = ',' | ',' / ',' + ',' ','% ',' ^ ',' ~ ', Operator_head_other} строка 11: 5 нет жизнеспособной альтернативы на входе «класс» строка 9: 6 посторонних входных данных '' ожидание {'для', 'in', 'var', 'typealias', 'struct', 'class', 'enum', 'protocol', 'func', 'get', 'set', 'willSet', 'didSet', 'mutating', 'nonmutating', 'косвенный', 'prefix', 'operator', 'postfix', 'infix', 'priority', 'ассоциативность', 'left ',' право ',' нет ',' удобство ',' динамический ',' окончательный ',' ленивый ',' необязательный ',' переопределить ',' обязательный ',' неизвестный ',' слабый ',' протокол ', 'Type', Identifier, '.', '<', '>', '!', '?', '&', '-', '=', '|', '/', '+', '', '%', '^', '~', Operator_head_other}

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

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

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

Спасибо

Рой

1 Ответ

0 голосов
/ 10 мая 2018

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

SPACE:    [ \t\r\n]+    -> channel(HIDDEN);
...