Я использую Whittle gem для анализа языка шаблона и хочу сопоставить все, что не содержится в правиле. Мне хорошо знакомы с другими шаблонами, но это скорее академические упражнения, чем случай производства.Активация условных правил синтаксического анализа
Проблемы я сталкиваюсь, что анализатор игнорирует приоритет :id
выше :raw
и все еще ждет для :raw
тега после {{
.
Как сообщить анализу, что в выражении не разрешено применять правило :raw
и применять правило :spc
внутри выражения?
Parser код
class Parser < Whittle::Parser
# Skip whitespaces (should not apply in :raw)
rule(:spc => /\s+/).skip!
# Various delimiters
rule("{{")^4
rule("}}")^4
rule("{%")^4
rule("%}")^4
rule("|")^4
rule("end")^4
# Defines an id (very large match)
rule(:id => /[a-zA-Z_.$<>=!:]+(\((\w+|\s+|,|")+\))?/)^2
# inline tag
rule(:inline) do |r|
r["{{", :inline_head, "}}"].as { |_,id,_| Tag::Inline.new(id) }
end
# inline tag contents
# allows "|" chaining
rule(:inline_head) do |r|
r[:inline_head, "|", :id].as { |head, _, id| head << id }
r[:id].as { |id| [id] }
r[].as { [] }
end
# block tag
rule(:block) do |r|
r["{%", :block_head, "%}", :all, "{%", "end", "%}"].as { |_,head,_,tags,_,_,_|
Tag::Block.new(head, tags)
}
end
# block tag heading
# separates all the keywords
rule(:block_head) do |r|
r[:block_head, :id].as { |head, id| head << id }
#r[:id].as { |id| [id] }
r[].as { [] }
end
# one rule to match them all
rule(:all) do |r|
r[:all,:inline].as { |all, inline| all << inline }
r[:all, :block].as { |all, block| all << block }
r[:all, :raw].as { |all, raw| all << raw }
r[].as { [] }
end
# the everything but tags rule
rule(:raw => /[^\{\}%]+/).as { |text| Tag::Raw.new(text) }^1
# starting rule
start(:all)
end
И вводимый текст будет и вывод является абстрактным синтаксическим деревом, представленным объектами (они просто хэш как объекты на данный момент).
<html>
<head>
<title>{{ title|capitalize }}</title>
</head>
<body>
<div class="news">
{% for news in articles %}
{{ news.title }}
{{ news.body | limit(100) }}
{{ tags | join(",", name) }}
{% end %}
</div>
</body>
</html>
Woah от самого автора! Я пробую это как можно скорее. Спасибо –
Работал и решил все мои проблемы после нескольких хитростей. Отличный проект! –