晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
| DIR:/opt/alt/ruby33/share/ruby/syntax_suggest/ |
| Current File : //opt/alt/ruby33/share/ruby/syntax_suggest/explain_syntax.rb |
# frozen_string_literal: true
require_relative "left_right_lex_count"
if !SyntaxSuggest.use_prism_parser?
require_relative "ripper_errors"
end
module SyntaxSuggest
class GetParseErrors
def self.errors(source)
if SyntaxSuggest.use_prism_parser?
Prism.parse(source).errors.map(&:message)
else
RipperErrors.new(source).call.errors
end
end
end
# Explains syntax errors based on their source
#
# example:
#
# source = "def foo; puts 'lol'" # Note missing end
# explain ExplainSyntax.new(
# code_lines: CodeLine.from_source(source)
# ).call
# explain.errors.first
# # => "Unmatched keyword, missing `end' ?"
#
# When the error cannot be determined by lexical counting
# then the parser is run against the input and the raw
# errors are returned.
#
# Example:
#
# source = "1 * " # Note missing a second number
# explain ExplainSyntax.new(
# code_lines: CodeLine.from_source(source)
# ).call
# explain.errors.first
# # => "syntax error, unexpected end-of-input"
class ExplainSyntax
INVERSE = {
"{" => "}",
"}" => "{",
"[" => "]",
"]" => "[",
"(" => ")",
")" => "(",
"|" => "|"
}.freeze
def initialize(code_lines:)
@code_lines = code_lines
@left_right = LeftRightLexCount.new
@missing = nil
end
def call
@code_lines.each do |line|
line.lex.each do |lex|
@left_right.count_lex(lex)
end
end
self
end
# Returns an array of missing elements
#
# For example this:
#
# ExplainSyntax.new(code_lines: lines).missing
# # => ["}"]
#
# Would indicate that the source is missing
# a `}` character in the source code
def missing
@missing ||= @left_right.missing
end
# Converts a missing string to
# an human understandable explanation.
#
# Example:
#
# explain.why("}")
# # => "Unmatched `{', missing `}' ?"
#
def why(miss)
case miss
when "keyword"
"Unmatched `end', missing keyword (`do', `def`, `if`, etc.) ?"
when "end"
"Unmatched keyword, missing `end' ?"
else
inverse = INVERSE.fetch(miss) {
raise "Unknown explain syntax char or key: #{miss.inspect}"
}
"Unmatched `#{inverse}', missing `#{miss}' ?"
end
end
# Returns an array of syntax error messages
#
# If no missing pairs are found it falls back
# on the original error messages
def errors
if missing.empty?
return GetParseErrors.errors(@code_lines.map(&:original).join).uniq
end
missing.map { |miss| why(miss) }
end
end
end
|