在语法环境中使用尖括号

在语法环境中使用尖括号

如何<>在语法环境中使用角括号?

我想描述我的编程语言支持以下结构:

List<int> myList = new List<int>();
List<List<int>> myList2 = new List<List<int>>();
Set<int> mySet = new Set<int>();
Bag<int> myBag = new MyBag<int>();
Array<int> myArray = new Array<int>();

因此,我使用语法环境来描述可能的结构:

\begin{grammar}
<collection_parameter_decl> ::= <ident> 
\alt 'List' '<' <collection_parameter_decl> '>' 
\alt 'Bag' '<' <collection_parameter_decl> '>' 
\alt 'Set' '<' <collection_parameter_decl> '>' 
\alt 'Array' '<' <collection_parameter_decl> '>'
\end{grammar}

不幸的是,我的编程语言中使用了尖括号,同时语法环境也使用它们来判断什么是 token。因此,整个代码的格式很丑陋:

在此处输入图片描述

答案1

我真的不知道答案应该是什么样的,但我确实注意到\char60可以代替来<获取字符的非解释版本。我在这里将其编入名为的宏中\?

\documentclass[12pt]{article}
\usepackage[T1]{fontenc}
\usepackage{syntax}
\newcommand\?{\char60}
\begin{document}
\begin{grammar}
<collection_parameter_decl> ::= \?ident> 
\alt 'List' '\?' <collection_parameter_decl> '>' 
\alt 'Bag' '\?' <collection_parameter_decl> '>' 
\alt 'Set' '\?' <collection_parameter_decl> '>' 
\alt 'Array' '\?' <collection_parameter_decl> '>'
\end{grammar}
\end{document}

示例代码的输出

答案2

假设您的引号始终是平衡的并且不包含尖括号中的元变量,您可以调整grammar

\documentclass[12pt]{article}
\usepackage[T1]{fontenc}
\usepackage{syntax}
\usepackage{etoolbox}

\AtBeginEnvironment{grammar}{%
  \begingroup\lccode`~=`'\lowercase{\endgroup\let~}\grammarquote
  \catcode`'=\active
}
\let\normallt=<
\begingroup
\catcode`'=\active
\catcode`<=\active
\gdef\grammarquote#1'{\begingroup\let<\normallt\rq#1\rq\endgroup}
\endgroup

\begin{document}

\begin{grammar}
<collection_parameter_decl> ::= <ident>
\alt 'List' '<' <collection_parameter_decl> '>'
\alt 'Bag' '<' <collection_parameter_decl> '>'
\alt 'Set' '<' <collection_parameter_decl> '>'
\alt 'Array' '<' <collection_parameter_decl> '>'
\end{grammar}

\end{document}

这个想法是将其'变成一个活动字符,吸收下一个字符之前的所有内容',并在定义之后对其进行排版<(在内部处于活动状态grammar)以产生一个正常<符号。

在此处输入图片描述

相关内容